【问题标题】:Heroku (Docker) PORT environment variable in nginxnginx中的Heroku(Docker)PORT环境变量
【发布时间】:2018-08-15 06:54:52
【问题描述】:

我只是对 Dockerfile 进行了一些修改,以便在 Heroku 上使用 nginx 运行它。 Heroku 的特别之处在于,一切都以非 root 身份运行。第二个特定行为是使用来自 Heroku 本身的随机端口,您不能被修改。他们提供了你应该绑定到 nginx 的 env $PORT。如果 Heroku 发现某些东西没有绑定到该端口,它会停止整个容器。问题是:

如何将 nginx 绑定到给定的环境变量,以便在 nginx-site.conf 中有一个动态端口? 我尝试在 Dockefile 中使用如下内容:

env PORT;nginx.conflisten PORT_from_env;nginx-site.conf 还尝试了 nginx-site.conf 中的 listen 80;Dockerfile

中的 RUN /bin/sed -i "s/listen 80/listen ${PORT}/" /etc/nginx/sites-available/default.conf

我绝对超出了我的能力。有人有想法或可以提供帮助吗?很有帮助!


更多信息:

【问题讨论】:

    标签: docker nginx heroku dockerfile


    【解决方案1】:

    我通过关注this example 使其适用于我的应用程序:

    第 1 步:default.conf.template 中收听$PORT

    server {
      listen $PORT default_server;
    
      location / {
        root   /usr/share/nginx/html;
        index  index.html;
      }
    }
    

    第 2 步:将此指令添加到您的 Dockerfile

    COPY default.conf.template /etc/nginx/conf.d/default.conf.template
    

    第 3 步:将其添加到您的Dockerfile末尾

    CMD /bin/bash -c "envsubst '\$PORT' < /etc/nginx/conf.d/default.conf.template > /etc/nginx/conf.d/default.conf" && nginx -g 'daemon off;'
    

    【讨论】:

    • 谢谢,我会及时给你我的反馈。以后会再试试!
    • 像魅力一样工作!
    【解决方案2】:

    我将展示一个不需要编写新 Dockerfile 的解决方案,您可以使用官方的 nginx 镜像。

    与@Jimmy 的解决方案一样,我们将使用envsubst 命令替换shell 格式字符串中的环境变量。
    此命令适用于 offical nginx image 和 alpine 版本。

    第 1 步
    将您的 nginx 配置写入模板文件 - 我们称之为:site.template:

    server {
        listen       ${PORT};
        server_name  localhost;
    
        location / {
            root   /usr/share/nginx/html;
            index  index.html index.htm;
        }
    }
    

    注意 PORT 占位符。

    第 2 步 - 使用 docker compose
    将其挂载到/etc/nginx/conf.d 目录中,然后执行envsubst 命令将模板用作default.conf 的参考:

    web:
      image: nginx:alpine
      volumes:
       - ./site.template:/etc/nginx/conf.d/site.template
      ports:
       - "3000:8080"
      environment:
       - PORT=8080
      command: /bin/sh -c "envsubst < /etc/nginx/conf.d/site.template > /etc/nginx/conf.d/default.conf && exec nginx -g 'daemon off;'"
    

    请注意:
    1. 之后需要执行 nginx 守护进程。
    2. 我使用/bin/sh 而不是/bin/bash,因为我的基础镜像是 alpine。


    第 2 步(另一个选项)- 内联 docker run
    如果由于某种原因您不想使用 docker-compose,您可以使用以下 bash 脚本:

    #!/usr/bin/env bash
    
    ##### Variables #####
    PORT=8080 #Or $1 if you pass it from command line
    TEMPLATE_DIR=$(pwd)/site.template
    TEMPLATE_REMOTE_DIR=/etc/nginx/conf.d/site.template
    IMAGE_NAME=nginx:alpine
    
    echo "Starting nginx on port: $PORT ..."
    
    ##### The docker command #####
    docker run -p 3000:$PORT -v $TEMPLATE_DIR:$TEMPLATE_REMOTE_DIR $IMAGE_NAME \
    /bin/sh -c "envsubst < $TEMPLATE_REMOTE_DIR > /etc/nginx/conf.d/default.conf && exec nginx -g 'daemon off;'"
    

    【讨论】:

      【解决方案3】:

      您需要在启动时更新您的 nginx 配置。
      this buildpack 为例(我还没有测试过它是否有效)。

      【讨论】:

      • 这就是我用sed -i 实现的。这发生在启动时,与您建议的相同。甚至是我过去了解并考虑过的 Dockerfile。
      猜你喜欢
      • 1970-01-01
      • 2015-12-25
      • 2021-11-19
      • 2021-08-18
      • 2018-03-25
      • 2023-03-24
      • 2021-10-01
      • 2021-11-05
      • 1970-01-01
      相关资源
      最近更新 更多