4

我们正在尝试在 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传递命令参数的方式上的语法错误。

4

2 回答 2

4

最后,正确的语法(至少对我们来说效果很好)是:

"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图像中,它不是——我正确地认为,对于较小的尺寸和较小的攻击面作为利用向量。我们最终只是在我们的 . 中安装了 curl Dockerfile,之后一切都很好。

于 2019-02-24T23:04:53.547 回答
1

试试这个方法

"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然后在arry中给出了一个额外的命令。

如果我不相信,ECS 会使用基本映像CMD( CMD ["nginx", "-g", "daemon off;"]) 并command在此之上运行数组中的任何内容。我只是在猜测这个;因为我无法理解为什么另一种方式不起作用。

于 2019-02-24T13:29:49.570 回答