如何通过环境变量配置docker-compose.yml中的网络名称

132次阅读
没有评论

问题描述

在使用docker-compose时,遇到了一个问题。他在docker-compose.yml文件中使用了环境变量来配置特定阶段的配置。但是,他发现网络名称是在标签中指定的,而无法从外部进行配置。
以下是他在docker-compose.yml文件中的网络配置示例:

networks:
  mynetwork.${STAGE_NAME}:
    driver: bridge
    ipam:
      driver: default
      config:
        - subnet: ${STAGE_NETWORK_PREFIX}.0/24

他想知道是否有办法从外部配置网络名称mynetwork.${STAGE_NAME}

解决方案

请注意以下操作注意版本差异及修改前做好备份。

方案1

可以通过网络名称来实现配置:

networks:
  mynetwork:
    name: ${STAGE_NAME}

其中:
mynetwork是在堆栈内部的名称。
${STAGE_NAME}是其他堆栈/服务/容器的名称。

可以参考Docker官方GitHub上的评论:https://github.com/moby/moby/issues/40819#issuecomment-618726892

方案2

如果你安装了envsubst(gnu gettext的一部分),你可以使用以下命令:

export STAGE_NAME="xyz"
export STAGE_NETWORK_PREFIX="1.2.3.4"
docker-compose -f <(envsubst < docker-compose.yml) ...

如果你的shell不支持进程替换,你可以使用以下命令:

envsubst < docker-compose.yml | docker-compose -f - ...

方案3

我没有找到直接控制网络名称的方法,但我注意到在创建docker网络名称时,使用了包含docker-compose.yml文件的文件夹作为前缀。我的解决方案是编写一个docker-compose的包装脚本,该脚本会创建一个以阶段名称命名的新文件夹。
以下是一个示例脚本:

TARGET=/tmp/$STAGE_NAME
mkdir -p $TARGET
ln -sf $(pwd)/docker-compose.yml $TARGET/docker-compose.yml
cd $TARGET
docker-compose "$@"
cd -

方案4

在docker-compose中有一个-p选项,可以将前缀设置为自定义值。

以上是几种解决方案,你可以根据自己的需求选择适合的方法来配置docker-compose.yml中的网络名称。

正文完