Bagaimana menjalankan Nginx dalam wadah Docker tanpa berhenti?

130

Saya sudah menginstal Nginx di wadah Docker, dan saya mencoba menjalankannya seperti ini:

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

Masalahnya adalah cara kerja Nginx, adalah bahwa proses awal segera memunculkan proses master Nginx dan beberapa pekerja, dan kemudian berhenti. Karena Docker hanya menonton PID dari perintah aslinya, wadah kemudian berhenti.

Bagaimana saya mencegah wadah berhenti? Saya harus bisa mengatakannya untuk mengikat ke proses anak pertama, atau menghentikan proses awal Nginx dari keluar.

Seldo
sumber

Jawaban:

165

nginx, seperti semua program berperilaku baik, dapat dikonfigurasikan untuk tidak melakukan dasmon sendiri.

Gunakan daemon offpetunjuk konfigurasi yang dijelaskan dalam http://wiki.nginx.org/CoreModule .

Charles Duffy
sumber
15
Terima kasih! Untuk memperjelas, itu berarti mengedit /etc/nginx/nginx.conf dan menambahkan "daemon off;" di bagian atas (yaitu tidak di dalam server atau arahan lainnya)
Seldo
6
Saya agak khawatir yang daemon offtidak didukung oleh nginx .
Leonid Shevtsov
7
@LeonidShevtsov ... maksud Anda tidak disahkan untuk penggunaan produksi sebelum 1.0.9. Peringatan berdiri, tentang upgrade di tempat, tidak masalah bagi orang-orang melakukan hal-hal The Docker Way.
Charles Duffy
Mereka tampaknya memiliki pengalihan di sisi server sekarang (ke nginx.org/en/docs/ngx_core_module.html ).
Charles Duffy
175

Untuk memperluas jawaban Charles Duffy, Nginx menggunakan daemon offarahan untuk menjalankan di latar depan. Jika tidak nyaman untuk meletakkan ini di file konfigurasi, kita dapat menentukannya langsung pada baris perintah. Ini membuatnya mudah dijalankan dalam mode debug (foreground) dan langsung beralih ke running dalam mode produksi (latar belakang) dengan mengubah argumen baris perintah.

Untuk berjalan di latar depan:

nginx -g 'daemon off;'

Untuk berjalan di latar belakang:

nginx
johntellsallall
sumber
3
Dapatkah seseorang menjelaskan apa sebenarnya "-g"? Saya tidak dapat menemukan saklar ini di dokumen hanya contoh yang satu ini dengan nginx menggunakannya.
red888
5
@ red888, tentukan opsi konfigurasi global.
Charles Duffy
1
CMDakan menjadi CMD ["nginx", "-g", "daemon off;"] buruh pelabuhan
prayagupd
55

Untuk memperluas jawaban John, Anda juga dapat menggunakan Dockerfile CMDperintah sebagai berikut (jika Anda ingin memulai sendiri tanpa argumen tambahan)

CMD ["nginx", "-g", "daemon off;"]
Tomer Ben David
sumber
10

Menambahkan perintah ini ke Dockerfile dapat menonaktifkannya:

RUN echo "daemon off;" >> /etc/nginx/nginx.conf
Afshin Mehrabani
sumber
6

Untuk menambahkan jawaban Tomer dan Charles,

Sintaks untuk menjalankan nginx di forground dalam wadah Docker menggunakan Entrypoint:

ENTRYPOINT nginx -g 'daemon off;' 

Tidak terkait langsung tetapi untuk menjalankan beberapa perintah dengan Entrypoint:

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

Untuk semua yang datang ke sini mencoba menjalankan gambar nginx dalam wadah buruh pelabuhan, itu akan berjalan sebagai layanan

Karena tidak ada Dockerfile secara keseluruhan, inilah seluruh Dockerfilepemecahan masalah saya.

Bagus dan bekerja Terima kasih atas semua jawaban di sini untuk menyelesaikan masalah nginx terakhir.

FROM ubuntu:18.04
MAINTAINER stackoverfloguy "[email protected]"
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;'

Dan jalankan dengan:

docker run -p 80:80 -p 443:443 -dit
Alejandro Teixeira Muñoz
sumber