ecs 容器定义中的环境变量与 Dockerfile 中定义的相同环境变量。将使用哪一个?
Environment variable inside ecs container definition vs same environment variable defined in Dockerfile. Which one will be used?
如果在ecs任务定义中有环境变量SAMPLE_VALUE
这样定义
{
"containerDefinitions": [
{
"command": [
"./app"
],
"image": "sample-image:latest",
"name": "sample-app",
"environment": [
{
"name": "SAMPLE_VALUE",
"value": "ABC"
}
]
}
]
}
如果在 sample-image
的 Dockerfile 中再次定义相同的环境变量 SAMPLE_VALUE
,就像这样
...
...
ENTRYPOINT ["run.sh", "app"]
run.sh
的内容是
#!/bin/sh
export SAMPLE_VALUE=XYZ
exec
app
从变量 SAMPLE_VALUE
中得到什么值?是 XYZ
还是 ABC
?
这里的优先级是:
ENV
默认使用 Dockerfile 中的声明。
启动容器时的 - Environment-variable 设置,包括您显示的 ECS 设置(还有
docker run -e
、Compose environment:
、Kubernetes env:
)覆盖图像的 ENV
.
- 主容器进程自身设置的任何环境变量都将覆盖这两个变量。
因此在您的示例中,主容器进程是 run.sh
,它会忽略环境中之前的任何内容并设置 $SAMPLE_VALUE
本身;当它 exec
实际命令时,它将看到 SAMPLE_VALUE=xyz
.
您可以通过打印出先前的值进一步说明这一点:
#!/bin/sh
echo "SAMPLE_VALUE was ${SAMPLE_VALUE}"
export SAMPLE_VALUE=xyz
exec "$@"
这将打印出 ECS 定义中设置的 ABC
值,然后 运行 实际程序的值设置为 xyz
。
如果在ecs任务定义中有环境变量SAMPLE_VALUE
这样定义
{
"containerDefinitions": [
{
"command": [
"./app"
],
"image": "sample-image:latest",
"name": "sample-app",
"environment": [
{
"name": "SAMPLE_VALUE",
"value": "ABC"
}
]
}
]
}
如果在 sample-image
的 Dockerfile 中再次定义相同的环境变量 SAMPLE_VALUE
,就像这样
...
...
ENTRYPOINT ["run.sh", "app"]
run.sh
的内容是
#!/bin/sh
export SAMPLE_VALUE=XYZ
exec
app
从变量 SAMPLE_VALUE
中得到什么值?是 XYZ
还是 ABC
?
这里的优先级是:
ENV
默认使用 Dockerfile 中的声明。
启动容器时的 - Environment-variable 设置,包括您显示的 ECS 设置(还有
docker run -e
、Composeenvironment:
、Kubernetesenv:
)覆盖图像的ENV
. - 主容器进程自身设置的任何环境变量都将覆盖这两个变量。
因此在您的示例中,主容器进程是 run.sh
,它会忽略环境中之前的任何内容并设置 $SAMPLE_VALUE
本身;当它 exec
实际命令时,它将看到 SAMPLE_VALUE=xyz
.
您可以通过打印出先前的值进一步说明这一点:
#!/bin/sh
echo "SAMPLE_VALUE was ${SAMPLE_VALUE}"
export SAMPLE_VALUE=xyz
exec "$@"
这将打印出 ECS 定义中设置的 ABC
值,然后 运行 实际程序的值设置为 xyz
。