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

Mer*_*gic 22 nginx docker 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
Run Code Online (Sandbox Code Playgroud)

nginx的/ Dockerfile:

FROM nginx
Run Code Online (Sandbox Code Playgroud)

原始文件(使用与上面相同的撰写文件):

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
Run Code Online (Sandbox Code Playgroud)

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;
}
Run Code Online (Sandbox Code Playgroud)

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;
  }
}
Run Code Online (Sandbox Code Playgroud)

运行组合:

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
Run Code Online (Sandbox Code Playgroud)

手动运行:

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]
Run Code Online (Sandbox Code Playgroud)

mic*_*lik 31

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

使用以下CMD ["nginx", "-g", "daemon off;"]命令启动nginx(取自官方图片),它应该正常工作.

  • @dnephin 虽然这似乎是正确的,但这样做并不是使我的特定配置正常运行的操作。更改为 `CMD ["nginx", "-g", "daemon off;"]` 不会使其开始工作。当 compose 中的名称更改时,它会起作用。我不知道它是否应该与“service nginx start”一起运行,但似乎是。如果您想尝试一下,https://gitlab.com/merrillogic/docker-compose-nginx 上有一个示例存储库,其中有两个提交 - 不起作用和工作。也许还有一个额外的因素导致了这种不当行为。 (3认同)

Ger*_*rat 21

刚遇到同样的问题,最初的解决方法是更改服务的名称docker-compose.yml.

这有效,但它起作用的原因是因为Docker-compose缓存构建并将其与服务名称联系起来.docker-compose up在第一个之后,每次只使用它之前构建的内容,因此您Dockerfile对该部分所做的任何更改或docker-compose.yml基本上都会被忽略.

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

真正的解决方案是做一个:搬运工-撰写生成重建图像(后面跟一个docker-compose up).他们的文档并没有真正强调这个问题.

  • 这应该是公认的答案.我一直在使用`docker build`但显然在使用compose时你必须使用`docker-compose build重建 (2认同)

小智 11

你也可以添加一个

tty: true
Run Code Online (Sandbox Code Playgroud)

你的服务docker-compose.yml:

webserver:
    build: .
    volumes:
        - "./src:/var/www/html"
    ports:
        - 8080:80
    depends_on:
        - aap-mysql
    tty: true
Run Code Online (Sandbox Code Playgroud)

它应该继续运行

docker-compose up
Run Code Online (Sandbox Code Playgroud)


Mer*_*gic 5

我弄清楚那是什么。我需要将合成的nginx部分命名为'nginx'以外的名称。我不确定这是因为已经有nginx图像还是其他图像,但是更改它会使它正常工作。

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

ghost:
 expose:
   - "2368"
 image: ghost

mything:
  # image: nginx
  build: ./nginx
  ports:
    - "80:80"
    - "443:443"
  links:
   - ghost
Run Code Online (Sandbox Code Playgroud)

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