Jak uruchomić kontener Docker po uruchomieniu usług?

Widziałem kilka samouczków, które wydają się robić to samo, co ja, ale z jakiegoś powodu moje kontenery Docker wychodzą. W zasadzie konfiguruję serwer WWW i kilka demonów wewnątrz kontenera dokera. Wykonuję końcowe części za pomocą skryptu bash o nazwie run-all.sh, który uruchamiam przez CMD w moim pliku Dokerowym. run-all.sh wygląda tak:

service supervisor start
service nginx start

I uruchamiam go w moim Dockerfile w następujący sposób:

CMD ["sh", "/root/credentialize_and_run.sh"]

Widzę, że wszystkie usługi uruchamiają się poprawnie, gdy uruchamiam rzeczy ręcznie (tj. przechodzenie do obrazu za pomocą-i-T / bin / bash) i wszystko wygląda tak, jakby działało poprawnie, gdy uruchamiam obraz, ale kończy się po zakończeniu uruchamiania moich procesów. Chciałbym, aby procesy działały w nieskończoność, i o ile rozumiem, kontener musi działać, aby to się stało. Niemniej jednak, kiedy biegnę docker ps -a, widzę:

➜  docker_test  docker ps -a
CONTAINER ID        IMAGE                            COMMAND                CREATED             STATUS                      PORTS               NAMES
c7706edc4189        some_name/some_repo:blah   "sh /root/run-all.sh   8 minutes ago       Exited (0) 8 minutes ago                        grave_jones
Co się dzieje? Dlaczego wychodzi? Wiem, że mógłbym po prostu umieścić pętlę while na końcu mojego skryptu bash, aby utrzymać go, ale co to jest dobry sposób, żeby go nie opuścić?
 87
Author: Diogo Gomes, 2014-09-11

7 answers

Nie tak powinno się projektować kontenery Docker.

Projektując kontener Dockera, powinieneś zbudować go w taki sposób, aby działał tylko jeden proces (tzn. powinieneś mieć jeden kontener dla Nginx i jeden dla supervisord lub uruchomionej aplikacji); dodatkowo, proces ten powinien działać na pierwszym planie.

Kontener "zakończy działanie", gdy sam proces zakończy działanie (w Twoim przypadku proces ten jest Twoim skryptem bash).


Jednakże, Jeśli naprawdę potrzebujesz (lub chcesz) uruchomić wiele usług w kontenerze Dockera, rozważ rozpoczęcie od "Obraz bazowy Dockera", który używa runit jako pseudo-procesu init (runit pozostanie online podczas działania Nginx i Supervisor), który pozostanie na pierwszym planie, podczas gdy inne procesy wykonują swoje zadania.

Mają znaczne dokumenty, więc powinieneś być w stanie osiągnąć to, co próbujesz zrobić rozsądnie łatwo.

 35
Author: Thomas Orozco,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-06-29 12:53:40

Właśnie miałem ten sam problem i dowiedziałem się, że jeśli używasz kontenera z flagą -t i -d, to nadal działa.

docker run -td <image>

Oto co robią flagi (według docker run --help):

-d, --detach=false         Run container in background and print container ID
-t, --tty=false            Allocate a pseudo-TTY

Najważniejszą z nich jest flaga -t. -d po prostu pozwala uruchomić kontener w tle.

 55
Author: arne.z,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-04-26 17:50:31

Jeśli używasz pliku Dockerfile, spróbuj:

ENTRYPOINT ["tail", "-f", "/dev/null"]

(oczywiście jest to tylko do celów deweloperskich, nie należy utrzymywać kontenera przy życiu, chyba że uruchamia proces, np. nginx...)

 49
Author: Soft Bullets,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-03-18 11:33:39

Kończy działanie, ponieważ skrypt powłoki jest uruchamiany najpierw jako PID 1, A po jego zakończeniu PID 1 zniknie, a docker działa tylko wtedy, gdy PID 1 jest.

Możesz użyć Supervisora do zrobienia wszystkiego, jeśli uruchomiony z flagą "-n" mówi się, aby nie demonizował, więc pozostanie jako pierwszy proces:

CMD ["/usr/bin/supervisord", "-n"]
I twój superwizor.conf:
[supervisord]
nodaemon=true

[program:startup]
priority=1
command=/root/credentialize_and_run.sh
stdout_logfile=/var/log/supervisor/%(program_name)s.log
stderr_logfile=/var/log/supervisor/%(program_name)s.log
autorestart=false
startsecs=0

[program:nginx]
priority=10
command=nginx -g "daemon off;"
stdout_logfile=/var/log/supervisor/nginx.log
stderr_logfile=/var/log/supervisor/nginx.log
autorestart=true

Wtedy możesz mieć tyle innych procesów, ile chcesz, a supervisor zajmie się ich ponownym uruchomieniem w razie potrzeby.

W ten sposób możesz użyć supervisord w przypadkach, w których możesz potrzebować nginx i php5-fpm i nie ma większego sensu, aby je rozdzielić.

 34
Author: phazei,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-06-03 23:39:16

Możesz uruchomić plain cat bez żadnych argumentów, jak wspomniał bro @Sa ' ad, aby po prostu utrzymać kontener w działaniu [właściwie nic nie robi, ale czeka na wejście użytkownika] (Wtyczka Docker Jenkinsa robi to samo)

 28
Author: Serge Velikanov,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-03-19 21:01:33

Upewnij się, że dodałeś daemon off; do siebie nginx.w tym celu należy skontaktować się z Działem obsługi klienta firmy nginx.]}

Następnie użyj poniższego, aby uruchomić zarówno nadzorcę jako usługę, jak i nginx jako proces pierwszoplanowy, który uniemożliwi wyjście kontenera

service supervisor start && nginx

W niektórych przypadkach będziesz musiał mieć więcej niż jeden proces w kontenerze, więc zmuszanie kontenera do posiadania dokładnie jednego procesu nie zadziała i może spowodować więcej problemów podczas wdrażania.

Więc musisz zrozum kompromisy i podejmij odpowiednią decyzję.
 10
Author: iTech,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-11-04 12:58:21

Przechwytywanie PID procesu ngnix w zmiennej (na przykład $NGNIX_PID) i na końcu pliku entrypoint do

wait $NGNIX_PID 

W ten sposób twój kontener powinien działać, dopóki ngnix nie będzie żywy, gdy ngnix się zatrzyma, kontener również się zatrzyma

 3
Author: user2825611,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-12-18 15:27:39