docker - 无法更改 nginx.conf 文件

标签 docker nginx flask vagrant

我有一个运行 CentOS6.7 的 vagrant-box,我在上面运行 docker 容器。我打算在容器内运行由 nginx 提供服务的 Flask 应用程序。我必须在 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;
    }
}

请注意上述服务器 block 中的位置从 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提交 - 下面提到的第二种方法。

方法2:Docker提交

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

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

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

更改文件以反射(reflect)以下内容:

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

最佳答案

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

对此的一个巧妙的解决方案是将 /etc/nginx/conf.d 文件夹挂载到主机上的目录中(比方说 /usr/local/share/nginxconf code>)并更改那里的文件,该文件位于另一个命名空间和不同的权限中(据我所知)。这对我来说很有效。

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

关于docker - 无法更改 nginx.conf 文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47064845/

相关文章:

Docker撰写无效的卷目标路径: '.' mount path must be absolute

python - 如何从 jinja2 中的变量内部打印空格

javascript - 即使建立连接后,Flask socketio 也没有收到来自 javascript 的任何消息

python - nginx、uwsgi、django。 uwsgi 作为普通用户运行良好,由 root 启动时失败,即使使用 su -u nonroot

dictionary - map 指令未正确读取 nginx 入口 Controller kubernetes

performance - 为什么提供缓存页面需要一秒钟?

python-2.7 - 请求中缺少表单数据

DockerFile 单行 vs 多行指令

docker - 为什么执行 Golang 可执行文件的 docker 容器在启动后立即挂起?

php - 在 Nginx 反向代理后面运行 Apache(使用 .htaccess)应用程序