docker – 无法更改nginx.conf文件

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

这是我做的:

方法1:更改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;
    }
}

请注意上述服务器块中位置/位置/ 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 – 下面提到的第二种方法.

方法2: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中,文件更改不会持续存在

我究竟做错了什么?

UPDATE
Github回购:https://github.com/VimanyuAgg/flask-nginx.git

解决方法:

事实证明,父图像已经将特定文件添加到图像中,该文件是只读的.这意味着您遗憾地无法更改或覆盖该文件.

一个hacky解决方案是将/etc/nginx/conf.d文件夹挂载到主机上的目录(比如/usr/local/share / nginxconf)并更改那里的文件,该文件位于另一个命名空间和不同的权限中(据我所知).它起作用了我的结局.

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

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

另一个更好的解决方案是采用另一个父图像,它不会事先添加文件.但我不知道你的应用程序需要什么依赖项,所以这可能是一个痛苦的搜索.您当然也可以创建自己的(这也可以为您提供编写Dockerfiles的培训).

编写成功的Dockerfile的参考:

Dockerfile Reference

Dockerfile Best Practices

Handy tutorial to dockerize PostreSQL by Docker

上一篇:PhpStorm和XDebug在Vagrant Homestead上


下一篇:php – Guzzle / curl无法解析主机