Docker运行时的ENTRYPOINT不能替换环境变量。

3

我有一个入口点,如下所示

ENTRYPOINT /usr/bin/java ... /usr/path/$FILE

我正在尝试在启动容器时传递一个环境变量。
-e FILE=myfile.txt

然而这个值似乎没有被替换。Java抛出一个异常,指出/usr/path是一个目录。如果我在dockerfile中硬编码入口点和文件名,那么它可以正常运行。
ENTRYPOINT /usr/bin/java ... /usr/path/myfile.txt

它确认了$FILE没有被替换。

如何解决这个问题?

注意:

有趣的是,docker-compose可以完美地工作!

environment:
  - FILE=myfile.txt

尝试运行 -e "FILE=myfile.txt" - fg78nc
谢谢。这并没有帮助。它仍然抛出相同的错误。 - KitKarson
如果您尝试使用以下形式会怎样呢?ENTRYPOINT ["..."] ? - fg78nc
1个回答

3
为了确保您正确使用的shell形式的ENTRYPOINT能够替换环境变量$FILE,请添加一个exec:
ENTRYPOINT exec /usr/bin/java ... "/usr/path/$FILE"

请检查您的docker run -e FILE=xxx yourImage是否正常工作。
这意味着您的Dockefile包括ENV FILE aDefaultFile指令,以便docker run -e正常工作。

@KitKarson 你是否添加了双引号:在您的构建映像上运行 docker history 命令,是否显示最后一层中的 $FILE - VonC
我使用了 ENTRYPOINT exec /usr/bin/java ... "/usr/path/$FILE",历史记录显示为 ENTRYPOINT ["/bin/sh" "-c" "exec /usr/bin/java ... \"/usr/path/$FILE\""] - KitKarson
@KitKarson 看起来不错。docker run -e FILE=xxx 是否会将 $FILE 替换为正在运行的容器? - VonC
不,它肯定不会替换。嗯...它会用空值进行替换。 - KitKarson
@KitKarson,你的Dockerfile是否声明了ENV FILE - VonC
@KitKarson 我已经编辑了答案,以使 ENV 步骤更清晰。 - VonC

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接