【问题标题】:Pass environment variable values inside Dockerfile在 Dockerfile 中传递环境变量值
【发布时间】:2019-07-31 21:36:19
【问题描述】:

我在我的 ECS 任务 def 下使用环境变量来拉取值。变量名称是 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 获取该值?

【问题讨论】:

  • 你是如何启动你的容器的?如果您使用的是 docker-compose.yaml 文件,它可以将环境变量传递到容器中……请注意,编译 Dockerfile 以合成图像和使用 docker-compose.yaml 启动图像之间存在区别。 .aws 可以与 docker-compose.yaml 一起使用
  • 容器刚刚使用 ECS 默认功能在 AWS ECS 中启动。因此,我运行构建和部署,使用具有新映像的新修订更新 taskdef,并更新 ECS 集群中的服务,这会强制在那里的 EC2 中启动新任务(docker 容器),但当入口点执行,因为它似乎无法获得 encryptor.password 的实际值。

标签: amazon-web-services docker dockerfile amazon-ecs


【解决方案1】:

我建议将您的环境变量存储在任务定义中。比 Dockerfile 有一些优势。

  1. 比 Docker ENV 更安全
  2. 能够在运行时覆盖
  3. 在您的案例中,在构建期间似乎错过了 env 的机会为零
  4. 可用于多种服务

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

【讨论】:

  • 是的,它在任务定义中,但我也想在 docker 入口点脚本中访问它。任务 def 中的变量名称是 encryptor.password 具有一些值。同样在您的入口点中可以看到它的 encryptor.password=${encryptor.password}。我如何覆盖 ${encryptor.password} 作为入口点中的实际值
  • 如果您在任务定义中设置环境,它将在入口点 t0o 中选择新值。只需在任务定义中设置它,它将覆盖 encryptor.password
【解决方案2】:

线

ARG pwd

表示您需要在构建时提供一个值:将 --build-arg 添加到docker build

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

【讨论】:

    【解决方案3】:

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

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-04-27
      • 2023-02-12
      • 2018-05-11
      • 2019-09-20
      • 2021-05-19
      • 2018-01-08
      • 1970-01-01
      • 2020-10-23
      相关资源
      最近更新 更多