我有一个docker-compose文件,在其中我使用env_file
在运行时读取和设置一堆env变量。这些环境变量是我需要在运行时使用command
运行的命令所必需的。但是,看起来command
节是在运行时设置env变量之前执行的,这会导致错误。如何确保在执行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
和{{1 }}为空。
答案 0 :(得分:2)
将文件重命名为.env
(无名称),因此mv variables.txt .env
编辑您的compose
:
services:
mlx-python-hdfs:
image: image_name
container_name: cname
command:
- microservice $VAR1 $VAR2
然后正常运行 参见this
答案 1 :(得分:0)
Docker Compose command:
指令具有两种形式。如果将其指定为列表,则将其作为显式各个参数的列表进行读取;没有外壳程序被调用,也没有参数扩展。
command:
- /bin/ls
- -l
- /app
如果将其指定为简单字符串,则将其隐式包装在sh -c '...'
中,并且该shell将进行变量扩展,这是您所需要的。
command: microservice $VAR1 $VAR2
(您的表单不仅不进行变量扩展,而且由于您在单个列表项中指定了该命令,因此它正在寻找一个字面名为microservice $VAR1 $VAR2
的文件(包括空格和美元符号)作为主文件容器过程。)
答案 2 :(得分:0)
最有可能在容器内部设置环境变量。但是,$
语法已由撰写文件解析器扩展为从主机上的Shell注入设置。要在容器内展开它们,您需要使用$$
语法对其进行转义:
services:
mlx-python-hdfs:
image: image_name
container_name: cname
env_file: ./variables.txt
command:
- microservice $$VAR1 $$VAR2
这将把原义的$
传递到容器中,并由容器内的外壳展开。
有关更多详细信息,请参见撰写文件文档:https://docs.docker.com/compose/compose-file/#variable-substitution
请注意,将文件重命名为.env
会导致变量在docker-compose内部而不是在容器内部进行设置。如果您不对变量进行转义,那也将起作用。