当 docker-compose 的一部分时,自定义 nginx 容器立即退出

Posted

技术标签:

【中文标题】当 docker-compose 的一部分时,自定义 nginx 容器立即退出【英文标题】:Custom nginx container exits immediately when part of docker-compose 【发布时间】:2016-02-16 21:17:25 【问题描述】:

我正在尝试学习如何将 docker compose 与一个简单的 nginx 容器设置一起使用,该容器将请求重新路由到一个 ghost 容器。我使用的是标准的 ghost 映像,但有一个自定义的 nginx 映像(继承自标准映像)。

当我使用“docker-compose up”运行组合时,它会立即以“docker_nginx_1 exited with code 0”退出。但是,当我手动构建和运行它时,它运行良好,我可以将浏览器导航到容器并查看默认的 nginx 页面。我对我的撰写文件有什么误解,导致它的行为与自定义构建不同?我可以改变什么让它继续运行?

免责声明:我也在学习 nginx,所以一次学习两件事可能会给我带来不必要的问题。

编辑: 原始文件稍微复杂一些,但我已将问题简化为:如果我对自定义图像使用 build 命令,除了从默认 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/sites-available/ghost

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]

【问题讨论】:

您可以尝试不使用COPY conf/sites-available/ghost /etc/nginx/sites-available/ghost,看看与docker compose 一起使用时是否存在问题? 另外,由于github.com/dockerfile/nginx/blob/master/Dockerfile#L26 已经定义了CMD,请尝试不使用CMD @VonC 唉,如果我删除 COPY 命令,它仍然会立即退出,即使我将其减少到 FROM nginx 在 OP 发布此问题 5 年后来到这里。我的是一个在Nginx:stable-alpine 图像上运行的容器。 ***.com/a/55907197/6388351救了我!不过,这对本地开发来说是一种黑客攻击 【参考方案1】:

Dockerfile 中的 CMD 应该启动一个需要在前台运行的进程。命令service nginx start 以守护模式运行进程,因此您的容器干净地退出,因为service 命令退出。

使用下面的CMD ["nginx", "-g", "daemon off;"] 启动nginx(取自official image),它应该可以正常工作。

【讨论】:

不幸的是,这似乎并没有解决它。我在 nginx.conf 文件中有daemon off;,所以上面的代码应该没有问题。但是为了确保我对它进行了彻底的测试,我将 dockerfile 设置为 FROM nginx CMD ["nginx", "-g", "daemon off;"] 并且它仍然会立即退出。它甚至只使用 FROM nginx 。我将使用该信息相应地更新问题。 daemon off 并不是进程的守护进程。 service nginx start 告诉它在后台运行,而不是在前台运行。这是正确的答案。如果您将CMD service nginx start 替换为CMD nginx ...,它应该从前台开始。 @dnephin 虽然这似乎是正确的,但这样做并不是使我的特定配置正常运行的操作。更改为 CMD ["nginx", "-g", "daemon off;"] 不会使其开始工作。当 compose 中的名称更改时,它会起作用。我不知道它是否应该与service nginx start 一起运行,但似乎可以。如果您想尝试一下,gitlab.com/merrillogic/docker-compose-nginx 有一个示例 repo,其中包含两个提交 - 不起作用和工作。也许有一个额外的因素导致这种行为不端。 我有 CMD ["nginx"] 并且容器正在以状态码 0 退出。将其更改为 CMD ["nginx", "-g", "daemon off;"] 完美地解决了这个问题。非常感谢!【参考方案2】:

刚遇到同样的问题,最初的修复是更改docker-compose.yml中的服务名称。

这行得通,但它行得通的原因是因为 Docker-compose 缓存了构建并将其与服务名称相关联。第一个之后的每个docker-compose up 都使用它之前构建的内容,因此您对Dockerfiledocker-compose.yml 的那部分所做的任何更改基本上都会被忽略。

当您(和我)更改服务名称时,它触发了新的构建,因为该服务名称之前没有被标记。

真正的解决方案是执行:docker-compose build 来重建图像(后跟 docker-compose up)。他们的文档并没有真正强调这个问题。

【讨论】:

这应该是公认的答案。我一直在使用docker build,但显然在使用 compose 时,您必须使用 docker-compose build 进行重建【参考方案3】:

你也可以加个

tty: true

到您的docker-compose.yml 中的服务:

webserver:
    build: .
    volumes:
        - "./src:/var/www/html"
    ports:
        - 8080:80
    depends_on:
        - aap-mysql
    tty: true

它应该在

之后继续运行
docker-compose up

【讨论】:

【参考方案4】:

我知道它是什么。我需要将我的作品中的 nginx 部分命名为 'nginx' 以外的名称。我不确定是因为已经有一个 nginx 映像还是其他的东西,但是更改它可以使其正常工作。

通过将我的撰写文件更改为:

ghost:
 expose:
   - "2368"
 image: ghost

mything:
  # image: nginx
  build: ./nginx
  ports:
    - "80:80"
    - "443:443"
  links:
   - ghost

我能够让它工作。一个指标是,当名称更改时,我实际上看到了容器的构建过程输出。如果有人确切知道为什么需要这样命名,我很想知道。

【讨论】:

我刚刚遇到了同样的问题...将我的服务称为“网络”。 ......没有任何效果。 ...数小时的搜索/调整我的设置中可能出现的错误最终导致我写了这篇文章。 @Merrillogic:查看我对exactly why the naming needs to be that way的回答

以上是关于当 docker-compose 的一部分时,自定义 nginx 容器立即退出的主要内容,如果未能解决你的问题,请参考以下文章

当应用程序处于后台时,Flutter Cloud Messaging 自定义通知声音不起作用

我想在 Firebase onMessage 接收方法上播放自定义通知音,当锁定屏幕 android 手机时

ASP.net MVC 自定义声明

在 VS2019 上调试 docker-compose 时出错

使用自定义子视图滚动 UITableView 时重复数据

在 docker-compose 中挂载 NFS 卷时连接超时