如何在 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" 行上抱怨并显示 $VAR1
和 VAR2
为空。
将您的文件重命名为 .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 本身内设置变量,而不是在您的容器内。如果您不转义变量,这也将起作用。
我有一个 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" 行上抱怨并显示 $VAR1
和 VAR2
为空。
将您的文件重命名为 .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 本身内设置变量,而不是在您的容器内。如果您不转义变量,这也将起作用。