尝试使用带有自定义 conf.d 的 docker-compose 运行 nginx 时出错

Posted

技术标签:

【中文标题】尝试使用带有自定义 conf.d 的 docker-compose 运行 nginx 时出错【英文标题】:Error trying to run nginx using docker-compose with custom conf.d 【发布时间】:2020-09-24 14:48:24 【问题描述】:

我正在尝试设置一个包含多个容器的 Web 服务器 - 但从我的反向代理的简单设置开始。

我的 docker-compose.yml 看起来如下:

version: '3'

services:
    reverse-proxy:
        container_name: reverse-proxy
        hostname: reverse-proxy
        image: nginx:latest
        ports:
        - 80:80
        volumes:
        - ./nginx-config/conf.d:/etc/nginx/conf.d
        - ./html:/usr/share/nginx/html
        environment:
            - NGINX_PORT=80
            - ENV=development

具有 nginx-config 文件夹结构,如:

nginx-config
|- templates
  |-default.conf.template
  |- sites-available
    |- mysite.conf.template

default.conf.template 看起来像:

server 
    listen       $NGINX_PORT default_server;
    listen  [::]:$NGINX_PORT default_server;
    
    server_name  _;
    root   /usr/share/nginx/html;

    charset UTF-8;

    error_page 404 /notfound.html;
    location = /notfound.html 
        allow   all;
    
    location / 
        return 404;
    

    access_log off;
    log_not_found off;
    error_log  /var/log/nginx/error.log error;

但是,每当我运行 docker-compose --context myremote up 时,它都不起作用,会抛出以下输出:

reverse-proxy    | /docker-entrypoint.sh: /docker-entrypoint.d/ is not empty, will attempt to perform configuration
reverse-proxy    | /docker-entrypoint.sh: Looking for shell scripts in /docker-entrypoint.d/
reverse-proxy    | /docker-entrypoint.sh: Launching /docker-entrypoint.d/10-listen-on-ipv6-by-default.sh
reverse-proxy    | 10-listen-on-ipv6-by-default.sh: Getting the checksum of /etc/nginx/conf.d/default.conf
reverse-proxy    | 10-listen-on-ipv6-by-default.sh: /etc/nginx/conf.d/default.conf differs from the packaged version, exiting
reverse-proxy    | /docker-entrypoint.sh: Launching /docker-entrypoint.d/20-envsubst-on-templates.sh
reverse-proxy    | /docker-entrypoint.sh: Configuration complete; ready for start up

至少在我的本地机器上 nginx-config/conf.d/default.conf 下都会生成正确的输出。

有什么方法可以利用自定义配置和模板使用 docker-compose 而不会遇到这样的问题?

【问题讨论】:

从 default.conf.template 中移除 listen [::]:$NGINX_PORT default_server; 还是同样的问题。不过感谢您的评论 你能解决这个问题吗?我也面临同样的问题。 @Youssef,我完全错过了您的评论,但以防万一,我发布的解决方案当时似乎有帮助 - 希望您找到解决方案! 【参考方案1】:

问题解决了。

我试图在 EC2 机器上使用 docker 上下文执行此操作。

虽然Docker --context [context] 已成为稳定版本的一部分(至少对于 MacOS),但docker-compose --context [context] 已添加到 v1.26.0-rc2 中,因此此时您需要安装 Docker Edge 以使其正常工作。

我使用的是 set context [context] 而不是显式的 --context 表单,这意味着我实际上是在本地部署但不知道。

【讨论】:

以上是关于尝试使用带有自定义 conf.d 的 docker-compose 运行 nginx 时出错的主要内容,如果未能解决你的问题,请参考以下文章

docker配置nginx环境

我可以在 JDBC URL 模式下使用带有自定义 Dockerfile 的 Testcontainers 吗?

Docker compose 错误:nginx:在 /etc/nginx/conf.d/default.conf:21 的上游“app”中找不到 [emerg] 主机

在 docker 容器内使用带有 ssl 的自托管(Jetty)元数据库时出错

三简单自定义监控脚本

Nginx详细教程