如何在 ENTRYPOINT 数组中使用 Docker 环境变量?

新手上路,请多包涵

如果我设置一个环境变量,比如 ENV ADDRESSEE=world ,我想在连接到固定字符串的入口点脚本中使用它,例如:

 ENTRYPOINT ["./greeting", "--message", "Hello, world!"]

world 是环境变量的值,我该怎么做?我尝试使用 "Hello, $ADDRESSEE" 但这似乎不起作用,因为它需要 $ADDRESSEE 从字面上看。

原文由 Psycho Punch 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 2.3k
2 个回答

您正在使用 ENTRYPOINT 的 exec 形式。与 shell 形式 不同, exec 形式 不调用命令 shell。这意味着不会发生正常的外壳处理。例如, ENTRYPOINT [ "echo", "$HOME" ] 不会对 \(HOME 进行变量替换。如果要进行 shell 处理,则使用 **shell 形式** 或直接执行 shell,例如: `ENTRYPOINT [ "sh", "-c", "echo \)HOME” ]` 。

当使用 exec 形式并直接执行 shell 时,与 shell 形式一样,是 shell 进行环境变量扩展,而不是 docker。(来自 Dockerfile 参考

在你的情况下,我会使用 shell 形式

ENTRYPOINT ./greeting --message "Hello, $ADDRESSEE\!"

原文由 vitr 发布,翻译遵循 CC BY-SA 3.0 许可协议

在经历了很多痛苦并得到了@vitr 等人 的大力帮助 之后,我决定尝试

  • 标准 bash 替换
  • ENTRYPOINT 的 _shell 形式_(来自上面的重要提示)

那行得通。

 ENV LISTEN_PORT=""

ENTRYPOINT java -cp "app:app/lib/*" hello.Application --server.port=${LISTEN_PORT:-80}

例如

docker run --rm -p 8080:8080 -d --env LISTEN_PORT=8080 my-image

docker run --rm -p 8080:80 -d my-image

都在我的容器中正确设置了端口

参考文献

https://www.cyberciti.biz/tips/bash-shell-parameter-substitution-2.html

原文由 mlo55 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题