Mam plik Dockerfile do zainstalowania serwera MySQL w kontenerze, który następnie zaczynam w ten sposób:
sudo docker run -t -i 09d18b9a12be /bin/bash
Ale usługa MySQL nie uruchamia się automatycznie, muszę ręcznie uruchomić (z poziomu kontenera):
service mysql start
Jak automatycznie uruchomić usługę MySQL po uruchomieniu kontenera Dockera?
Odpowiedzi:
Po pierwsze, występuje problem w Twoim
Dockerfile
:Obrazy platformy Docker nie zapisują uruchomionych procesów. Dlatego twoje
RUN
polecenie jest wykonywane tylko wdocker build
fazie i zatrzymuje się po zakończeniu kompilacji. Zamiast tego musisz określić polecenie podczas uruchamiania kontenera za pomocą poleceńCMD
lubENTRYPOINT
, takich jak poniżej: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 start
polecenia nie można używać bezpośrednio w pliku Dockerfile.Rozwiązanie
Istnieją trzy typowe sposoby utrzymania procesu:
Używanie
service
polecenia i dołączanie polecenia non-end po tym, jaktail -F
Jest to często preferowane, gdy masz uruchomioną jedną usługę, ponieważ umożliwia ona dostęp do dziennika wyjściowego dla platformy Docker.
Lub użyj polecenia pierwszego planu, aby to zrobić
Działa to tylko wtedy, gdy istnieje skrypt, taki jak
mysqld_safe
.Lub zapakuj swoje skrypty
start.sh
i zakończ toNajlepiej, 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
źródło
docker exec -it <CONTAINER NAME> mysql /etc/init.d/mysqld restart
W swoim
Dockerfile
dodaj w ostatnim wierszuMi to pasuje
A oto wynik:
źródło
docker stop
anidocker restart
wdzięczny, po prostu można go zabić.Prosty! Dodaj na końcu pliku dockerfile:
źródło
Docker version 18.09.7, build 2d0083d
bez&& /bin/bash
usługi zostanie natychmiast zatrzymanaJest na to inny sposób, który zawsze uważałem za bardziej czytelny.
Powiedz, że chcesz uruchomić rabbitmq i mongodb po uruchomieniu, wtedy
CMD
wyglądałoby to mniej więcej tak:Ponieważ możesz mieć tylko jedną
CMD
na każdąDockerfile
sztuczkę, musisz połączyć wszystkie instrukcje z,&&
a następnie użyć\
dla każdego polecenia, aby rozpocząć nowy wiersz.Jeśli w końcu dodasz do wielu z nich, sugeruję umieszczenie wszystkich poleceń w pliku skryptu i uruchomienie go tak, jak sugerował @ larry-cai:
źródło
W moim przypadku mam aplikację internetową PHP obsługiwaną przez Apache2 w kontenerze docker, który łączy się z bazą danych MYSQL. Rozwiązanie Larry Cai działało z niewielkimi modyfikacjami. Utworzyłem
entrypoint.sh
plik, w którym zarządzam swoimi usługami. Myślę, że utworzenie polecenia,entrypoint.sh
gdy masz więcej niż jedno polecenie do wykonania podczas uruchamiania kontenera, jest czystszym sposobem na załadowanie dockera.źródło
ENTRYPOINT ['your location']
instrukcję do pliku skryptu. Pamiętaj jednak, aby ustawić uprawnienia do wykonywania skryptu.COPY entrypoint.sh /entrypoint.sh RUN chmod 755 /entrypoint.sh ENTRYPOINT ["/entrypoint.sh"]
. W tym przykładzie skopiowałem mój punkt wejścia do katalogu głównego w kontenerze Dockera.Mam ten sam problem, gdy chcę automatycznie uruchomić usługę ssh. Znalazłem ten dodatek
do możesz go rozwiązać, ale tylko Ty otworzysz go za pomocą basha.źródło
Dodaję następujący kod do /root/.bashrc, aby uruchomić kod tylko raz,
Zatwierdź kontener do obrazu przed uruchomieniem tego skryptu, w przeciwnym razie w obrazach zostanie utworzony plik „docker_services” i żadna usługa nie zostanie uruchomiona.
źródło
Oto jak automatycznie uruchamiam usługę MySQL po uruchomieniu kontenera docker.
W moim przypadku muszę uruchomić nie tylko MySQL, ale także PHP, Nginx i Memcached
Mam następujące wiersze w pliku Dockerfile
Dodanie && bash sprawiłoby, że Nginx, MySQL, PHP i Memcached działałyby w kontenerze.
źródło
To nie działa
CMD service mysql start && /bin/bash
To nie działa
CMD service mysql start ; /bin/bash ;
- Domyślam się, że tryb interaktywny nie obsługuje pierwszego planu.
To działa !!
CMD service nginx start ; while true ; do sleep 100; done;
To działa !!
CMD service nginx start && tail -F /var/log/nginx/access.log
uważaj, powinieneś używać
docker run -p 80:80 nginx_bash
bez parametru polecenia.źródło
Poniższa dokumentacja z witryny sieci Web platformy Docker pokazuje, jak zaimplementować usługę SSH w kontenerze platformy Docker. Powinien być łatwy do dostosowania do Twojej usługi:
Zadano tu również odmianę tego pytania:
źródło
Może być konieczne przycięcie istniejącego kontenera za pomocą narzędzia docker prune ...
Import z wymaganymi modyfikacjami:
Uruchom kontener, na przykład z opcją Zawsze restartuj, aby upewnić się, że zostanie automatycznie wznowiony po ponownym uruchomieniu hosta / demona:
Uwaga boczna: Moim zdaniem rozsądne jest uruchamianie tylko usługi cron, pozostawiając kontener tak czysty, jak to tylko możliwe, a następnie po prostu zmodyfikuj crontab lub cron.hourly, .daily itd ... za pomocą odpowiednich skryptów sprawdzania / monitorowania. Powodem jest to, że polegasz tylko na jednym demonie, aw przypadku zmian łatwiej jest redystrybuować skrypty crona z ansible lub puppet zamiast śledzić usługi uruchamiane podczas rozruchu.
źródło