首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >自定义nginx容器在部分停靠组合时立即退出。

自定义nginx容器在部分停靠组合时立即退出。
EN

Stack Overflow用户
提问于 2015-11-15 19:40:59
回答 3查看 43.6K关注 0票数 34

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

当我使用"docker_nginx_1“运行组合时,它将立即退出,并使用”docker_nginx_1退出代码0“。但是,当我手动构建和运行它时,它运行得很好,我可以将浏览器导航到容器并查看默认的nginx页面。我对我的撰写文件有什么误解,因为它的行为与自定义构建不同?我能改变什么让它保持运转?

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

编辑:原始文件稍微复杂一些,但我已经将问题简化为:如果我对一个只从默认的nginx映像继承的定制映像使用build命令,它就会立即退出。如果我使用默认的nginx映像,它就能工作。这些是现在相关的档案:

撰写文件:

代码语言:javascript
复制
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:

代码语言:javascript
复制
FROM nginx

原始文件(与上面的组成文件相同):

nginx/Dockerfile:

代码语言:javascript
复制
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:

代码语言:javascript
复制
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/站点-可用/鬼

代码语言:javascript
复制
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;
  }
}

运行组合:

代码语言:javascript
复制
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

手动运行:

代码语言:javascript
复制
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]
EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2016-03-11 21:49:07

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

这是可行的,但是它工作的原因是因为Docker缓存构建&将它绑定到服务名称。第一个之后的每个docker-compose up都使用它以前构建的内容,所以您对Dockerfiledocker-compose.yml的那个部分所做的任何更改基本上都会被忽略。

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

真正的解决方案是执行一个:船坞-构形来重建映像(后面是一个docker-compose up)。他们的文档并没有真正强调这个问题。

票数 30
EN

Stack Overflow用户

发布于 2017-01-02 20:18:54

您还可以添加

代码语言:javascript
复制
tty: true

docker-compose.yml中的服务

代码语言:javascript
复制
webserver:
    build: .
    volumes:
        - "./src:/var/www/html"
    ports:
        - 8080:80
    depends_on:
        - aap-mysql
    tty: true

它应该一直跑下去

代码语言:javascript
复制
docker-compose up
票数 12
EN

Stack Overflow用户

发布于 2015-11-16 17:37:11

我弄明白了是什么。我需要命名我的作文的nginx部分,而不是'nginx‘。我不确定这是因为已经有了一个nginx图像,或者它是否是其他的东西,但是改变它使它正常工作。

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

代码语言:javascript
复制
ghost:
 expose:
   - "2368"
 image: ghost

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

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

票数 7
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/33724125

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档