Bonne façon de déployer les fichiers de guerre dans l'image docker

Quelle est la façon docker de déployer des projets java dans un conteneur docker?

Dois-je copier de la guerre dans webapps:

FROM jetty:9.2.10
MAINTAINER Me "me@me.com"
ADD ./target/*.war /var/lib/jetty/webapps/ROOT.war

ou dois-je prendre le explosé guerre de fichier:

FROM jetty:9.2.10
MAINTAINER Me "me@me.com"
ADD ./target/app-0.1.0.BUILD-SNAPSHOT /var/lib/jetty/webapps/ROOT

normalement on déploierait le fichier de guerre scellé si c'était un conteneur normal, mais avec docker, cela signifie pousser un fichier de 10-20MB chaque fois que vous faites un petit changement tandis que l'ajout de la guerre explosée ne ferait que pousser la différence - le .fichier de classe a modifié.

y a-t-il des inconvénients à déployer la guerre éclatée au lieu du dossier de guerre?

22
demandé sur Jan Vladimir Mostert 2015-05-15 08:59:30

4 réponses

je me demande comment vous utilisez vos images. Ajouter un fichier de 20 Mo pendant la construction d'une image devrait être presque instantané. Peut-être que vous construisez des images pendant le déploiement, comme AWS le fait quand vous lui donnez un fichier Dockerfile.

dans tous les cas, je pense que cela dépend de la façon dont vous vous déployez. Si vous déplacez les images autour de vous, Je ne vois pas beaucoup de différence entre Ajouter un .dossier de guerre et un répertoire de guerre explosé. Je dirais de faire ce qui est commode pour vous. Toutefois, si vous exécutez l' app de Docker et parfois de A.la guerre (ce qui pourrait manquer le point de menu fixe), vous pourriez aussi bien utiliser le .tout le temps la guerre.

si vous êtes déployé à quelque chose comme AWS Elastic Beanstalk (quelque chose qui tire l'image d'un dépôt), qui veut soit un fichier Dockerfile ou un Dockerrun.aws.le fichier json, puis séparer l'image de ce que vous déployez réellement fait un certain sens (ou il a fait sens pour moi jusqu'ici). Cela permet au conteneur de rester le même, tout en mettant à jour votre application peut être simplement une copie .pot./la guerre de fichier à l'emplacement correct (qui pourrait également manquer une partie de la point de menu fixe ;).

ce que j'ai fait c'est créer une image de base sur Docker Hub et ensuite utiliser le Dockerrun.aws.fichier json à la carte dans mon application. De cette façon, AWS n'a pas besoin de construire mon image, il suffit de la tirer. C'est beaucoup plus rapide et moins coûteux ($). Mais cela sépare mon application de l'image, ce qui pourrait compliquer le déploiement dans certaines circonstances. Cependant, parce que mon image est tellement stable, en général, je fais juste un paquet .jar file, un Dockerrun.aws.JSON et un script shell en un .zip et le télécharger sur AWS. Assez facile je pense.

Mon Dockerfile est assez simple et vraiment tout ce dont j'ai besoin pour mon Ressort de Démarrage de l'application:

FROM java:8
VOLUME /tmp
VOLUME /app
EXPOSE 8080
ENTRYPOINT ["sh","/app/app.sh"]

Vous pouvez faire quelque chose de similaire et utiliser l'option-v, etc. pour la cartographie des volumes de votre application, les paramètres de l'environnement, etc. BTW,cette image est disponible sur Docker Hub.

6
répondu objectuser 2015-05-19 21:08:24

vous devriez en fait toujours déployer les explosifs .guerre.

il y a deux éléments de vitesse à considérer ici:

  1. à quelle vitesse est-il possible de pousser votre image vers un dépôt de conteneurs?

    et

  2. à quelle vitesse une nouvelle instance de mon conteneur peut-elle commencer à servir des requêtes? (important dans un environnement de mise à l'échelle élastique)

La réponse aux deux questions est la même: Vous êtes mieux l'explosion de la .war file lors de la création de votre conteneur et de ne pas copier le .la guerre de fichier.

Cela a deux effets très positifs:

  1. il rend les différences entre les versions de conteneur beaucoup plus petit, et donc votre temps de téléchargement est moins.
  2. cela signifie que, lors de la mise à l'échelle dynamique pour répondre à la demande d'application, vos nouvelles instances de conteneur n'ont pas à décompresser votre .WAR file avant qu'ils puissent commencer à répondre demande.

pour ceux d'entre nous qui sont accablés par des connexions de téléchargement lent, c'est aussi une excellente idée d'utiliser un serveur CI ou même une VM hébergée dans le cloud pour construire et pousser vos images docker vers dockerhub ou un autre registre de conteneurs. De cette façon, vous pouvez profiter des vitesses de téléchargement à l'échelle gigabit.

7
répondu Ryan Kimber 2015-11-25 15:45:44

C'est comment je le fais:

FROM tomcat:8.0
MAINTAINER David Ford <dford@smart-soft.com>
ENV DB_HOST mySqlServer
ENV DB_USER joeBlow
ENV DB_PASSWORD bla bla bla
EXPOSE 8080
RUN rm -fr /usr/local/tomcat/webapps/ROOT
COPY target/webapp /usr/local/tomcat/webapps/ROOT

sur ma liste de choses à faire: séparer le dir WEB_INF/lib dans son propre conteneur.

4
répondu Dave Ford 2016-02-04 22:27:58

Vous pouvez essayer ce: Copier le fichier war dans le conteneur en utilisant la copie Copier le pot Jetty runner dans le conteneur à L'aide de la copie et puis utiliser la commande pour l'exécuter comme ça: ["java -jar /chemin/vers/jetty-coureur.jar /chemin/vers/de l'application.de la guerre"]

http://www.eclipse.org/jetty/documentation/current/runner.html

NOTE: vous devrez avoir java installé dans le conteneur.

1
répondu Yogesh_D 2015-05-15 06:13:07