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 RUNcommande s'exécute uniquement pendant la docker buildphase 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 CMDou ENTRYPOINTcomme 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 startcommande 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 servicecommande 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.shdoit rester en cours d'exécution.
Remarque
Pour les débutants, l'utilisation supervisordn'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