如何在AWS Fargate容器定义命令中防止变量替换/扩展

时间:2019-02-24 22:51:38

标签: amazon-ecs aws-fargate docker-run

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

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;'"]

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

是否有一种方法可以退出此/停止扩展。我已经尝试过类似'\\\\${SERVICE_B_URL}'-> '\\'之类的事情。


脚注,如果您想知道为什么我将'\${SERVICE_B_URL}'设置为envsubst而不是仅仅使用:

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在本地运行,它就像一个魅力……

1 个答案:

答案 0 :(得分:0)

我最终通过使用JsonPath pathToAccountName = response.jsonPath(); String value = jsonPath.getString("fields.find { it.fieldId == 'individualName' }.value"); 将要传递给docker run本身的Dockerfile部分的命令简化了操作,例如:

CMD

现在,我们可以从Fargate的JSON文件中删除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;'"] 配置。