【问题标题】:Unable to change nginx.conf file无法更改 nginx.conf 文件
【发布时间】:2018-04-14 08:38:37
【问题描述】:

我有一个运行 CentOS6.7 的 vagrant-box,我在其上运行 docker 容器。我打算在容器内运行由 nginx 提供的烧瓶应用程序。我必须在 nginx.conf 文件中进行某些更改,以通过 nginx 为我的应用程序(app1)提供服务。这可能看起来有点奇怪,但我无法更改 /etc/nginx/conf.d/nginx.conf 中的 nginx.conf 文件

这是我所做的:

方法一:Dockerfile中的变化

我的 Dockerfile 如下所示:

FROM tiangolo/uwsgi-nginx-flask:flask
COPY ./app /app
COPY ./changes/nginx.conf /etc/nginx/conf.d/nginx.conf
COPY ./changes/nginx.conf /app/

./changes/nginx.conf 看起来像这样:

server {
    location /app1/ {
        try_files $uri @app;
    }
    location @app {
        include uwsgi_params;
        uwsgi_pass unix:///tmp/uwsgi.sock;
    }
    location /static {
        alias /app/static;
    }
}

注意上面服务器块中的位置从location /location /app1/

构建镜像并运行 docker 容器后,我执行到正在运行的容器中

sudo docker exec -ti CONTAINER_ID /bin/bash

cat /app/nginx.conf 显示更新的 nginx.conf 文件的存在(位置从 / 更改为 /app1/

cat /etc/nginx/conf.d/nginx.conf 仍然显示旧的conf 文件(位置仍然是/) 我想也许第二个 COPY 行没有成功执行,并且 docker 没有在控制台上抛出错误(sudo?)。因此,我手动更改了 conf 文件并执行了 docker commit - 下面提到的第二种方法。

方法二:Docker 提交

docker容器启动并运行后,我使用exec登录容器

[vagrant@localhost]$ sudo docker exec -ti CONTAINER_ID /bin/bash

[root@CONTAINER_ID]# vi /etc/nginx/conf.d/nginx.conf

更改文件以反映以下内容:

server {
    location /app1/ {
        try_files $uri @app;
    }
    location @app {
        include uwsgi_params;
        uwsgi_pass unix:///tmp/uwsgi.sock;
    }
    location /static {
        alias /app/static;
    }
}

保存文件wq! 并退出容器。 之后我做了sudo docker commit CONTAINER_ID my_new_image

启动一个新容器并重新登录到在 my_new_image 上运行的容器仍然会在 /etc/nginx/conf.d/nginx.conf 中提供以下 nginx.conf 文件:

server {
    location / {
        try_files $uri @app;
    }
    location @app {
        include uwsgi_params;
        uwsgi_pass unix:///tmp/uwsgi.sock;
    }
    location /static {
        alias /app/static;
    }
}

我可以看出 my_new_image 有一些变化,因为它的大小比 tiangolo/uwsgi-nginx-flask-docker 大,因为我安装了 vim 来编辑文件。但不知何故,文件更改并没有在 /etc/nginx/conf.d/nginx.conf 中持续存在

我做错了什么?

更新 Github 仓库:https://github.com/VimanyuAgg/flask-nginx.git

【问题讨论】:

  • 对此更新:我删除了 COPY ./changes/nginx.conf /etc/nginx/conf.d/nginx.conf 并添加了 RUN rm /etc/nginx/conf.d/nginx。 conf 但是在容器创建之后,nginx.conf 仍然在 /etc/nginx/conf.d/nginx.conf 里面!

标签: docker nginx flask vagrant


【解决方案1】:

我建议您将配置文件放在一个卷中,这样您就可以在主机上编辑该文件,并且它也会在容器内进行更改。

为此,您可以使用

运行您的容器
docker run -d -v /path/to/changes/nginx.conf:/etc/nginx/conf.d/nginx.conf IMAGE_NAME

配置更改后,不要忘记测试并应用配置

docker exec -ti CONTAINER_NAME /bin/sh -c "nginx -t && nginx -s reload"

另外我建议你不要在镜像中安装 vim,因为镜像应该是轻量级的,应该避免安装不必要的包

【讨论】:

  • 仍然没有更改 nginx.conf 文件。我完全同意不要在图像中安装 vim 的建议。我添加了 vim 只是为了看看是否可以看到任何类型的图像变化。提供 github 的链接。请您检查并尝试一下。
  • 我试了一下,遇到了同样的问题(在主机上将location /更改为location /api/,而文件已挂载)。为什么容器内的文件与主机上的文件不同,这对我来说是一个奇迹。它应该是相同的确切文件。无论如何,我认为它与父图像有关,因为您的应用程序甚至还没有启动,官方的 nginx 图像没有这个问题。你依赖那个特定的图像吗?
  • 其实我在父图片中发现了错误。它的入口点是启动一个脚本,它将配置设置为错误的location。在您自己的 Dockerfile 中,您需要一个 ENTRYPOINT 来覆盖它。 Dockerfile 参考可能会帮助你link。还有Best Practices.
  • 呃,忘记之前的评论了,抱歉。 ENTRYPOINT 不能解决问题。问题是,该文件是事先在图像层(在父图像中)创建的,它是只读的。因此,遗憾的是,您无法更改或覆盖所述文件。我会用你能做的事情来创建一个单独的答案,给我一秒钟
【解决方案2】:

事实证明,父图像已经在图像中添加了一个特定文件,该文件是只读的。这意味着您很遗憾无法更改或覆盖该文件。

解决这个问题的一个 hacky 解决方案是将 /etc/nginx/conf.d 文件夹挂载到您主机上的一个目录中(假设是 /usr/local/share/nginxconf)并在那里更改文件,该文件位于另一个命名空间和不同的权限 (afaik) 中。它对我有用。

docker create -v /usr/local/share/nginxconf:/etc/nginx/conf.d --name flask-test IMAGE_NAME

vim /usr/local/share/nginxconf/nginx.conf

另一个更好的解决方案是获取另一个父图像,它不会预先添加文件。但是我不知道您的应用程序需要哪些依赖项,因此这可能是一个痛苦的搜索。当然,您也可以创建自己的(这也将给您一些编写 Dockerfile 的培训)。

参考编写成功的 Dockerfile:

Dockerfile Reference

Dockerfile Best Practices

Handy tutorial to dockerize PostreSQL by Docker

【讨论】:

  • 感谢您查看 repo 并找出父图像的只读性质。我已将此作为图像作者的问题打开。因此,我会将您的解决方案视为答案。我希望在我以 root 权限执行到容器后,我将能够更改 /etc/nginx/conf.d/nginx.conf 文件.. 但正如你所说,我相信问题出在父级上图片。感谢您提供的所有帮助和资源!
【解决方案3】:

目前我使用相同的图像来部署 django 的应用程序。 该图像有一个脚本,在容器启动时执行。

对我来说,解决方案是使用我的自定义配置 nginx.conf 创建一个新文件,然后修改脚本 prestart.sh 添加新行以复制和替换 /etc/conf.d/nginx.conf 中的默认文件

create new custom file /mypath/file_Custom_nginx.conf

然后在脚本 prestart.sh 中添加新行

cp /mypath/file_Custom_nginx.conf /etc/conf.d/nginx.conf

重启容器。

现在每次重新启动脚本都会替换文件配置 nginx。

注意:我使用supervisord管理服务nginx

希望对你有帮助

【讨论】:

    猜你喜欢
    • 2017-05-28
    • 1970-01-01
    • 2021-09-04
    • 1970-01-01
    • 1970-01-01
    • 2010-11-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多