Docker经验:不同集群环境保持代码一致问题

问题:公司的开发环境在内网,测试环境在阿里云,生成环境也在阿里云,容器内的应用,需要连接redis和mysql服务。传统的部署方式,都是把redis和mysql连接信息写在配置文件或者代码里面,但是迁移Docker环境后,如果还是用这种方式处理,外部的redis和mysql连接方式都不一样,三个环境需要打包三个image,很不友好,如何确保同一份代码适应三个不同的环境呢

恶心方案:通过脚本判断当前环境,不同环境使用不同的配置,例如:

if $SUBNET == "192.168.100.0/24": #生成环境
	REDIS="192.168.100.123:4501"
	MySQL="192.168.100.124:3388"
elif $SUBNET == "192.168.201.0/24": #开发环境
	REDIS="192.168.201.56:4501"
	MySQL="192.168.202.78:3388"
fi

这样虽然勉强能用,但是如果不同环境下的服务地址发生了变化,同样需要去修改代码,可扩展性和可维护性任然很差。

最终方案:通过环境变量传递redis和mysql连接信息,代码统一从环境变量获取redis和mysql连接信息

在不同环境的集群中启动服务时,将环境变量配制成相应的服务地址就可以了 例如:在启动服务是传入REDIS和MYSQL两个环境变量:

UI-env

命令行启动服务,可以使用--env参数

这样,不同的环境,一份代码完全通用了。