2016-11-10 2 views
0

docker doit démarrer l'application java/undertow pendant la phase de construction et il doit être disponible pendant la phase d'exécution. Toutefois, les modifications de conteneur liées au démarrage du serveur Java ne sont pas conservées après le lancement du processus Java.Le conteneur docker ne démarre pas Java en arrière-plan

Les modifications effectuées au cours de cette étape n'ont donc aucun impact sur l'image.

La dernière commande dans mon fichier docker est

RUN java -jar /svc/app/svc-0.0.1-SNAPSHOT.jar $2>server.log & sleep 5 

quand je lance ce conteneur je peux voir que la sortie existe dans le fichier server.log serveur confirmant démarré avec succès

StartServices  - Services Started 

Mais quand je exécutez le conteneur il n'y a pas de service en cours d'exécution. Je peux le démarrer manuellement mais ce n'est pas comme ça que je veux le faire. Je veux que mon serveur soit allumé lorsque le conteneur est en place.

Avis

& sleep 5 

Si je n'attends pas ces 5 secondes, il ne sera pas tout journal créé. Docker abandonnerait cette étape immédiatement sans laisser mon application Java démarrer.

Cependant, même si "sleep 5" permet à mon application de démarrer, docker ignore toujours les changements dans l'image et ne les applique pas. Donc quand je fais "docker run", mon application n'est pas en cours d'exécution.

ici est Dockerfile:

FROM anapsix/alpine-java 
ENV TC_BASE=/opt/tc_base 
ENV APP_BASE=$TC_BASE/svc 
ENV PATH=.:$PATH 


RUN apk update && apk add unzip 


COPY files/build/lib/svc/target/svc-0.0.1-SNAPSHOT-bin.zip $APP_BASE/ 
COPY files/build/lib/api/src/main/resources/api.properties $TC_BASE/conf/api/ 
COPY files/build/lib/svc/src/main/resources/svc.properties $TC_BASE/conf/svc/ 
COPY files/build/lib/svc/src/main/resources/logback.xml $TC_BASE/conf/svc/ 

RUN cd $APP_BASE ; unzip -q svc-0.0.1-SNAPSHOT-bin.zip ; rm svc-0.0.1-SNAPSHOT-bin.zip ; mv svc-0.0.1-SNAPSHOT/* . ; rm -rf svc-0.0.1-SNAPSHOT 

EXPOSE 7009 

RUN java -jar $TC_BASE/svc/app/svc-0.0.1-SNAPSHOT.jar $2>server.log & sleep 5 
+0

Docker arrêtera toujours le conteneur si aucun processus n'est en attente. Vous devriez 'tail -f server.log' –

+0

nous parlons de la construction de l'image. Pendant cette phase, personne ne s'intéresse au journal du serveur. Si je fais tail -f server.log alors le processus de construction ne se terminera jamais. Le processus Java doit être exécuté en arrière-plan dans le cadre de la configuration de l'image. –

+3

Si vous avez besoin de quelque chose à exécuter lorsque le conteneur s'exécute, vous devez le placer dans votre 'ENTRYPOINT' ou 'CMD' (ou une combinaison). Et si cela orchestre et démarre plusieurs choses, alors vous pourriez avoir besoin d'un script entrypoint. Tout cela semble un peu brouillon. Pourquoi avez-vous besoin de plusieurs choses en cours d'exécution dans le conteneur? – johnharris85

Répondre

1

Eh bien, il devrait être ENTRYPOINT pas RUN. Entrypoint est invoqué quand le conteneur démarre et c'est ce dont j'ai besoin. RUN est exécuté au cours de la construction mais n'affecte que le système de fichiers. L'image Docker ne contient pas l'état d'exécution de l'application, donc lorsque l'image est créée, elle ne contient pas d'informations sur l'application qui a été démarrée. Pour démarrer les applications, elles doivent être définies comme ENTRYPOINT