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

时间:2019-09-03 14:15:33

标签: docker docker-compose docker-container

我有一个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 }}为空。

3 个答案:

答案 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内部而不是在容器内部进行设置。如果您不对变量进行转义,那也将起作用。