首页 > 解决方案 > 我应该如何在 Docker 的入口点使用环境变量?

问题描述

ENV ADDRESS=http://peer1:8761/eureka/,http://peer2:8762/eureka/
ENTRYPOINT ["java","-Djava.security.egd=file:/dev/./urandom", "-jar","/app.jar", "--eureka.client.serviceUrl.defaultZone=$ADDRESS"]

我想通过环境变量指定入口点的eureka地址。但是当我使用docker run时它仍然是$ADDRESS,并且我使用ENTRYPOINT java -jar xxxx,它可以正确替换,但是当我使用ENTRYPOINT之类ENTRYPOINT java -jar xxx.jar时,我使用docker run image_name --spring.profiles.active=peer1,结束参数active= peer1不会生效,Entrypoint中使用环境变量和参数怎么办

标签: docker

解决方案


我刚刚尝试在 dockerfile 中解析 PATH 并且它适用于一种场景(虽然我使用了 CMD),但不确定这是否有帮助。如果这不起作用,请告诉我更多详细信息。

指定命令有两种形式(Exec 形式和 Shell 形式),以及在 dockerfile 中指定默认命令的两种方式(ENTRYPOINT 和 CMD)。

执行形式:

FROM ubuntu
MAINTAINER xyz<xyz.gmail.com>
ENTRYPOINT ["ping"]

指定的命令 (ping) 将作为 PID 1 运行。这就是为什么如果我们按 CTRL + C (SIGTERM) 将传递给 PID1 进程并关闭容器的原因。

外壳形式:

FROM ubuntu
MAINTAINER xyz<xyz.gmail.com>
CMD echo $PATH

PATH 在运行时解析为 shell 环境 PATH。(输出已验证)。

shell 形式指定用空格分隔的命令标记。shell 形式通过调用 /bin/sh -c 执行命令(这意味着 PID 1 实际上是 shell,docker 文件中指定的命令只是另一个进程)(按 CTRL + C 不会杀死容器)

使用 shell 形式的优点是因为您使用 /bin/sh -c 执行,我们可以在命令中解析环境变量(在上面的示例中,我们使用 PATH)。

希望这可以帮助


推荐阅读