无法更改nginx.conf文件

我有一个运行CentOS6.7的stream浪盒,我正在运行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; } } 

请注意上述服务器块中位置的更改(位置location / location /app1/

在build立镜像之后,我运行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来login到容器中

 [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

启动一个新的容器并重新login到在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

事实certificate,父图像已经添加了一个特定的文件到图像,这是只读的。 这意味着你可悲的是不能改变或覆盖文件。

解决这个问题的方法是将/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 

另一个更有趣的解决scheme是采取另一个父图像,而不是事先添加文件。 但是我不知道你的应用需要什么依赖,所以这可能是一个痛苦的search。 你当然也可以创build自己的(这也会给你一些编写Dockerfiles的培训)。

编写一个成功的Dockerfile的参考:

Dockerfile参考

Dockerfile最佳实践

Docker对dockerize PostreSQL方便的教程

我build议你把你的configuration文件放在一个卷中,这样你就可以在主机上编辑这个文件,并且它也会在容器内被修改。

要做到这一点,你可以运行你的容器

 docker run -d -v /path/to/changes/nginx.conf:/etc/nginx/conf.d/nginx.conf IMAGE_NAME 

更改configuration后,不要忘记testing并应用configuration

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

另外,我build议你不要在图像中安装vim,因为图像应该是轻量级的,不必要的软件包应该放弃安装