我们正在尝试在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
的命令参数的方式上我在语法上做错了。
答案 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将使用基本映像CMD
(CMD ["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,一切都很好。