如何使用.env文件将主机的环境变量作为args传递给Docker Compose?

时间:2020-05-22 03:02:02

标签: docker docker-compose

我试图通过.env文件将某些主机的环境变量内容作为args传递给docker-compose文件。但是变量被解释为字符串。

关注我文件的内容:

.env:

USER=$USER
UID=$UID
GID=$GID

docker-compose.yml:

version: "2"

services:
    opencv_python:
        build:
            args:
                - username=${USER}
                - uid=${UID}
                - gid=${GID}
            context: .
            dockerfile: opencv_base.Dockerfile
        container_name: ocv-data-augmentation
        image: ocv-data-augmentation
        environment: 
            DISPLAY: $DISPLAY
            QT_X11_NO_MITSHM: 1
        volumes: 
            - "../project:/home/&{USER}/data_augmentation/" # Host : Container
            - "/tmp/.X11-unix:/tmp/.X11-unix"
        tty: true

这是命令docker-compose config的输出:

 services:
  opencv_python:
    build:
      args:
        gid: $$GID
        uid: $$UID
        username: fsalvagnini
      context: /home/fsalvagnini/Documents/containers/data_augmentation/dockerfiles
      dockerfile: opencv_base.Dockerfile
    container_name: ocv-data-augmentation
    environment:
      DISPLAY: :1
      QT_X11_NO_MITSHM: 1
    image: ocv-data-augmentation
    tty: true
    volumes:
    - /home/fsalvagnini/Documents/containers/data_augmentation/project:/home/&{USER}/data_augmentation:rw
    - /tmp/.X11-unix:/tmp/.X11-unix:rw
version: '2.0'

2 个答案:

答案 0 :(得分:1)

如果您需要使用.env文件并假设已定义所有env变量,则只需执行以下步骤:

.env文件

Column5

上面的语句将获取source .env 中定义的所有变量,因此docker-compose可以访问env变量。

仅此而已,您还应该查看.env,以防万一需要传递默认值。

更多文档here

答案 1 :(得分:0)

根据docker-compose manual

在多个文件中设置相同的环境变量时, Compose用于选择要使用的值的优先级:

  1. 撰写文件
  2. Shell环境变量
  3. 环境文件
  4. Dockerfile
  5. 未定义变量

因此,如果未设置shell环境变量,则将使用env文件。

对于您的情况,如果需要使用shell env var,则无需创建.env文件。要解决您的问题,您需要在调用docker-compose之前导出变量。

export GID
export UID
export DISPLAY
docker-compose config

输出:

services:
  opencv_python:
    build:
      args:
        gid: '20'
        uid: '501'
        username: enix
      context: /Users/enix/source/devops/stackoverflow
      dockerfile: opencv_base.Dockerfile
    container_name: ocv-data-augmentation
    environment:
      DISPLAY: :1
      QT_X11_NO_MITSHM: 1
    image: ocv-data-augmentation
    tty: true
    volumes:
    - /Users/enix/source/devops/project:/home/&{USER}/data_augmentation:rw
    - /tmp/.X11-unix:/tmp/.X11-unix:rw
version: '2.0'