Nginx'i bir Docker konteynerinde durdurmadan nasıl çalıştırabilirim?


130

Bir Docker konteynerine Nginx yükledim ve bunu şu şekilde çalıştırmaya çalışıyorum:

docker run -i -t -p 80:80 mydockerimage /usr/sbin/nginx

Sorun şu ki, Nginx'in çalışma şekli, ilk işlemin hemen bir ana Nginx sürecini ve bazı işçileri ortaya çıkarması ve ardından çıkması. Docker yalnızca orijinal komutun PID'sini izlediğinden, konteyner durur.

Kabın durmasını nasıl önleyebilirim? Ona ilk çocuk sürecine bağlanmasını veya Nginx'in ilk işleminin çıkışını durdurmasını söylemem gerekiyor.

Yanıtlar:


165

nginx, tüm iyi huylu programlar gibi, kendi kendine daemonize olmayacak şekilde yapılandırılabilir.

Http://wiki.nginx.org/CoreModule'dedaemon off açıklanan yapılandırma direktifini kullanın .


15
Teşekkürler! Açıklığa kavuşturmak için, bu /etc/nginx/nginx.conf dosyasını düzenlemek ve "daemon off" eklemek anlamına gelir; üstte (yani bir sunucu veya başka bir direktif içinde değil)
Seldo


7
@LeonidShevtsov ... sen demek değildi 1.0.9 öncesinde üretim kullanımı için onayladı. Yerinde yükseltmelerle ilgili kalıcı uyarı, Docker Way'i yapan kişiler için önemli değil.
Charles Duffy

Artık sunucu tarafında bir yeniden yönlendirmeleri var gibi görünüyor ( nginx.org/en/docs/ngx_core_module.html'ye ).
Charles Duffy

175

Charles Duffy'nin cevabını genişletmek için, Nginx daemon offön planda çalışmak için yönergeyi kullanıyor . Bunu yapılandırma dosyasına koymak sakıncalıysa, doğrudan komut satırında belirtebiliriz. Bu, hata ayıklama modunda (ön plan) çalıştırmayı ve komut satırı değişkenlerini değiştirerek doğrudan üretim modunda (arka plan) çalışmaya geçmeyi kolaylaştırır.

Ön planda koşmak için:

nginx -g 'daemon off;'

Arka planda çalıştırmak için:

nginx

3
Birisi "-g" nin gerçekte ne olduğunu açıklayabilir mi? Bu anahtarı dokümanlarda bulamıyorum, sadece nginx kullanan bu örnekte.
red888

5
@ red888, genel bir yapılandırma seçeneği ayarlar.
Charles Duffy

1
CMD olacak CMD ["nginx", "-g", "daemon off;"] docker için
praagupd

55

John'un cevabını genişletmek için Dockerfile CMDkomutu aşağıdaki gibi de kullanabilirsiniz (ek bağımsız değişkenler olmadan kendi kendine başlamasını istiyorsanız)

CMD ["nginx", "-g", "daemon off;"]

10

Dockerfile'a bu komutu eklemek onu devre dışı bırakabilir:

RUN echo "daemon off;" >> /etc/nginx/nginx.conf



6

Tomer ve Charles cevaplarını eklemek için,

Giriş noktası kullanarak Docker konteynerinde nginx'i forground'da çalıştırmak için sözdizimi:

ENTRYPOINT nginx -g 'daemon off;' 

Doğrudan ilişkili değil, Giriş noktası ile birden fazla komut çalıştırmak için:

ENTRYPOINT /bin/bash -x /myscripts/myscript.sh && nginx -g 'daemon off;' 


0

Buraya gelen herkes için bir docker konteynerinde bir hizmet olarak çalışacak bir nginx imajı çalıştırmaya çalışıyor

Dockerfile'ın tamamı olmadığından, işte benim bütün Dockerfile sorunu .

Güzel ve çalışıyor. Nihai nginx sorununu çözmek için buradaki tüm cevaplara teşekkürler.

FROM ubuntu:18.04
MAINTAINER stackoverfloguy "stackoverfloguy@foo.com"
RUN apt-get update -y
RUN apt-get install net-tools nginx ufw sudo -y
RUN adduser --disabled-password --gecos '' docker
RUN adduser docker sudo
RUN echo '%sudo ALL=(ALL) NOPASSWD:ALL' >> /etc/sudoers
USER docker
RUN sudo ufw default allow incoming
RUN sudo rm /etc/nginx/nginx.conf
RUN sudo rm /etc/nginx/sites-available/default
RUN sudo rm /var/www/html/index.nginx-debian.html
VOLUME /var/log
VOLUME /usr/share/nginx/html
VOLUME /etc/nginx
VOLUME /var/run
COPY conf/nginx.conf /etc/nginx/nginx.conf
COPY content/* /var/www/html/
COPY Dockerfile /var/www/html
COPY start.sh /etc/nginx/start.sh
RUN sudo chmod +x /etc/nginx/start.sh
RUN sudo chmod -R 777 /var/www/html
EXPOSE 80
EXPOSE 443
ENTRYPOINT sudo nginx -c /etc/nginx/nginx.conf -g 'daemon off;'

Ve şununla çalıştırın:

docker run -p 80:80 -p 443:443 -dit
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.