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
Docker arrêtera toujours le conteneur si aucun processus n'est en attente. Vous devriez 'tail -f server.log' –
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. –
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