0

在本地运行 docker 时,docker run我传递了一些参数,例如:

docker run -p 8080:80 -e "SERVICE_B_URL=somehost.co.uk" -d mynginx:latest /bin/sh -c "envsubst '\${SERVICE_B_URL}' < /etc/nginx/conf.d/default.template > /etc/nginx/conf.d/default.conf && exec nginx -g 'daemon off;'"

这工作正常。在我/etc/nginx/conf.d/default.conf的字符串${SERVICE_B_URL}被替换为somehost.co.uk.

在 AWS fargate 上运行时,定义如下:

"environment": [
        {
          "name": "SERVICE_B_URL",
          "value": "someotherhost.co.uk"
        }
      ],
"command": [
        "/bin/sh",
        "-c",
        "envsubst '\\${SERVICE_B_URL}' < /etc/nginx/conf.d/default.template > /etc/nginx/conf.d/default.conf && exec nginx -g 'daemon off;'"
      ],

这是为了在 JSON 文件\\中转义。\

尝试运行时,容器退出并出现错误,因为 NGINX 看到的是文字字符串${SERVICE_B_URL}。当我检查容器并看到 AWS 用于启动容器的命令时,它是:

Command ["/bin/sh","-c","envsubst '\\' < /etc/nginx/conf.d/default.template > /etc/nginx/conf.d/default.conf && exec nginx -g 'daemon off;'"]

'\\${SERVICE_B_URL}'请注意,Fargate在将其作为命令提供给 docker run 之前已尝试扩展该字符串。我的意图是将其指定为文字字符串。

有没有办法逃避这种/停止扩张。我已经尝试过'\\\\${SERVICE_B_URL}'->之类的东西'\\'


脚注,如果您想知道为什么我指定'\${SERVICE_B_URL}'toenvsubst而不是仅使用:

docker run -p 8080:80 -e "SERVICE_B_URL=somehost.co.uk" -d mynginx:latest /bin/sh -c "envsubst < /etc/nginx/conf.d/default.template > /etc/nginx/conf.d/default.conf && exec nginx -g 'daemon off;'"

原因是,被替换的文件包含其他使用$语法变量的 NGINX 配置。因此,为了防止这些被替换,envsubst我明确命名了要替换的变量。使用 docker run 在本地运行,它就像一个魅力......

4

1 回答 1

0

我最终通过使用我们将传递给自身的docker run一部分的命令来简化这一点,例如:DockerfileCMD

CMD ["/bin/sh","-c","envsubst '\\${SERVICE_B_URL}' < /etc/nginx/conf.d/default.template > /etc/nginx/conf.d/default.conf && exec nginx -g 'daemon off;'"]

现在我们可以command从 Fargate 的 JSON 文件中删除配置。

于 2019-02-25T13:37:56.383 回答