EDIT :J'ai beaucoup appris sur Docker depuis la publication de cette réponse. "Démarrer automatiquement les services dans les conteneurs Docker" n'est pas un bon modèle d'utilisation pour Docker. À la place, utilisez quelque chose comme Fleet, Kubernetes ou même Monit/SystemD/Upstart/Init.d/Cron pour démarrer automatiquement les services qui s'exécutent dans les 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 votre commande apache2 start) à 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 lorsque vous vous attacherez.
Je suppose que vous ne pouvez pas. Ce que vous pouvez faire est de créer une image à l'aide d'un Dockerfile et d'y définir un CMD, qui sera exécuté au démarrage du conteneur. Consultez la documentation du générateur pour les bases (https://docs.docker.com/reference/builder/) et consultez Exécuter un service automatiquement dans un conteneur docker pour plus d'informations sur le maintien de votre service en cours d'exécution.
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 (ce qui est exactement ce que fait le Dockerfile CMD). Vous pouvez également remplacer le Dockerfiles CMD 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 une. Le docker run -i -t base /bin/bash
de base La commande de la documentation est un exemple. Si votre commande devient trop longue, vous pouvez bien sûr créer un script pratique.
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