ECS/Fargate 容器定义命令参数
ECS/Fargate container definition command arguments
我们正在尝试在 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
的命令参数的语法方面做错了。
试试这个方法
"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
强制容器忽略 base image 命令。然后在 command
arry.
中给出了额外的命令
如果我不相信,ECS 会使用基本映像 CMD
(CMD ["nginx", "-g", "daemon off;"]
) 和 运行 数组中 command
中的任何内容。我只是在猜测这个;因为我不明白为什么另一种方法行不通。
最终正确的语法(至少是对我们有用的语法)是:
"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,之后一切都很好。
我们正在尝试在 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
的命令参数的语法方面做错了。
试试这个方法
"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
强制容器忽略 base image 命令。然后在 command
arry.
如果我不相信,ECS 会使用基本映像 CMD
(CMD ["nginx", "-g", "daemon off;"]
) 和 运行 数组中 command
中的任何内容。我只是在猜测这个;因为我不明白为什么另一种方法行不通。
最终正确的语法(至少是对我们有用的语法)是:
"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,之后一切都很好。