docker-compose.yml环境变量中锚点、别名与插值的失效问题
Docker Compose YAML锚点插值失效问题解决
我尝试用Docker Compose的YAML锚点特性复用标量值,但在环境变量的连接字符串里无法解析锚定变量。哪怕用env_file加载变量,插值还是不生效。简化后的docker-compose.yml代码如下:
version: '3.4' services: SqlServer: container_name: &sqlserver sql_server hostname: *sqlserver image: amd64/busybox environment: ACCEPT_EULA: Y MSSQL_SA_PASSWORD: &sqlsapassword myrandompassword CHECK_POLICY: 'OFF' command: /bin/env RemoteService: container_name: &remoteservice remote_service image: amd64/busybox environment: ASPNETCORE_ENVIRONMENT: Production ASPNETCORE_HTTP_PORTS: &remoteport 8081 S1: *sqlserver S2: *sqlsapassword ConnectionStrings__default: Data Source=$S1,1433;Initial Catalog=easy;User ID=sa;Password=*sqlsapassword command: /bin/env depends_on: - SqlServer
目前的现象是:S1和S2能正常获取锚点值,但连接字符串里的$S1和*sqlsapassword完全没被解析,插值彻底失效。
解决方法
Docker Compose的YAML锚点只能直接替换整个值,没法在字符串内部插值,推荐用以下方案:
方案:用Docker Compose内置的环境变量替换(最稳妥)
- 在项目根目录创建
.env文件,写入共享变量:
SQL_SERVER_NAME=sql_server SQL_SA_PASSWORD=myrandompassword
- 修改
docker-compose.yml,用${变量名}的方式引用:
version: '3.4' services: SqlServer: container_name: ${SQL_SERVER_NAME} hostname: ${SQL_SERVER_NAME} image: amd64/busybox environment: ACCEPT_EULA: Y MSSQL_SA_PASSWORD: ${SQL_SA_PASSWORD} CHECK_POLICY: 'OFF' command: /bin/env RemoteService: container_name: remote_service image: amd64/busybox environment: ASPNETCORE_ENVIRONMENT: Production ASPNETCORE_HTTP_PORTS: 8081 ConnectionStrings__default: Data Source=${SQL_SERVER_NAME},1433;Initial Catalog=easy;User ID=sa;Password=${SQL_SA_PASSWORD} command: /bin/env depends_on: - SqlServer
这种方法利用Docker Compose自带的环境变量解析机制,会自动读取.env文件里的变量并替换。
原因说明
YAML锚点是YAML语法层面的替换,只能直接替换整个键值对的值,没法在字符串内部做插值。而$S1是Shell层面的变量引用,只有容器内部的Shell会解析,但Docker Compose在构建时不会提前把容器环境变量注入到连接字符串里,所以导致插值失败。
内容的提问来源于stack exchange,提问作者ZorgoZ
相关产品推荐
相关产品推荐

