J'ai un Dockerfile pour installer le serveur MySQL dans un conteneur, que je commence ensuite comme ceci:
sudo docker run -t -i 09d18b9a12be /bin/bash
Mais le service MySQL ne démarre pas automatiquement, je dois exécuter manuellement (depuis le conteneur):
service mysql start
Comment démarrer automatiquement le service MySQL lorsque j'exécute le conteneur Docker?
Réponses:
Premièrement, il y a un problème dans votre
Dockerfile
:Les images Docker n'enregistrent pas les processus en cours d'exécution. Par conséquent, votre
RUN
commande s'exécute uniquement pendant ladocker build
phase et s'arrête une fois la génération terminée. Au lieu de cela, vous devez spécifier la commande lorsque le conteneur est démarré à l'aide des commandesCMD
ouENTRYPOINT
comme ci-dessous:Deuxièmement, le conteneur docker a besoin d'un processus (dernière commande) pour continuer à fonctionner, sinon le conteneur quittera / s'arrêtera. Par conséquent, la
service mysql start
commande normale ne peut pas être utilisée directement dans le Dockerfile.Solution
Il existe trois façons typiques de maintenir le processus en cours d'exécution:
Utilisation de la
service
commande et ajout de la commande non finale après cela, commetail -F
Ceci est souvent préférable lorsque vous avez un seul service en cours d'exécution, car cela rend le journal produit accessible à docker.
Ou utilisez la commande de premier plan pour ce faire
Cela ne fonctionne que s'il existe un script comme
mysqld_safe
.Ou encapsulez vos scripts
start.sh
et mettez-y finC'est mieux si la commande doit effectuer une série d'étapes, encore une fois,
/start.sh
doit rester en cours d'exécution.Remarque
Pour les débutants, l'utilisation
supervisord
n'est pas recommandée. Honnêtement, c'est exagéré. Il est préférable d'utiliser un service / une commande unique pour le conteneur.BTW: veuillez consulter https://registry.hub.docker.com pour les images de docker mysql existantes pour référence
la source
docker exec -it <CONTAINER NAME> mysql /etc/init.d/mysqld restart
Dans votre
Dockerfile
, ajoutez à la dernière ligneÇa marche pour moi
Et voici le résultat:
la source
docker stop
oudocker restart
gracieusement, il peut simplement être tué.Facile! Ajoutez à la fin de dockerfile:
la source
Docker version 18.09.7, build 2d0083d
sans&& /bin/bash
le service s'arrêtera immédiatementIl y a une autre façon de le faire que j'ai toujours trouvée plus lisible.
Dites que vous voulez démarrer rabbitmq et mongodb lorsque vous l'exécutez, cela
CMD
ressemblerait à ceci:Puisque vous ne pouvez en avoir qu'une
CMD
parDockerfile
astuce, vous devez concaténer toutes les instructions avec&&
, puis les utiliser\
pour chaque commande pour démarrer une nouvelle ligne.Si vous finissez par ajouter à beaucoup de ceux-ci, je vous suggère de mettre toutes vos commandes dans un fichier de script et de le démarrer comme @ larry-cai a suggéré:
la source
Dans mon cas, j'ai une application Web PHP servie par Apache2 dans le conteneur docker qui se connecte à une base de données backend MYSQL. La solution de Larry Cai a fonctionné avec des modifications mineures. J'ai créé un
entrypoint.sh
fichier dans lequel je gère mes services. Je pense que créer unentrypoint.sh
lorsque vous avez plus d'une commande à exécuter lorsque votre conteneur démarre est un moyen plus propre d'amorcer le docker.la source
ENTRYPOINT ['your location']
instruction vers le fichier de script. N'oubliez pas de définir les autorisations d'exécution sur votre script.COPY entrypoint.sh /entrypoint.sh RUN chmod 755 /entrypoint.sh ENTRYPOINT ["/entrypoint.sh"]
. Dans cet exemple, j'ai copié mon point d'entrée dans le répertoire racine du conteneur docker.J'ai le même problème lorsque je veux démarrer automatiquement le service ssh. J'ai trouvé cet ajout
à peut le résoudre, mais vous seul l'ouvrez avec bash fera l'affaire.la source
J'ajoute le code suivant à /root/.bashrc pour exécuter le code une seule fois,
Veuillez valider le conteneur dans l'image avant d'exécuter ce script, sinon le fichier 'docker_services' sera créé dans les images et aucun service ne sera exécuté.
la source
Voici comment démarrer automatiquement le service MySQL chaque fois que le conteneur docker s'exécute.
Dans mon cas, je dois exécuter non seulement MySQL mais aussi PHP, Nginx et Memcached
J'ai les lignes suivantes dans Dockerfile
L'ajout de && bash permettrait à Nginx, MySQL, PHP et Memcached de fonctionner dans le conteneur.
la source
Cela ne fonctionne pas
CMD service mysql start && /bin/bash
Cela ne fonctionne pas
CMD service mysql start ; /bin/bash ;
- Je suppose que le mode interactif ne prendrait pas en charge le premier plan.
Cela marche !!
CMD service nginx start ; while true ; do sleep 100; done;
Cela marche !!
CMD service nginx start && tail -F /var/log/nginx/access.log
attention, vous devez utiliser
docker run -p 80:80 nginx_bash
sans paramètre de commande.la source
La documentation suivante du site Web Docker montre comment implémenter un service SSH dans un conteneur Docker. Il doit être facilement adaptable à votre service:
Une variante de cette question a également été posée ici:
la source
Il se peut que vous deviez élaguer le conteneur existant à l'aide de Docker Prune ...
Importer avec les modifications requises:
Exécutez le conteneur par exemple avec l'option toujours redémarrer pour vous assurer qu'il reprendra automatiquement après le recyclage de l'hôte / démon:
Note latérale: À mon avis, il est raisonnable de démarrer uniquement le service cron en laissant le conteneur aussi propre que possible, puis de modifier simplement crontab ou cron.hourly, .daily etc ... avec les scripts de contrôle / surveillance correspondants. La raison en est que vous ne comptez que sur un démon et en cas de changements, il est plus facile avec ansible ou puppet de redistribuer les scripts cron au lieu de suivre les services qui commencent au démarrage.
la source