【问题标题】:When mounting /etc/nginx/ container doesnt run挂载 /etc/nginx/ 容器时不运行
【发布时间】:2020-01-04 03:54:42
【问题描述】:

我想将 /etc/nginx 文件夹挂载到主机上的自定义文件夹。但是,每当我尝试这个时,容器根本不会运行。安装其他任何东西似乎都不是问题,尽管我希望它安装到的文件夹总是空的。

我尝试使用 /usr/local/nginx/conf 或 /usr/local/etc/nginx 而不是 /etc/nginx 但文件夹始终为空。虽然在这里容器至少运行。这让我相信正是这种特定的安装导致了问题。

这就是我想做的。

docker run -p 80:80 -p 443:443 -v /home/pi/nginx_files/config:/etc/nginx -v /home/pi/nginx_files/certs:/etc/ssl/private -d nginx

容器似乎与任何其他文件夹一起运行,正如我尝试过的那样

docker run -p 80:80 -p 443:443 -v /home/pi/nginx_files/config:/etc/nginx/b -v /home/pi/nginx_files/certs:/etc/ssl/private -d nginx

只是看看是否有任何不存在的文件夹没有这个问题。

在此之前我尝试使用 docker composer 和 docker-compose.yaml

version: '3'

services:
  reverse:
    container_name: reverse
    hostname: reverse
    image: nginx
    ports:
      - 80:80
      - 443:443
    volumes:
      - <path/to/your/config>:/etc/nginx
      - <path/to/your/certs>:/etc/ssl/private

tried docker-compose up

但是它也遇到了同样的问题,它甚至没有启动容器。错误信息:

Creating network "nginx_files_default" with the default driver
Creating reverse ... done
Attaching to reverse
reverse    | 2019/08/31 00:41:07 [emerg] 1#1: open() "/etc/nginx/nginx.conf" failed (2: No such file or directory)
reverse    | nginx: [emerg] open() "/etc/nginx/nginx.conf" failed (2: No such file or directory)
reverse exited with code 1

如果我使用不存在的文件夹,它只会无限期地卡在“附加到反向”中。但是我没有收到“没有这样的文件或目录”的消息,尽管这些文件夹已经完全组成了名称并且绝对不存在。

我是否误解了安装的要点?我想我可以通过让容器将其保存在主机上来查看 default.conf 文件,但它不会创建一个吗?我必须自己创建一个然后将其安装到容器中吗?挂载是否会为容器创建一个要读取的文件夹而不是要写入的文件夹?我对 docker 和 linux 还很陌生,如果这是一个相当愚蠢的问题,请原谅我。

【问题讨论】:

  • official nginx 图像的文档提供了有关如何使用图像的信息。即挂载/path/to/nginx.conf:/etc/nginx/nginx.conf(你不想通过绑定挂载目录来覆盖/etc/nginx/目录中重要的nginx配置)。
  • 您可以从容器实例中提取默认配置文件的副本,即:docker run --rm -d --name nginx 然后 docker cp nginx:/etc/nginx/nginx.conf /path/to/nginx.conf/etc/nginx/conf.d/default.conf /path/to/default.conf - 可以根据自己的喜好修改它们并绑定安装它们/构建您与他们的自定义图像。之后可以使用docker stop nginx 停止容器。
  • 感谢 masseyb 这正是我所需要的。我想我确实误解了在这种情况下 mount 的含义。
  • 没问题,添加了answer,提供更多详细信息和示例。

标签: docker nginx nginx-config


【解决方案1】:

你不应该直接挂载整个/etc/nginx,它会破坏你的容器,因为它会覆盖以下文件和目录。

conf.d fastcgi_params koi-utf koi-win,mime.types 模块 nginx.conf scgi_params uwsgi_params 和 win-utf

不深入每个目录的细节,只需要mime.types它就会被覆盖,没有/etc/nginx/mime.types你的Nginx将永远无法运行

如果你想更新配置,那么你应该只挂载

/etc/nginx/conf.d

例如

docker run -p 80:80 -p 443:443 -v /home/pi/nginx_files/config:/etc/nginx/conf.d -v /home/pi/nginx_files/certs:/etc/ssl/private -d nginx

如果真的要更新nginx.conf,那么你应该挂载确切的文件,而不是整个目录

docker run -p 80:80 -p 443:443 -v /home/pi/nginx_files/config/nginx.conf:/etc/nginx/nginx.conf  -v /home/pi/nginx_files/certs:/etc/ssl/private -d nginx

【讨论】:

    【解决方案2】:

    正如 cmets 和 @Adiii 的 answer 中所指出的,您应该避免将目录绑定到 /etc/nginx/,因为您正在“覆盖”容器配置(将其视为将 USB 设备安装到文件夹已经包含文件的,ls -alF 将显示 USB 设备的内容,并且安装点中存在的文件只有在 USB 设备卸载后才可用)。

    您可以从正在运行的容器实例中提取nginx.confdefault.conf,例如:

    1. 运行nginx 容器:docker run --rm -d --name nginx nginx:1.17.3
    2. 使用docker cp复制出文件:docker cp nginx:/etc/nginx/nginx.conf /path/to/nginx.confdocker cp nginx:/etc/nginx/conf.d/default.conf /path/to/default.conf
    3. 停止容器:docker stop nginx(鉴于--rm 来自docker run,容器将被删除)

    然后您可以修改配置文件并将它们绑定到容器中,即:docker run --rm -d --name nginx -v /path/to/nginx.conf:/etc/nginx/nginx.conf nginx:1.17.3

    否则,您可以使用自定义配置构建自己的映像,例如:

    ├── default.conf
    ├── Dockerfile
    └── nginx.conf
    
    FROM nginx:1.17.3
    
    COPY nginx.conf /etc/nginx/nginx.conf
    COPY default.conf /etc/nginx/conf.d/default.conf
    

    您可以构建您的映像:docker build --rm -t so:57734446 . 并运行它:docker run --rm -d --name my-nginx so:57734446。对于图像的更高级用例,这是我的 nginx-modsecurity 构建,它扩展了 official nginx 图像。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-04-18
      • 2021-10-01
      • 1970-01-01
      • 1970-01-01
      • 2014-02-16
      • 1970-01-01
      • 2020-04-20
      • 2019-10-27
      相关资源
      最近更新 更多