Po pierwsze, występuje problem w Twoim Dockerfile:
RUN service mysql restart && /tmp/setup.sh
Obrazy platformy Docker nie zapisują uruchomionych procesów. Dlatego twoje RUNpolecenie jest wykonywane tylko w docker buildfazie i zatrzymuje się po zakończeniu kompilacji. Zamiast tego musisz określić polecenie podczas uruchamiania kontenera za pomocą poleceń CMDlub ENTRYPOINT, takich jak poniżej:
CMD mysql start
Po drugie, kontener docker wymaga procesu (ostatniego polecenia), aby kontynuować działanie, w przeciwnym razie kontener zostanie zamknięty / zatrzymany. Dlatego zwykłego service mysql startpolecenia nie można używać bezpośrednio w pliku Dockerfile.
Rozwiązanie
Istnieją trzy typowe sposoby utrzymania procesu:
Używanie servicepolecenia i dołączanie polecenia non-end po tym, jaktail -F
CMD service mysql start && tail -F /var/log/mysql/error.log
Jest to często preferowane, gdy masz uruchomioną jedną usługę, ponieważ umożliwia ona dostęp do dziennika wyjściowego dla platformy Docker.
Działa to tylko wtedy, gdy istnieje skrypt, taki jak mysqld_safe.
Najlepiej, jeśli polecenie musi wykonać serię kroków, ponownie /start.sh powinno pozostać uruchomione.
Uwaga
Dla początkujących supervisord nie zaleca się stosowania. Szczerze mówiąc, to przesada. Znacznie lepiej jest użyć pojedynczej usługi / pojedynczego polecenia dla kontenera.
BTW: sprawdź https://registry.hub.docker.com pod kątem istniejących obrazów dockera mysql w celach informacyjnych