无法更改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,因为图像应该是轻量级的,不必要的软件包应该放弃安装
- (gcloud.preview.app.deploy)意外的错误。 部署版本
- 我如何保持对Postgresql Docker容器所做的更改?
- 在Docker容器中只logging来自PHP-FPM的真实致命错误
- 运行或重新启动PostgreSQL映像后,Docker容器立即退出
- 在Windows上的Docker – 生成不工作
- Docker&Postgres:无法绑定已经在使用的tcp 0.0.0.0:5432地址
- 在运行rabbitmq的Docker容器上远程创build虚拟主机
- 如何build模Docker / Kubernetes的PostgreSQL故障转移群集?
- 使用Docker填充Cassandra Db