问题描述
在使用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中的网络名称。
正文完