Premièrement, il y a un problème dans votre Dockerfile
:
RUN service mysql restart && /tmp/setup.sh
Les images Docker n'enregistrent pas les processus en cours d'exécution. Par conséquent, votre RUN
commande s'exécute uniquement pendant la docker 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 commandes CMD
ou ENTRYPOINT
comme ci-dessous:
CMD mysql start
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
CMD service mysql start && tail -F /var/log/mysql/error.log
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.
Cela ne fonctionne que s'il existe un script comme mysqld_safe
.
C'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