如果设置了变量,如何配置 docker 组合使用给定的子网,如果没有设置则自行选择?

How do configure docker compose to use a given subnet if a variable is set, or choose for itself if it isn't?

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

networks:
    default:
        ipam:
            driver: default
            config:
                - subnet: ${DOCKER_SUBNET}

设置 DOCKER_SUBNET 时,将按预期使用该变量中指定的子网。当未设置变量时,我得到:ERROR: Invalid subnet : invalid CIDR address: 因为变量为空(这是完全合理的)。

有没有一种方法可以配置 ipam 驱动程序,以便在未设置 DOCKER_SUBNET 变量时,docker-compose 将选择一个可用的子网,如果 ipam 配置为没有给出?

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

您可以在 multiple compose files 或基于模板的系统、shell 或其他启动 docker-compose 命令的语言中做出决定。

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

docker-compose-net-auto.yml

version: "2.1"
networks:
  default:

docker-compose-net-subnet.yml

version: "2.1"
networks:
  default:
    ipam:
      driver: default
      config:
        - subnet: ${DOCKER_SUBNET}

然后创建一个脚本 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
networks:
  Mynetwork:
      driver: bridge
      ipam:
          driver: default
          config:
              - subnet: "192.168.0.0/24"
                gateway: "192.168.0.1"
  #- default:
      #driver: bridge