Mam Nginx zainstalowany na kontenerze Docker i próbuję go uruchomić w ten sposób:
docker run -i -t -p 80:80 mydockerimage /usr/sbin/nginx
Problem polega na tym, że sposób działania Nginx polega na tym, że początkowy proces natychmiast odradza główny proces Nginx i niektórych pracowników, a następnie kończy pracę. Ponieważ Docker obserwuje tylko PID oryginalnego polecenia, kontener zatrzymuje się.
Jak mogę zapobiec zatrzymywaniu się kontenera? Muszę być w stanie powiedzieć mu, aby związał się z pierwszym procesem potomnym lub zatrzymał początkowy proces Nginx przed zakończeniem.
daemon off
nie jest wspierany przez Nginx .Aby rozwinąć odpowiedź Charlesa Duffy'ego, Nginx używa
daemon off
dyrektywy, aby działać na pierwszym planie. Jeśli umieszczenie tego w pliku konfiguracyjnym jest niewygodne, możemy to określić bezpośrednio w linii poleceń. Ułatwia to uruchamianie w trybie debugowania (pierwszy plan) i bezpośrednie przełączanie do pracy w trybie produkcyjnym (w tle) poprzez zmianę argumentów wiersza poleceń.Aby uruchomić na pierwszym planie:
Aby działać w tle:
źródło
CMD
będzieCMD ["nginx", "-g", "daemon off;"]
dlaAby rozwinąć odpowiedź Johna, możesz również użyć następującego
Dockerfile
CMD
polecenia (na wypadek, gdybyś chciał, aby uruchamiał się samodzielnie bez dodatkowych argumentów)źródło
Dodanie tego polecenia do Dockerfile może je wyłączyć:
źródło
Do Twojej wiadomości, od dzisiaj (22 października 2019) wszystkie oficjalne obrazy dockera Nginx mają wiersz:
np. https://github.com/nginxinc/docker-nginx/blob/23a990403d6dbe102bf2c72ab2f6a239e940e3c3/mainline/alpine/Dockerfile#L117
źródło
Oto przykład pliku Dockerfile, który uruchamia nginx. Jak wspomniał Charles, używa
daemon off
konfiguracji:https://github.com/darron/docker-nginx-php5/blob/master/Dockerfile#L17
źródło
Aby dodać odpowiedzi Tomera i Charlesa,
Składnia do uruchomienia nginx w forground w kontenerze Docker przy użyciu punktu wejścia:
Nie jest bezpośrednio związane, ale do uruchamiania wielu poleceń z Entrypoint:
źródło
Do zarządzania usługami warto również wykorzystać supervisor lub runit [1].
[1] https://github.com/phusion/baseimage-docker
źródło
Ponieważ nie ma całego pliku Dockerfile, oto moje
Dockerfile
rozwiązanie całego problemu.Ładnie i dobrze. Dziękuję wszystkim odpowiedziom w celu rozwiązania ostatecznego problemu nginx.
I uruchom go za pomocą:
źródło