web-dev-qa-db-fra.com

Démarrer automatiquement les services dans le conteneur Docker

Je fais quelques premiers tests avec Docker. En ce moment j'ai mes images et je peux mettre quelques containers en marche, avec:

docker ps

Je fais docker attach container_id et démarrez le service Apache2.

Ensuite, à partir de la console principale, je valide le conteneur sur l'image.

Après avoir quitté le conteneur, si j'essaie de démarrer le conteneur ou d'exécuter un nouveau conteneur à partir de l'image validée, le service est toujours arrêté.

Comment créer ou redémarrer un conteneur avec les services démarrés, par exemple apache?

12
Pedro

EDIT: J'ai beaucoup appris sur Docker depuis la publication de cette réponse. "Démarrer des services automatiquement dans des conteneurs Docker" n'est pas un bon modèle d'utilisation pour Docker. À la place, utilisez quelque chose comme flotte , Kubernetes , ou même Monit/SystemD/Upstart/Init.d/Cron pour démarrer automatiquement les services qui s'exécutent à l'intérieur des conteneurs Docker.

RÉPONSE ORIGINALE: Si vous démarrez le conteneur avec la commande /bin/bash, alors vous pouvez accomplir cela de la manière décrite ici: https://stackoverflow.com/a/19872810/2971199

Donc, si vous démarrez le conteneur avec docker run -i -t IMAGE /bin/bash et si vous souhaitez démarrer automatiquement Apache2 au démarrage du conteneur, modifiez /etc/bash.bashrc dans le conteneur et ajoutez /usr/local/Apache2/bin/apachectl -f /usr/local/Apache2/conf/httpd.conf (ou quelle que soit la commande de démarrage d'Apache2) vers une nouvelle ligne à la fin du fichier.

Enregistrez les modifications apportées à votre image et redémarrez-la avec docker run -i -t IMAGE /bin/bash et vous trouverez Apache2 en cours d'exécution lors de la connexion.

27
damick

Une option que vous pourriez utiliser serait d'utiliser un gestionnaire de processus tel que Supervisord pour exécuter plusieurs processus. Quelqu'un a accompli cela avec sshd et mongodb: https://github.com/justone/docker-mongodb

5
bacongobbler

Je suppose que tu ne peux pas. Ce que vous pouvez faire est de créer une image à l'aide d'un Dockerfile et de définir un CMD dans celui-ci, qui sera exécuté au démarrage du conteneur. Voir la documentation du générateur pour les bases ( https://docs.docker.com/reference/builder/ ) et voir Exécuter un service automatiquement dans un conteneur Docker pour plus d'informations sur garder votre service en marche.

Vous n'avez pas besoin d'automatiser cela à l'aide d'un Dockerfile. Vous pouvez également créer l'image via une validation manuelle comme vous le faites et l'exécuter en ligne de commande. Ensuite, vous fournissez la commande qu'il doit exécuter (c'est exactement ce que fait réellement le Dockerfile CMD). Vous pouvez également remplacer le CMD Dockerfiles de cette manière: seul le dernier CMD sera exécuté, qui est la commande de ligne de commande si vous démarrez le conteneur en utilisant un. Les bases docker run -i -t base /bin/bash la commande de la documentation est un exemple. Si votre commande devient trop longue, vous pouvez bien sûr créer un script de commodité.

4
qkrijger

De par leur conception, les conteneurs démarrés en mode détaché se terminent lorsque le processus racine utilisé pour exécuter les conteneurs se ferme. Vous devez démarrer un service Apache en mode FOREGROUND.

docker run -p 8080:80 -d ubuntu/Apache apachectl -D FOREGROUND

Référence: https://docs.docker.com/engine/reference/run/#detached-vs-foreground

2
Rodrigo Lima

Essayez d'ajouter le script de démarrage au point d'entrée dans le dockerfile comme ceci;

ENTRYPOINT service Apache2 restart && bash