我有一个运行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的参考:
Handy tutorial to dockerize PostreSQL by Docker