Làm cách nào để chạy Nginx trong một Docker container mà không tạm dừng?


130

Tôi đã cài đặt Nginx trên một Docker container và tôi đang cố chạy nó như thế này:

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

Vấn đề là cách thức hoạt động của Nginx, là quy trình ban đầu ngay lập tức sinh ra một quy trình Nginx chính và một số công nhân, sau đó bỏ việc. Vì Docker chỉ xem PID của lệnh gốc, nên container sẽ dừng lại.

Làm thế nào để tôi ngăn chặn container dừng lại? Tôi cần có khả năng bảo nó liên kết với quy trình con đầu tiên hoặc ngăn quá trình ban đầu của Nginx thoát ra.

Câu trả lời:


165

nginx, giống như tất cả các chương trình hoạt động tốt, có thể được cấu hình để không tự khởi động.

Sử dụng daemon offchỉ thị cấu hình được mô tả trong http://wiki.nginx.org/CoreModule .


15
Cảm ơn! Để làm rõ, điều đó có nghĩa là chỉnh sửa /etc/nginx/nginx.conf và thêm "daemon tắt;" ở trên cùng (tức là không nằm trong máy chủ hoặc chỉ thị khác)
Seldo


7
@LeonidShevtsov ... ý bạn là không được chứng thực cho sử dụng sản xuất trước ngày 1.0.9. Sự cảnh báo thường trực, về việc nâng cấp tại chỗ, không quan trọng đối với những người làm việc Docker Way.
Charles Duffy

Bây giờ họ dường như có một chuyển hướng ở phía máy chủ (đến nginx.org/en/docs/ngx_core_module.html ).
Charles Duffy

175

Để mở rộng câu trả lời của Charles Duffy, Nginx sử dụng daemon offchỉ thị để chạy ở phía trước. Nếu việc đặt tệp này vào tệp cấu hình không thuận tiện, chúng ta có thể chỉ định nó trực tiếp trên dòng lệnh. Điều này giúp bạn dễ dàng chạy trong chế độ gỡ lỗi (nền trước) và trực tiếp chuyển sang chạy ở chế độ sản xuất (nền) bằng cách thay đổi dòng lệnh args.

Để chạy trong foreground:

nginx -g 'daemon off;'

Để chạy trong nền:

nginx

3
Ai đó có thể giải thích "-g" thực sự là gì không? Tôi không thể tìm thấy công tắc này trong các tài liệu chỉ một ví dụ này với nginx sử dụng nó.
red888

5
@ red888, đặt tùy chọn cấu hình toàn cầu.
Charles Duffy

1
CMDsẽ CMD ["nginx", "-g", "daemon off;"] dành cho
docker

55

Để mở rộng câu trả lời của John, bạn cũng có thể sử dụng Dockerfile CMDlệnh như sau (trong trường hợp bạn muốn nó tự khởi động mà không cần thêm đối số)

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

10

Thêm lệnh này vào Dockerfile có thể vô hiệu hóa nó:

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



6

Để thêm câu trả lời của Tomer và Charles,

Cú pháp để chạy nginx trong forground trong Docker container bằng Entrypoint:

ENTRYPOINT nginx -g 'daemon off;' 

Không liên quan trực tiếp nhưng để chạy nhiều lệnh với Entrypoint:

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


0

Đối với tất cả những người đến đây cố gắng chạy một hình ảnh nginx trong một container docker, nó sẽ chạy như một dịch vụ

Vì không có toàn bộ Dockerfile, đây là toàn bộ Dockerfilevấn đề của tôi .

Đẹp và làm việc. Cảm ơn tất cả các câu trả lời ở đây để giải quyết vấn đề nginx cuối cùng.

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

Và chạy nó với:

docker run -p 80:80 -p 443:443 -dit
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.