【问题标题】:Docker + NGINX, how can I copy the configuration file from host to container?Docker + NGINX,如何将配置文件从主机复制到容器?
【发布时间】:2018-03-13 11:18:49
【问题描述】:

这是我的基本 NGINX 设置!

web:
  image: nginx
  volumes:
   - ./nginx:/etc/nginx/conf.d
  ....

我通过使用COPY ./nginx /etc/nginx/conf.d./nginx 复制到/etc/nginx/conf.d 来替换volumes 到我的容器中。问题是因为通过使用值 nginx.conf 引用我的主机中的日志文件而不是我的容器。所以,我想通过将配置文件硬拷贝到容器中来解决我的问题。

然而,NGINX 在docker compose up 根本没有运行。怎么了?

编辑:

Dockerfile

FROM python:3-onbuild

COPY ./ /app
COPY ./nginx /etc/nginx/conf.d

RUN chmod +x /app/start_celerybeat.sh
RUN chmod +x /app/start_celeryd.sh
RUN chmod +x /app/start_web.sh

RUN pip install -r /app/requirements.txt
RUN python /app/manage.py collectstatic --noinput
RUN /app/automation/rm.sh

docker-compose.yml

version: "3"  
services:  
  nginx:
    image: nginx:latest
    container_name: nginx_airport
    ports:
      - "8080:8080"
  rabbit:
      image: rabbitmq:latest
      environment:
          - RABBITMQ_DEFAULT_USER=admin
          - RABBITMQ_DEFAULT_PASS=asdasdasd
      ports:
          - "5672:5672"
          - "15672:15672"
  web:
    build:
      context: ./
      dockerfile: Dockerfile
    command: /app/start_web.sh
    container_name: django_airport
    expose:
      - "8080"
    links:
      - rabbit
  celerybeat:
    build: ./
    command: /app/start_celerybeat.sh
    depends_on:
      - web
    links:
      - rabbit
  celeryd:
    build: ./ 
    command: /app/start_celeryd.sh
    depends_on:
      - web
    links:
      - rabbit

【问题讨论】:

  • 如果您已将卷标签替换为 COPY,则应粘贴 Dockerfile 以全面了解您的问题。
  • @lifeisfoo,对不起,我更新了我的答案。 Dockerfile 是“web”服务的 Dockerfile。它在 NGINX 启动之前加载,所以我想我把它放在那里。
  • 看起来你混淆了webnginx。如果您想要 nginx 的自定义图像,则需要单独的 Dockerfile-nginx
  • @schmunk,是吗?好吧,因为 NGINX 只需要 COPY ./nginx /etc/nginx/conf.d 我想我可以把和 web 一样的 Dockerfile 放进去。因为无论如何,网络永远是第一位的。
  • @notalentgeek 如果答案解决了您的问题,请接受。所以未来的访客可以认出它。

标签: docker nginx docker-compose


【解决方案1】:

这是有效的初始设置:

web:
  image: nginx
  volumes:
   - ./nginx:/etc/nginx/conf.d

在这里,您有一个 bind volume 代理,在您的容器内,所有文件系统请求在 /etc/nginx/conf.d 到您的主机 ./nginx。所以没有副本,只有绑定。 这意味着如果您更改 ./nginx 文件夹中的文件,您的容器将实时看到更新后的文件。

从主机加载配置

在您上次的设置中,只需在nginx 服务中添加一个volume。 您还可以删除 Web 服务 Dockerfile 中的 COPY ./nginx /etc/nginx/conf.d 行,因为它没用。

图片内的捆绑配置

相反,如果您想将您的 nginx 配置捆绑到一个 nginx 映像中,您应该构建一个自定义 nginx 映像。创建Dockerfile.nginx 文件:

FROM nginx
COPY ./nginx /etc/nginx/conf.d

然后改变你的 docker-compose:

version: "3"  
services:  
  nginx:
    build:
      dockerfile: Dockerfile.nginx
      container_name: nginx_airport
      ports:
        - "8080:8080"
# ...

现在您的 nginx 容器中将包含配置,您不需要使用卷。

【讨论】:

  • 不,我不是这个意思。我想将 NGINX 配置放入容器中。不是通过安装它,因此是COPY。但是,使用COPY-ing NGINX 配置,似乎我在容器中的 NGINX 根本没有运行,尽管安装位置和复制位置都相同。
  • 容器有独立的文件系统,所以如果你在你的 web 服务镜像中复制 nginx 配置,nginx 容器将无法“看到”它。只有 Web 服务容器内的进程才能看到它。
  • @lifeisfoo 详细说明的内容与我在上面的评论中试图说明的内容相同。如果您在 web 映像上有配置,则可以在 nginx 映像中使用 volumes_from: -web,但我强烈建议不要这样做,因为在尝试更新容器时会产生很多奇怪的副作用。跨度>
  • 不能 复制一个文件到一个带有 docker compose 的容器中。这样做的原因是因为维护人员发现它是短视的,因为每次创建容器时都需要重复 COPY 操作。例如。运行docker-compose。正如您在github.com/docker/compose/issues/5523 看到的那样,这对社区来说是一个非常有争议的问题。坦率地说,我认为维护人员是“正确的”,但是......当我只想复制一个 nginx.conf 而现在我需要在我的项目根目录中创建一个单独的 Dockerfile 时。嗯。 nbd 我猜
  • @lifeisfoo,我也有类似的要求,我使用 COPY 将我的配置复制到 nginx 映像。构建:复制失败:stat /var/lib/docker/tmp/docker-builder483163179/config/nginx/conf.d:没有这样的文件或目录”。我该如何解决这个问题?我的 dockerfile 不在根目录中,但 docker-compose 在根目录中。这可能是原因吗?
猜你喜欢
  • 2014-03-29
  • 2014-05-19
  • 1970-01-01
  • 2015-07-08
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多