如何将环境变量传递给docker-compose up

Abh*_*i.G 26 docker dockerfile docker-compose

我正在尝试运行一个容器.我已将图像上传到私有Docker注册表.我想写一个compose文件来下载和部署图像.但我想将TAG名称作为docker-compose run命令中的变量传递.我的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"
Run Code Online (Sandbox Code Playgroud)

Jak*_*kul 35

您有两种选择:

  1. 按照另一个答案中的建议创建.env文件.
  2. 将对KEY=VALUE(或)添加到您的docker-compose命令中,例如:

    KB_DB_TAG_VERSION=kb-1.3.20-v1.0.0 docker-compose up
    
    Run Code Online (Sandbox Code Playgroud)

    在脚本中早期导出它也应该有效,例如:

    export KB_DB_TAG_VERSION=kb-1.3.20-v1.0.0
    docker-compose up
    
    Run Code Online (Sandbox Code Playgroud)

  • 缺少“-e”标志是多么奇怪。它用于“docker-compose run”。好吧。 (51认同)
  • 这不适用于 Windows CMD 或 PowerShell (5认同)
  • 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 (3认同)
  • 前置变量似乎会覆盖 .env 中给出的版本。(因此可以使用前置来尝试临时更改而不更改 .env) (3认同)
  • @KarlPokus 是的,非常令人困惑 (2认同)

vas*_*orc 21

只是为了补充其他人,特别是@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"

Run Code Online (Sandbox Code Playgroud)

其中MYSQL_PASSWORD两者都是:

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


Dan*_*ell 10

可以在命令行上将环境变量传递给容器,而无需在文件中指定值。在 docker-compose 文件中容器的服务定义上添加environment包含变量名称的键(无值或赋值运算符):

db:
    ...
    environment:
        - KB_DB_TAG_VERSION
Run Code Online (Sandbox Code Playgroud)

以这种方式使用,没有赋值,意味着 docker-compose 将在当前环境/shell 中查找环境变量:

KB_DB_TAG_VERSION=mytagversion docker-compose up
Run Code Online (Sandbox Code Playgroud)

参考:https://docs.docker.com/compose/environment-variables/#pass-environment-variables-to-containers

  • 这次真是万分感谢!迄今为止最好的解决方案! (2认同)

Seb*_*sch 6

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

KB_DB_TAG_VERSION=kb-1.3.20-v1.0.0
Run Code Online (Sandbox Code Playgroud)

您的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"
Run Code Online (Sandbox Code Playgroud)