docker-compose定义和引用变量

1. 在yml文件中定义变量

添加 environment: 字段,后边跟数组格式 " key: val "

# docker-compose.yml
version: '3'
services:
    image: 'docker.io/mysql:latest'
    environment:
      MYSQL_ROOT_PASSWORD: "liubei@2021"
      MYSQL_USER: 'liubei'
      MYSQL_PASSWORD: 'liubei@2021'
      MYSQL_DATABASE:  'liubeidb'

2. 在.env文件中的变量

2.1 容器中引用为环境变量

  • .env 文件
  • TZ=Asia/Shanghai
    MYSQL_ROOT_PASSWORD=liubei@2021
    docker-compose.yml文件
    添加 environment:字段,后边跟数组格式 " - xxxx "
    version: '3'
    services:
      mysql:
        image: 'docker.io/mysql:latest'
        restart: always
        container_name: mysql
        ports:
          - '13306:3306'
        environment:
          - MYSQL_ROOT_PASSWORD
    
    [root@n9e-v5 mysql]# docker-compose config
    services:
      mysql:
        container_name: mysql
        environment:
          MYSQL_ROOT_PASSWORD: liubei@2021
          TZ: Asia/Shanghai
        image: docker.io/mysql:latest
        ports:
        - 13306:3306/tcp
        restart: always
    version: '3.0'
    

    2.2 yml文件启动容器时的变量

    说明:比如映射出哪个端口,容器的名字等等。这些并不是容器中的变量,我们也可以直接在.env文件中定义。

  • .env文件
  • TZ=Asia/Shanghai
    MYSQL_ROOT_PASSWORD=liubei@2021
    PORT=13306
    
  • docker-compose.yml文件
  • version: '3'
    services:
      mysql:
        image: 'docker.io/mysql:latest'
        restart: always
        container_name: mysql
        ports:
          - '${PORT}:3306'
        environment:
          - MYSQL_ROOT_PASSWORD
    
    [root@n9e-v5 mysql]# docker-compose config
    services:
      mysql:
        container_name: mysql
        environment:
          MYSQL_ROOT_PASSWORD: liubei@2021
          TZ: Asia/Shanghai
        image: docker.io/mysql:latest
        ports:
        - 13306:3306/tcp
        restart: always
    version: '3.0'
    

    3. 引用其他文件的变量

    创建 test.env 文件

  • docker-compose.yml 文件
    添加 env_file: 字段

  • version: '3'
    services:
      mysql:
        image: 'docker.io/mysql:latest'
        restart: always
        container_name: mysql
        ports:
          - '13306:3306'
        environment:
          ABC: abc_abc
        env_file:
          - ./test.env
    services:
      mysql:
        container_name: mysql
        environment:
          ABC: abc_abc
          MYSQL_ROOT_PASSWORD: liubei@2021
          PORT: '13306'
          TZ: Asia/Shanghai
        image: docker.io/mysql:latest
        ports:
        - 13306:3306/tcp
        restart: always
    version: '3.0'
    

    4. 引用主机变量

        environment:
          XI_SHU: ${MY_NAME:-liubei}
    

    容器中变量key为:XI_SHU,它的值会读取宿主机key为MY_NAME的值,缺省默认使用liubei

  • yml文件
  • version: "3.1"
    services:
      mysql:
        image: harbocto.boe.com.cn/public/mysql:5.7
        environment:
          MYSQL_ROOT_PASSWORD: 'liubei@2021'
          TZ: Asia/Shanghai
          MYSQL_USER: ${MY_NAME:-liubei}
          MYSQL_PASSWORD: 'liubei@2021'
          MYSQL_DATABASE: ${MY_NAME:-liubei}db
        restart: always
        ports:
          - 3306:3306
        volumes:
          - ./data:/var/lib/mysql
    
  • 当宿主机没有定义MY_NAME时,查看结果
  • [root@liubei mysql]# echo $MY_NAME
    [root@liubei mysql]# docker-compose config
    services:
      mysql:
        environment:
          MYSQL_DATABASE: liubeidb
          MYSQL_PASSWORD: liubei@2021
          MYSQL_ROOT_PASSWORD: Boe888888
          MYSQL_USER: liubei
          TZ: Asia/Shanghai
        image: harbocto.boe.com.cn/public/mysql:5.7
        ports:
        - 3306:3306/tcp
        restart: always
        volumes:
        - /usr/local/mysql/data:/var/lib/mysql:rw
    version: '3.1'
    

    如上可见,因为宿主机没有变量MY_NAME,mysql用户名和库名使用了默认值。

  • 当宿主机定义MY_NAME=guanYu时,查看结果
  • [root@liubei mysql]# export MY_NAME=guanYu
    [root@liubei mysql]# echo $MY_NAME
    guanYu
    [root@liubei mysql]# docker-compose config
    services:
      mysql:
        environment:
          MYSQL_DATABASE: guanYudb
          MYSQL_PASSWORD: liubei@2021
          MYSQL_ROOT_PASSWORD: Boe888888
          MYSQL_USER: guanYu
          TZ: Asia/Shanghai
        image: harbocto.boe.com.cn/public/mysql:5.7
        ports:
        - 3306:3306/tcp
        restart: always
        volumes:
        - /usr/local/mysql/data:/var/lib/mysql:rw
    version: '3.1'
    

    如上可见,因为宿主机定义了变量MY_NAME=guanYu,mysql用户名和库名使用了该变量值。