挂载/ etc / nginx /容器时不运行

时间:2019-08-31 00:52:02

标签: docker nginx nginx-config

我想将/ 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还是很陌生,所以如果这是一个愚蠢的问题,请原谅我。

2 个答案:

答案 0 :(得分: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

答案 1 :(得分:1)

正如注释和@Adiii的answer中指出的那样,当您“覆盖”容器配置时(应将其视为安装USB),应避免将目录绑定安装到/etc/nginx/设备到已经包含文件的文件夹中,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(鉴于容器--rmdocker 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图像。