【问题标题】:Dockerfile ENV directive: can key contain a period? [duplicate]Dockerfile ENV 指令:键可以包含句点吗? [复制]
【发布时间】:2021-04-13 22:12:03
【问题描述】:

Docker 版本:20.10.2, build 2291f61

在 Dockerfile 中,是否可以使用密钥包含嵌入句点的 ENV 指令?例如:

ENV story.paragraph.port 2029

如果可以使用带句点的键声明 ENV 变量,那么以后是否可以在同一个 Dockerfile 中使用熟悉的 shell 插值来引用它们?

EXPOSE $story.paragraph.port

后一个 EXPOSE 指令对我来说是无效的。

我的用例:我有一个从 INI 文件加载其配置的 python 脚本。例如,我可能有这样的配置属性:

story.paragraph.word=helloworld
story.paragraph.length=256

python 逻辑从 INI 文件(默认情况下)或在环境中指定的覆盖中识别配置设置。这个想法是容器实例可以为story.paragraph.wordstory.paragraph.length 指定自己的环境变量,并且这些值将覆盖默认配置。

【问题讨论】:

  • 对于你的服务运行的端口号之类的东西,你通常希望选择一个固定的端口号,并且可以硬编码例如 EXPOSE 2029。当您从容器外部转到 docker run -p ...:2029 时,无法引用此环境变量。
  • @DavidMaze -- 谢谢。这是一个很好的观点。

标签: docker dockerfile


【解决方案1】:

env 中的句点不是来自 unix 的有效标识符。

在运行时可以在 docker 容器内设置带有句点的环境,但您不能直接访问该环境;您将需要一些解决方法。

$ docker run --name test -itd -e story.paragraph.word=helloworld alpine sh
da4214ac2377cf1b3ce3af515f30e96dfadabf0140f541c06ee4a176a2bef746
$ docker exec -it test sh
/ # env | grep story
story.paragraph.word=helloworld     <=== env is set
/ # echo $story.paragraph.word
.paragraph.word                     <=== can't access the env
/ # echo ${story.paragraph.word}
sh: syntax error: bad substitution
/ # env | grep 'story.paragraph.word' | cut -f 2 -d '='    <=== need such workaround
helloworld
/ # $

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-08-09
    • 2011-08-07
    • 2018-05-05
    相关资源
    最近更新 更多