ECS / Fargate容器定义命令参数

时间:2019-02-24 13:00:24

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

我们正在尝试在AWS ECS上启动Fargate容器。在容器定义中,我们有

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

我也尝试过:

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

使用docker run,我们将成功使用:

docker run -p 8000:80 -e "VAR1=somevalue" -d nginx-sample:latest /bin/bash -c "envsubst < /etc/nginx/conf.d/default.conf.template > /etc/nginx/conf.d/default.conf && exec nginx -g 'daemon off;'"

在kubernetes世界中(也可以使用):

 containers:
      env:
      - name: VAR1
        value: "somevalue"
      command: ["/bin/bash"]
      args: ["-c", "envsubst < /etc/nginx/conf.d/default.conf.template > /etc/nginx/conf.d/default.conf && exec nginx -g 'daemon off;'"]

到目前为止,我们无法在AWS Fargate中使它正常工作。我不清楚我们应该如何以有效方式传递参数。容器在启动之前似乎已经退出,但是没有明显的日志消息,因此尚不清楚原因。我认为在传递/bin/bash -c的命令参数的方式上我在语法上做错了。

2 个答案:

答案 0 :(得分:0)

尝试这种方法

"entryPoint": [
        "/bin/bash",
        "-c"
      ],
"command": [
        "envsubst < /etc/nginx/conf.d/default.conf.template > /etc/nginx/conf.d/default.conf && exec nginx -g 'daemon off;'"
      ],

当我们不得不做这样的事情时,这对我们有用。

在我们的示例中,我们使用entryPoint来强制容器忽略基础图片命令。然后在command里给了另一个命令。

如果我不相信,ECS将使用基本映像CMDCMD ["nginx", "-g", "daemon off;"])并在其上运行command数组中的任何内容。我只是在推测这个;因为我无法理解为什么其他方法不起作用。

答案 1 :(得分:0)

最后,正确的语法(至少一种对我们有用的语法)是:

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

实际上,我们真正遇到的问题是,我们按照以下方式定义了容器运行状况检查:

"healthCheck": {
        "retries": 5,
        "command": [
          "CMD-SHELL",
          "curl --fail http://localhost/health || exit 1"
        ],
        "timeout": 10,
        "interval": 30,
        "startPeriod": 30
      },

而且我们忘记验证curl是否确实安装在容器内。我们认为它会在那里是理所当然的,但是在nginx:latest映像中,它不是-我正确地认为对于较小的尺寸和较小的攻击面作为利用向量。最后,我们只好在Dockerfile中安装curl,一切都很好。