[英]Custom nginx container exits immediately when part of docker-compose
我正在尝试使用简单的nginx容器设置来学习如何使用docker compose,该容器将请求重新路由到ghost容器。 我正在使用标准的鬼影,但有一个自定义的nginx图像(继承自标准图像)。
当我使用“docker-compose up”运行合成时,它立即退出“docker_nginx_1退出代码0”。 但是,当我手动构建并运行它时,它运行正常,我可以将浏览器导航到容器并查看默认的nginx页面。 我对我的compose文件有什么误解,导致它的行为与自定义构建不同? 我可以改变什么让它继续运行?
免责声明:我也在学习nginx,所以一次学习两件事可能会给我带来不应有的问题。
编辑:原始文件有点复杂,但我简单地将问题简化为:如果我使用构建命令的自定义图像除了从默认的nginx图像继承,它立即退出。 如果我使用默认的nginx图像,它可以工作。 这些是现在相关的文件:
撰写文件:
ghost:
expose:
- "2368"
image: ghost
nginx:
# image: nginx << If I use this instead of my custom build, it doesn't exit
build: ./nginx
ports:
- "80:80"
- "443:443"
links:
- ghost
nginx的/ Dockerfile:
FROM nginx
原始文件(使用与上面相同的撰写文件):
nginx的/ Dockerfile:
FROM nginx
RUN rm /etc/nginx/nginx.conf
COPY conf/nginx.conf /etc/nginx/nginx.conf
COPY conf/sites-available/ghost /etc/nginx/sites-available/ghost
RUN mkdir /etc/nginx/sites-enabled
RUN ln -s /etc/nginx/sites-available/ghost /etc/nginx/sites-enabled/ghost
EXPOSE 80 443
# Is this even the right command I have no idea
CMD service nginx start
nginx的/ conf目录/ nginx.conf:
daemon off;
user nginx;
# Let nginx figure out the processes I guess
worker_processes auto;
error_log /var/log/nginx/error.log warn;
pid /var/run/nginx.pid;
events {
worker_connections 1024;
}
http {
include /etc/nginx/mime.types;
default_type application/octet-stream;
log_format main '$remote_addr - $remote_user [$time_local] "$request" '
'$status $body_bytes_sent "$http_referer" '
'"$http_user_agent" "$http_x_forwarded_for"';
access_log /var/log/nginx/access.log main;
sendfile on;
#tcp_nopush on;
keepalive_timeout 65;
#gzip on;
include /etc/nginx/conf.d/*.conf;
}
nginx的/ conf目录/网站可用/鬼
server {
listen 80;
server_name 127.0.0.1;
access_log /var/log/nginx/localhost.log;
location / {
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header HOST $http_host;
proxy_set_header X-NginX-Proxy true;
proxy_pass http://0.0.0.0:2368;
proxy_redirect off;
}
}
运行组合:
plays-MacBook-Pro:docker play$ docker-compose up
Creating docker_ghost_1...
Creating docker_nginx_1...
Attaching to docker_ghost_1, docker_nginx_1
docker_nginx_1 exited with code 0
Gracefully stopping... (press Ctrl+C again to force)
Stopping docker_ghost_1... done
手动运行:
plays-MacBook-Pro:nginx play$ docker build --no-cache -t nginx_custom .
Sending build context to Docker daemon 8.704 kB
Step 0 : FROM nginx
---> 914c82c5a678
Step 1 : RUN rm /etc/nginx/nginx.conf
---> Running in 4ce9de96bb36
---> 98f97a9da4fc
Removing intermediate container 4ce9de96bb36
Step 2 : ADD conf/nginx.conf /etc/nginx/nginx.conf
---> dd3e089208a9
Removing intermediate container 36b9a47e0806
Step 3 : ADD conf/sites-available/ghost /etc/nginx/sites-available/ghost
---> 55fae53e5810
Removing intermediate container a82741d24af4
Step 4 : RUN mkdir /etc/nginx/sites-enabled
---> Running in 7659ead01b7b
---> 406be1c42394
Removing intermediate container 7659ead01b7b
Step 5 : RUN ln -s /etc/nginx/sites-available/ghost /etc/nginx/sites-enabled/ghost
---> Running in e9658a08affa
---> 021a84216e8a
Removing intermediate container e9658a08affa
Step 6 : EXPOSE 80 443
---> Running in 230e4523794c
---> 23d85e1a04cb
Removing intermediate container 230e4523794c
Step 7 : CMD service nginx start
---> Running in 209e129cae21
---> d7004d6fa223
Removing intermediate container 209e129cae21
Successfully built d7004d6fa223
plays-MacBook-Pro:nginx play$ docker run -t nginx_custom
[It sits here on an empty line, running in the background]
Dockerfile
的CMD应该启动一个需要在前台运行的进程。 命令service nginx start
以deamon模式运行进程,因此您的容器会干净地退出,因为service
命令退出。
使用以下CMD ["nginx", "-g", "daemon off;"]
启动nginx(取自官方图片 ),它应该可以正常工作。
刚遇到同样的问题,最初的修复是在docker-compose.yml
更改服务的名称。
这有效,但它起作用的原因是因为Docker-compose缓存构建并将其与服务名称联系起来。 每个docker-compose up
在第一个之后docker-compose up
只使用它之前构建的内容,因此您对Dockerfile
或Dockerfile
docker-compose.yml
那个部分所做的任何更改基本上都会被忽略。
当您(和我)更改了服务名称时,它会触发一个新的构建,因为之前没有标记该服务名称。
真正的解决方案是执行: docker-compose构建来重建映像(然后是docker-compose up
)。 他们的文档并没有真正强调这个问题。
你也可以添加一个
tty: true
到docker-compose.yml
的服务:
webserver:
build: .
volumes:
- "./src:/var/www/html"
ports:
- 8080:80
depends_on:
- aap-mysql
tty: true
它应该继续运行
docker-compose up
我弄清楚它是什么。 我需要将我的作品的nginx部分命名为'nginx'之外的其他部分。 我不确定是不是因为已经存在nginx图像或者是否是其他内容,但更改它使其正常工作。
通过将我的撰写文件更改为:
ghost:
expose:
- "2368"
image: ghost
mything:
# image: nginx
build: ./nginx
ports:
- "80:80"
- "443:443"
links:
- ghost
我能够让它发挥作用。 一个指标是,当名称发生变化时,我实际上看到了我的容器的构建过程输出。 如果有人确切知道为什么命名需要那样,我很想知道。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.