在 Dockerfile 中传递环境变量值

Pass environment variable values inside Dockerfile

我在我的 ECS 任务定义下使用环境变量来提取值。变量名称是 encryptor.password 我在我的 Dockerfile 中也将其声明为具有一些虚拟值的 ENV 变量,但同时在后面的入口点部分被调用,如下所示:-

ARG pwd
ENV encryptor.password $pwd
# Run the app.jar using the recommended flags per
# https://spring.io/guides/gs/spring-boot-docker/#_containerize_it
ENTRYPOINT ["java","-Dhttp.proxyHost=***",\
"-Dhttps.proxyHost=***","-Dhttp.proxyPort=***",\
"-Dhttps.proxyPort=***","-Djava.net.useSystemProxies=true",\
"-Dhttp.nonProxyHosts=***|/var/run/docker.sock|***|***|***",\
"-Djava.security.egd=file:/dev/./urandom","-Dencryptor.password=${encryptor.password}","-Dspring.profiles.active=dev",\
"-jar","/app/app.jar"]

我的理解是 -Dencryptor.password=${encryptor.password} 实际上应该替换为来自 taskdef 的 ENV 变量 encryptor.password 进入此 dockerfile 的值当容器启动时,但看起来入口点没有选择该值。我错过了什么吗?如何让Dockerfile获取那个值?

ARG pwd

意味着您需要在构建期间提供一个值:将 --build-arg 添加到 docker build.

如果您希望在启动容器时将值提供给容器,则需要从 ENV 声明中删除 ARG 行和 $pwddocker run' accepts the option--env` 您可以在其中提供您的值。

我建议将您的环境变量存储在任务定义中。比 Dockerfile.

有一些优势
  1. 比 Docker ENV
  2. 更安全
  3. 能够在 运行 时间覆盖
  4. 在您的案例中,在构建期间似乎遗漏了 env,遗漏的可能性为零
  5. 跨多个服务可用

您可以定义ENV是容器部分下的任务定义。

问题是您需要首先使用 shell 形式的 ENTRYPOINT,因此要么有一个 entrypoint.sh 脚本,您可以在其中定义命令和参数,然后以 shell 形式从ENTRYPOINT 或将所有内容传递为 :-

ENTRYPOINT ["sh", "-c", "java ........."]

同时确保在shell的ENTRYPOINT解析的变量不使用点。点不是有效的 shell 标识符,而且很容易被忽视。