จะรัน Nginx ภายใน Docker container โดยไม่หยุดได้อย่างไร


130

ฉันติดตั้ง Nginx บนคอนเทนเนอร์ Docker แล้วและกำลังพยายามเรียกใช้เช่นนี้:

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

ปัญหาคือวิธีการทำงานของ Nginx คือกระบวนการเริ่มต้นจะสร้างกระบวนการ Nginx หลักและคนงานบางส่วนทันทีจากนั้นจึงหยุดทำงาน เนื่องจาก Docker กำลังเฝ้าดู PID ของคำสั่งดั้งเดิมเท่านั้นคอนเทนเนอร์จึงหยุดลง

ฉันจะป้องกันไม่ให้ภาชนะหยุดทำงานได้อย่างไร ฉันต้องสามารถบอกให้เชื่อมโยงกับกระบวนการลูกแรกหรือหยุดกระบวนการเริ่มต้นของ Nginx ไม่ให้ออก

คำตอบ:


165

nginxเช่นเดียวกับโปรแกรมที่ทำงานได้ดีทั้งหมดสามารถกำหนดค่าไม่ให้แสดงตัวเองได้

ใช้daemon offคำสั่งการกำหนดค่าที่อธิบายไว้ในhttp://wiki.nginx.org/CoreModule


15
ขอบคุณ! เพื่อชี้แจงนั่นหมายถึงการแก้ไข /etc/nginx/nginx.conf และเพิ่ม "daemon off;" ที่ด้านบนสุด (เช่นไม่อยู่ในเซิร์ฟเวอร์หรือคำสั่งอื่น ๆ )
Seldo

6
ฉันกังวลค่อนข้างที่daemon offจะไม่ได้รับการรับรองโดย Nginx
Leonid Shevtsov

7
@LeonidShevtsov ... คุณหมายความว่าไม่ได้รับการรับรองสำหรับการใช้งานจริงก่อน 1.0.9 ข้อแม้ที่ชัดเจนเกี่ยวกับการอัปเกรดแบบแทนที่ไม่สำคัญสำหรับคนที่ทำสิ่งต่าง ๆ The Docker Way
Charles Duffy

ดูเหมือนว่าจะมีการเปลี่ยนเส้นทางในฝั่งเซิร์ฟเวอร์ในขณะนี้ (ไปที่nginx.org/en/docs/ngx_core_module.html )
Charles Duffy

175

เพื่อขยายคำตอบของ Charles Duffy Nginx ใช้daemon offคำสั่งเพื่อทำงานในเบื้องหน้า หากไม่สะดวกที่จะใส่สิ่งนี้ในไฟล์กำหนดค่าเราสามารถระบุได้โดยตรงในบรรทัดคำสั่ง สิ่งนี้ทำให้ง่ายต่อการรันในโหมดดีบัก (เบื้องหน้า) และเปลี่ยนเป็นการทำงานในโหมดการผลิต (พื้นหลัง) โดยตรงโดยการเปลี่ยนอาร์กิวเมนต์บรรทัดคำสั่ง

ในการทำงานเบื้องหน้า:

nginx -g 'daemon off;'

ในการทำงานในพื้นหลัง:

nginx

3
ใครช่วยอธิบายได้ว่า "-g" คืออะไร? ฉันไม่พบสวิตช์นี้ในเอกสารมีเพียงตัวอย่างเดียวที่ใช้ nginx เท่านั้น
red888

5
@ red888 ตั้งค่าตัวเลือกการกำหนดค่าส่วนกลาง
Charles Duffy

1
CMDจะเป็นCMD ["nginx", "-g", "daemon off;"] ของนักเทียบท่า
Prayagupd

55

หากต้องการขยายคำตอบของ John คุณสามารถใช้Dockerfile CMDคำสั่งดังต่อไปนี้ (ในกรณีที่คุณต้องการให้เริ่มต้นด้วยตนเองโดยไม่มีอาร์กิวเมนต์เพิ่มเติม)

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



6

คุณมีตัวอย่าง Dockerfile ที่รัน nginx ที่นี่ ดังที่ Charles กล่าวถึงจะใช้การdaemon offกำหนดค่า:

https://github.com/darron/docker-nginx-php5/blob/master/Dockerfile#L17


2
และ Nginx Dockerfile อย่างเป็นทางการที่: github.com/dockerfile/nginx/blob/master/Dockerfile#L15
Ciro Santilli 郝海东郝海东冠状病事件事件

6

หากต้องการเพิ่มคำตอบของ Tomer และ Charles

ไวยากรณ์ที่จะรัน nginx ใน forground ใน Docker container โดยใช้ Entrypoint:

ENTRYPOINT nginx -g 'daemon off;' 

ไม่เกี่ยวข้องโดยตรง แต่เรียกใช้คำสั่งหลายคำสั่งด้วย Entrypoint:

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


0

สำหรับทุกคนที่มาที่นี่เพื่อพยายามเรียกใช้อิมเมจ nginx ในคอนเทนเนอร์นักเทียบท่าสิ่งนั้นจะทำงานเป็นบริการ

เนื่องจากไม่มี Dockerfile ทั้งหมดนี่คือDockerfileการแก้ปัญหาทั้งหมดของฉัน

ดีและใช้งานได้ ขอขอบคุณสำหรับคำตอบทั้งหมดที่นี่เพื่อแก้ปัญหา nginx ขั้นสุดท้าย

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;'

และเรียกใช้ด้วย:

docker run -p 80:80 -p 443:443 -dit
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.