【问题标题】:Using internal container environment variables in docker-compose.yml under command命令下在docker-compose.yml中使用容器内部环境变量
【发布时间】:2022-11-17 02:46:24
【问题描述】:

问题

我试图让 docker-compose.yml 中的命令使用容器的内部环境变量,而不是主机系统的环境变量。但是,docker compose 尝试在容器外用我自己的 shell 替换命令中的环境变量。

例如。使用以下撰写文件:

version: "3.9"

services:
  service1:
    image: alpine
    command: "echo $PATH"
    network_mode: bridge

输出包含我自己的 shell 的 PATH,而不是容器内的 PATH(该变量正在被 Docker 替换)。

注意:通过查看 official docs,我也不希望我的变量被本地值替换,因为停靠栏中的格式表明这仅适用于大括号。

我试过的

使用 here 所述的双美元字符。这给了我以下行为:

YAML syntax Console Output
command: "echo ${PATH}" (Still my own shell PATH variable)
command: "echo $$PATH" $PATH
command: "echo $${PATH}" ${PATH}

如上所述,我希望控制台输出读取容器中实际 PATH 变量的值(对于高山容器,输出应为/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin

我也试过 command: "printenv",正如预期的那样,它显示了 PATH 变量的上述内部值,而不是我的 shell 中的值。

更新1
我还尝试了 cmets 中建议的 exec 格式,格式如下:

  • command: ["echo", "${PATH}"]
  • command: ["echo", "$$PATH"]
  • command: ["echo", "$${PATH}"] 这些仍然给出与上述相同的结果。

附加上下文

操作系统:Ubuntu 22.04
编写版本:v2.12.2

问题

我如何在命令中使用内部环境变量,以便我的命令的输出将给我内部 PATH 变量的值?

【问题讨论】:

  • command 可以有 shell 格式(你正在使用的格式)或 exec 格式(推荐)。也许这就是正在发生的事情。看这里docs.docker.com/engine/reference/builder/#cmd
  • @JoaoVitorino 感谢您的评论!我也试过 exec 形式,但它给出了相同的结果(见上面的更新)。请注意,我已将我的示例编辑为使用 $PATH 变量,以便更清楚地表明我想要使用内部容器环境变量。

标签: docker docker-compose


【解决方案1】:

您需要在 docker-compose.yaml 旁边创建一个 .env 文件并将其放入:

export ENV_VAR=TESTTEST

还有其他几种技巧:https://docs.docker.com/compose/environment-variables/

【讨论】:

  • 感谢您的回答。使用 .env 文件仍然会导致在解析撰写文件时替换变量,而不是在使用命令时替换。正如您所指出的,这将适用于我的原始示例,如果我只想能够手动设置其中一个变量的值,但我正在寻找(更一般地说)一种在内部使用内部容器环境变量的方法命令。我更新了我的示例以使用 $PATH 变量,以使其更清楚。
  • a method to use internal container environment variables inside the command.我认为这根本不可能。您能否描述您想要实现的确切用例(在您的问题中)?
  • 进一步查看文档中明确指出:“您的配置选项可以包含环境变量。Compose 使用运行 docker-compose 的 shell 环境中的变量值。”。
【解决方案2】:

Compose documentation on variable substitution 指出 $VARIABLE 引用将替换为相应的主持人docker-compose.yml 文件中任意位置的环境变量,包括 command:

访问一个容器环境变量可能有点棘手,特别是因为入口点包装器脚本可以在启动时修改容器环境。你需要安排两件事发生:

  1. 您需要将文字字符串echo $PATH(包括美元符号)传递到容器中;和
  2. 您需要确保运行 shell 来处理该字符串。

    与 Dockerfile 不同,Compose 不会将纯字符串 command: 包装在 /bin/sh -c 中,因此您必须自己提供。这些形式中的任何一种都可以工作:

    command: sh -c 'echo $$PATH'
    
    command:
      - sh
      - -c
      - echo $$PATH
    

    但要特别注意双 $$ 强制将文字 $ 传递到容器中。

    (此构造还假定图像将作为普通命令运行 command:。某些图像被构建为忽略 command: 或强制它们使用特定的解释器运行,并且您将在尝试运行时遇到一个模糊的错误这个。)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-07-16
    • 2020-12-07
    • 2021-10-26
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多