2014-06-16 18 views
23

Tôi đã thử sau một số hướng dẫn và tài liệu về dockerizing máy chủ web của tôi, nhưng tôi đang gặp khó khăn nhận được dịch vụ để chạy qua lệnh Docker chạy.Dockerized nginx không được bắt đầu

Đây là Dockerfile tôi:

FROM ubuntu:trusty 

#Update and install stuff 
RUN apt-get update 
RUN apt-get install -y python-software-properties aptitude screen htop nano nmap nginx 

#Add files 
ADD src/main/resources/ /usr/share/nginx/html 

EXPOSE 80 
CMD service nginx start 

tôi có thể tạo hình ảnh của tôi:

docker build -t myImage . 

Và khi tôi chạy nó:

docker run -p 81:80 myImage 

nó dường như chỉ dừng lại:

docker ps -a 

CONTAINER ID  IMAGE    COMMAND    CREATED    STATUS    PORTS    NAMES 
90e54a254efa  pms-gui:latest  /bin/sh -c service n 3 seconds ago  Exit 0         prickly_bohr 

Tôi mong đợi điều này sẽ được chạy với cổng 81-> 80 nhưng nó không phải là. Chạy

docker start 90e 

dường như không làm gì cả.

Tôi cũng đã cố gắng vào nó trực tiếp

docker run -t -i -p 81:80 myImage /bin/bash 

và từ đây tôi có thể bắt đầu dịch vụ

service nginx start 

và từ tab khác tôi có thể nhìn thấy nó đang làm việc như dự định (cũng trong trình duyệt của tôi) :

CONTAINER ID  IMAGE    COMMAND    CREATED    STATUS    PORTS    NAMES 
408237a5e10b  myImage:latest  /bin/bash   12 seconds ago  Up 11 seconds  0.0.0.0:81->80/tcp mad_turing 

Vì vậy, tôi cho rằng đó là điều tôi đang làm sai với Dockerfile của mình? Bất cứ ai có thể giúp tôi với điều này, tôi khá mới để Docker. Cảm ơn bạn!

GIẢI PHÁP: Dựa trên câu trả lời từ Ivant, tôi tìm thấy một cách khác để bắt đầu nginx ở nền trước. Dockerfile CMD của tôi bây giờ trông giống như:

CMD /usr/sbin/nginx -g "daemon off;" 

Trả lời

17

Docker chứa chạy càng lâu càng lệnh bạn chỉ định với CMD, ENTRTYPOINT hoặc thông qua dòng lệnh đang chạy. Trong trường hợp của bạn, lệnh service sẽ kết thúc ngay lập tức và toàn bộ vùng chứa sẽ bị tắt.

Một cách để khắc phục điều này là bắt đầu nginx trực tiếp từ dòng lệnh (chắc chắn rằng bạn không chạy nó như là một daemon).

Một lựa chọn khác là tạo ra một kịch bản nhỏ mà bắt đầu các dịch vụ và sau đó ngủ mãi mãi. Một cái gì đó như:

#!/bin/bash 
service nginx start 
while true; do sleep 1d; done 

và chạy thay vì chạy trực tiếp lệnh service.

Một lựa chọn thứ ba sẽ được sử dụng một cái gì đó giống như chương trình runit hoặc tương tự, thay vì các dịch vụ bình thường.

+0

Cảm ơn bạn, điều này là khá rõ ràng khi bạn giải thích nó :) Tôi đã tạo ra một kịch bản vòng lặp và có lẽ sẽ phát triển giải pháp đó trong thời gian. Bây giờ tôi ít nhất biết tại sao! – Solvemon

+0

Dòng đầu tiên có thể là một phần của tài liệu. – Vor

4

Trình cắm làm chỉ mục rất đẹp về hình ảnh chính thức và người dùng. Khi bạn muốn làm điều gì đó, rất có thể là một người nào đó đã làm nó;)

Chỉ cần tìm kiếm cho 'nginx' trên index.docker.io, bạn sẽ thấy, có một hình ảnh nginx chính thức: https://registry.hub.docker.com/_/nginx/

Ở đó bạn có hướng dẫn đầy đủ để giúp bạn khởi động máy chủ web của mình.

Hãy thoải mái để có một cái nhìn vào những người dùng khác ảnh nginx để xem phiên bản :)

Ý tưởng là để bắt đầu nginx trong chế độ foreground.

+0

Phần chính là lệnh CMD trong https://github.com/nginxinc/docker-nginx/blob/master/stable/stretch/Dockerfile: 'CMD [" nginx "," -g "," daemon tắt; " ] ' – bonh

41

Tính đến bây giờ, hình ảnh nginx chính thức sử dụng này để chạy nginx (xem the Dockerfile):

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

Trong trường hợp của tôi, đây là đủ để có được nó để bắt đầu đúng cách. Có hướng dẫn trực tuyến cho thấy những cách khó khăn hơn để hoàn thành điều này nhưng ở trên có vẻ khá sạch sẽ.

+3

Đây là cách đúng đắn. – wieczorek1990

5

Sử dụng Docker-soạn:

Để thực hiện theo các giải pháp khuyến khích, thêm vào Docker-compose.yml:

command: nginx -g "daemon off" 

Tôi cũng thấy tôi chỉ đơn giản có thể thêm vào nginx.conf:

daemon off; 

... và tiếp tục sử dụng trong docker-compose.yml:

command: service nginx start 

... mặc dù nó sẽ làm cho tập tin cấu hình ít di động bên ngoài docker.

Các vấn đề liên quan