如果设置了变量,如何将 docker compose 配置为使用给定的子网,或者如果未设置则自行选择?

Luk*_*mus 8 environment-variables docker docker-compose docker-networking

我的 docker compose 文件中有以下网络配置。

networks:
    default:
        ipam:
            driver: default
            config:
                - subnet: ${DOCKER_SUBNET}
Run Code Online (Sandbox Code Playgroud)

DOCKER_SUBNET被设置时,如预期可以用来在变量中指定的子网。当变量未设置时,我得到:ERROR: Invalid subnet : invalid CIDR address:因为变量是空白的(这是完全合理的)。

有没有办法配置 ipam 驱动程序,以便在DOCKER_SUBNET未设置变量时,docker -compose 将选择一个可用的子网,就像未提供 ipam 配置时通常会做的那样?

小智 10

networks:
  Mynetwork:
      driver: bridge
      ipam:
          driver: default
          config:
              - subnet: "192.168.0.0/24"
                gateway: "192.168.0.1"
  #- default:
      #driver: bridge
Run Code Online (Sandbox Code Playgroud)


Mat*_*att 7

如果您不ipam为网络提供任何配置,Compose 只会选择一个可用的子网。Compose 没有动态修改配置的高级功能。

您可以在 compose 之外做出决定,使用多个 compose 文件或基于模板的系统,在 shell 或启动docker-compose命令的其他语言中。

将网络配置与服务配置分开

docker-compose-net-auto.yml

version: "2.1"
networks:
  default:
Run Code Online (Sandbox Code Playgroud)

docker-compose-net-subnet.yml

version: "2.1"
networks:
  default:
    ipam:
      driver: default
      config:
        - subnet: ${DOCKER_SUBNET}
Run Code Online (Sandbox Code Playgroud)

然后创建一个脚本launch.sh来选择要包含的网络文件。

#!/bin/sh
if [ -z "$DOCKER_SUBNET" ]; then
  docker-compose -f docker-compose.yml -f docker-compose-net-auto.yml up
else
  docker-compose -f docker-compose.yml -f docker-compose-net-subnet.yml up
fi
Run Code Online (Sandbox Code Playgroud)