【问题标题】:How to pass host's environment variables as args to Docker Compose using a .env file?如何使用 .env 文件将主机的环境变量作为 args 传递给 Docker Compose?
【发布时间】:2020-05-22 03:02:02
【问题描述】:

我正在尝试通过 .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'

【问题讨论】:

    标签: docker docker-compose


    【解决方案1】:

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

    .env 文件

    source .env
    

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

    刚刚添加的东西,你也应该看看${VARIABLE:-default},以防你需要传递一个默认值。

    更多文档here

    【讨论】:

    • 即使我在docker-compose config 命令之前执行source .env,也得到了相同的结果(gid 为$$GID,uid 为$$UID)。
    • 嘿@Felipe,如果您看到用户名和显示变量,则环境替换确实有效。现在我相信您想将您的主机 uid 和 gid 映射到容器。但是您需要了解 /etc/passwd/ 和 /etc/group/ 下的容器中可能不存在相同的内容。还要了解这在不同的主机上会有​​不同的行为。你可以进一步阅读here
    【解决方案2】:

    根据docker-compose manual

    当您在多个文件中设置相同的环境变量时,这里是 Compose 用来选择使用哪个值的优先级:

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

    所以如果没有设置shell环境变量,则使用env文件。

    对于您的情况,如果您需要使用 shell 环境变量,则无需创建 .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'
    

    【讨论】:

    • 谢谢,这个解决方案非常有效。有一种方法可以在 de docker-compose.yml 中嵌入导出命令?
    • 不,如果在调用 docker-compse 之前不导出 env var,docker-compose 将无法获取这些变量。或者您可以像 UID=$UID GID=$GID DISPLAY=$DISPLAY docker-compose config 那样调用 docker-compse
    猜你喜欢
    • 2020-11-07
    • 2020-06-09
    • 1970-01-01
    • 2018-08-23
    • 2017-06-23
    • 2018-02-11
    • 2020-03-22
    • 1970-01-01
    • 2020-02-23
    相关资源
    最近更新 更多