【问题标题】:How to pass environment variable to docker-compose up如何将环境变量传递给 docker-compose up
【发布时间】:2018-08-23 22:34:00
【问题描述】:

我正在尝试运行一个容器。我已经将图像上传到私有 Docker 注册表。我想编写一个撰写文件来下载和部署图像。但我想将 TAG 名称作为 docker-compose 运行命令中的变量传递。我的 compose 文件如下所示。如何将 KB_DB_TAG_VERSION 的值作为 docker-compose up 命令的一部分传递?

version: '3'
services:
   db:
    #build: k-db
    user: "1000:50"
    volumes:
      - /data/mysql:/var/lib/mysql
    container_name: k-db
    environment:
      - MYSQL_ALLOW_EMPTY_PASSWORD=yes
    image:  XX:$KB_DB_TAG_VERSION
    image: k-db
    ports:
      - "3307:3306"

【问题讨论】:

    标签: docker docker-compose dockerfile


    【解决方案1】:

    只是为了补充其他人概述的内容,尤其是@JakubKukul

    出于安全考虑,如果您的 docker-compose 文件受版本控制,您可能不希望在 docker-compose 文件中保留易受攻击的信息,例如用户名/密码。您也可以将主机上的环境变量映射到容器内的环境变量。在这种情况下,它可能类似于以下内容:

    version: '3'
    services:
       db:
        #build: k-db
        user: "1000:50"
        volumes:
          - /data/mysql:/var/lib/mysql
        container_name: k-db
        environment:
          - MYSQL_ALLOW_EMPTY_PASSWORD=yes
          - MYSQL_PASSWORD=${MYSQL_PASSWORD}
        image:  XX:$KB_DB_TAG_VERSION
        image: k-db
        ports:
          - "3307:3306"
    
    

    MYSQL_PASSWORD 两者兼有:

    1. 主机上的环境变量(可能只是在当前的 shell 会话中)
    2. 来自db 服务的容器内的环境变量

    【讨论】:

      【解决方案2】:

      您可以在执行docker-compose up 命令的目录(以及您的docker-compose.yml 文件所在的目录)上创建一个.env 文件,内容如下:

      KB_DB_TAG_VERSION=kb-1.3.20-v1.0.0
      

      您的docker-compose.yml 文件应如下所示(添加了{}):

      version: '3'
      services:
         db:
           user: "1000:50"
           volumes:
             - /data/mysql:/var/lib/mysql
           container_name: k-db
           environment:
             - MYSQL_ALLOW_EMPTY_PASSWORD=yes
           image: XX:${KB_DB_TAG_VERSION}
           image: k-db
           ports:
             - "3307:3306"
      

      进行上述更改后,使用命令docker-compose config检查更改是否反映。变量将被变量值替换。请参考页面here了解更多关于变量替换的内容。

      【讨论】:

      • 当我尝试这个选项时,我看到正在添加额外的“+”。 XX:+kb-1.3.20-v1.0.0
      • 您不想设置额外的+?应该设置哪个值?
      • 我希望它是 XX:kb-1.3.20-v1.0.0 而不是 XX:+kb-1.3.20-v1.0.0。我不想要“+”。
      【解决方案3】:

      在你的 docker-compose.yml 文件中添加

      env_file:
        - .env_file
      

      到您的 db 服务,其中 .env_file 是您的 .env 文件(相应地更改其名称)。

      version: '3'
      services:
         db:
          #build: k-db
          user: "1000:50"
          volumes:
            - /data/mysql:/var/lib/mysql
          container_name: k-db
          env_file:
            - .env_file
          environment:
            - MYSQL_ALLOW_EMPTY_PASSWORD=yes
          image:  XX:$KB_DB_TAG_VERSION
          image: k-db
          ports:
            - "3307:3306"
      

      【讨论】:

      • 这是错误的!阅读文档。 env_file:定义 runtime 环境变量,而不是构建时!默认情况下,docker-compose 会将一个 .env 文件(必须命名为 .env 这显然不可参数化)解析到构建时环境中。但是,在这种情况下,您是否在 env_file: .env 下声明它的事实完全无关紧要 - docker-compose 无论如何都会寻找它。因此,您的答案似乎有效,但实际上并非如此。那些寻找内置环境的人应该阅读其他答案。
      【解决方案4】:

      你有两个选择:

      1. 按照另一个answer 中的建议创建.env file
      2. KEY=VALUE 对添加到您的docker-compose 命令前,例如:

        KB_DB_TAG_VERSION=kb-1.3.20-v1.0.0 docker-compose up
        

        在脚本中更早地导出它也应该可以工作,例如:

        export KB_DB_TAG_VERSION=kb-1.3.20-v1.0.0
        docker-compose up
        

      【讨论】:

      • KB_DB_TAG_VERSION=kb-1.3.20-v1.0.0 docker-compose up,仅在环境中的 docker-compose.yml 中有效:KB_DB_TAG_VERSION=$KB_DB_TAG_VERSION
      • -e 标志丢失了多么奇怪。那里有docker-compose run。好吧好吧。
      • @KarlPokus 是的,很混乱
      • 添加一个变量似乎会覆盖 .env 中给出的版本。 (所以前置可用于在不更改 .env 的情况下尝试临时更改)
      猜你喜欢
      • 2020-11-07
      • 1970-01-01
      • 2020-02-23
      • 2019-06-06
      • 2021-11-27
      • 2017-09-18
      • 1970-01-01
      • 2020-09-29
      相关资源
      最近更新 更多