如何在 docker-compose 中设置环境变量

How to set environment variables in docker-compose

我有一个 docker-compose 文件,我在其中使用 env_file 在 运行 时读取和设置一堆环境变量。这些 env 变量是我需要在 运行 时间使用 command 运行 的命令所必需的。但是,看起来 command 部分是在环境变量设置为 运行 之前执行的,这会导致错误。如何确保在执行 docker-compose 中的 command 部分之前设置环境变量?

这是我的 docker-compose 文件

services:
  mlx-python-hdfs:
    image: image_name
    container_name: cname
    env_file: ./variables.txt
    command:
         - microservice $VAR1 $VAR2

$VAR1$VAR2 是从 variables.txt 文件中读取的,但是当我启动容器时,它在 "microservice $VAR1 $VAR2" 行上抱怨并显示 $VAR1VAR2为空。

将您的文件重命名为 .env(没有名称),因此 mv variables.txt .env

编辑你的 compose :

services:
  mlx-python-hdfs:
    image: image_name
    container_name: cname
    command:
         - microservice $VAR1 $VAR2

然后运行正常 参见 this

Docker Compose command: 指令有两种形式。如果将其指定为列表,则将其读取为显式单个参数的列表;没有 shell 被调用,也没有参数扩展。

command:
  - /bin/ls
  - -l
  - /app

如果您将它指定为一个简单的字符串,它会隐式包装在 sh -c '...' 中,并且 shell 将进行变量扩展,这正是您想要的。

command: microservice $VAR1 $VAR2

(您的表单不仅没有进行变量扩展,而且因为您在单个列表项中指定了命令,所以它正在查找字面上名为 microservice $VAR1 $VAR2 的文件,包括空格和美元符号,以便主容器进程。)

环境变量很可能是在容器内设置的。但是,$ 语法由撰写文件解析器扩展,以从主机上的 shell 注入设置。要在容器内展开它们,您需要使用 $$ 语法对它们进行转义:

services:
  mlx-python-hdfs:
    image: image_name
    container_name: cname
    env_file: ./variables.txt
    command:
         - microservice $$VAR1 $$VAR2

这会将文字 $ 传递到容器中,该容器将在容器内扩展 shell。

有关详细信息,请参阅撰写文件文档:https://docs.docker.com/compose/compose-file/#variable-substitution

请注意,将文件重命名为 .env 会导致在 docker-compose 本身内设置变量,而不是在您的容器内。如果您不转义变量,这也将起作用。