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

这里的优先级是:

  1. ENV 默认使用 Dockerfile 中的声明。
  2. 启动容器时的
  3. Environment-variable 设置,包括您显示的 ECS 设置(还有 docker run -e、Compose environment:、Kubernetes env:)覆盖图像的 ENV.
  4. 主容器进程自身设置的任何环境变量都将覆盖这两个变量。

因此在您的示例中,主容器进程是 run.sh,它会忽略环境中之前的任何内容并设置 $SAMPLE_VALUE 本身;当它 exec 实际命令时,它将看到 SAMPLE_VALUE=xyz.

您可以通过打印出先前的值进一步说明这一点:

#!/bin/sh

echo "SAMPLE_VALUE was ${SAMPLE_VALUE}"
export SAMPLE_VALUE=xyz
exec "$@"

这将打印出 ECS 定义中设置的 ABC 值,然后 运行 实际程序的值设置为 xyz