Dockerfile COPY无法覆盖Nginx配置(或在容器启动时覆盖Nginx)-为什么?

时间:2018-07-17 13:44:21

标签: docker nginx lets-encrypt

我有一个Dockerfile,用于基于以下基本Docker映像对基于Python Flask的微服务进行容器化:https://github.com/tiangolo/uwsgi-nginx-flask-docker

在我的Dockerfile中,添加一个自定义nginx.conf并覆盖Nginx:

FROM tiangolo/uwsgi-nginx-flask:python3.6

ADD nginx.conf nginx.conf

COPY ./app /app
COPY ./data /app/data
COPY nginx.conf /etc/nginx/conf.d/

我的自定义nginx.conf仅包含一项更改-我准备的具有自定义域名的一个server_name

server {
    listen 80;
    location / {
        try_files $uri @app;
    }
    location @app {
        include uwsgi_params;
        uwsgi_pass unix:///tmp/uwsgi.sock;
    }
    location /static {
        alias /app/static;
    }
    server_name my-fully-qualified-domain-name.com;
}

这样做的原因是我想运行Let's Encrypt的certbot实用程序来强制Nginx在容器内仅使用SSL。

问题:Docker拒绝覆盖nginx.conf。几乎拒绝将我尝试的任何内容放入/etc/nginx/conf.d/

或者也许Docker 覆盖了它,但是Nginx在启动时(容器启动时)的某些内容覆盖了 my 的更改。我还没有弄清楚,但是我真的想通过自己的更改来掩盖nginx.conf

即使连接到容器并手动覆盖Nginx的配置-然后使用docker commit将这些更改提交到容器也会失败。我怀疑关于Docker的COPY命令的工作方式或docker commit的工作方式我尚不了解-有什么想法/建议吗?

注释#1 -我无法使用单独的Nginx配置文件(每个these instructions)来获得与server_name一起使用的自定义certbot字段。我能够获得certbot来选择正确的server_name的唯一方法是破坏和覆盖默认的nginx.conf,因此采用这种方法。也许我只是错误地使用了自定义Nginx配置文件-对该注释的任何建议将不胜感激-但我之前走过那条路,但没有成功。

注释#2 -我能够在运行 的容器上运行certbot(在附加并覆盖Nginx的配置之后),并且效果很好-SSL在我的容器上很棒-直到容器停止并重新启动。然后,一切都消失了,我需要覆盖Nginx的配置并再次运行certbot-一点都不理想。

1 个答案:

答案 0 :(得分:1)

您不应覆盖默认的nginx.conf文件(请参见https://github.com/tiangolo/uwsgi-nginx-flask-docker#customizing-nginx-configurations)。

但是,您仍然可以在/etc/nginx/conf.d/内的单独文件中添加自己的配置,这对于大多数用例来说已经足够了。

编辑:

如果这样不起作用,则可以修改entrypoint.sh以更好地满足您的需求,因为此处已设置nginx.conf。此问题包含更多信息:https://github.com/tiangolo/uwsgi-nginx-flask-docker/issues/39