Docker Compose无法向服务容器传递环境变量问题求助
Docker Compose环境变量传递失败排查与解决
问题原因
你的docker-compose.yml中,MYSQL_DB_HOST的环境变量值包含&符号,而YAML语法里&是锚点标识,会被解析器特殊处理,导致变量值被截断为jdbc:mysql://dbhost:3306/dbname?autoReconnect=true,后续的serverTimezone=UTC&useSSL=false部分丢失,Java程序读取到不完整的URL,因此抛出URL must start with 'jdbc'的异常。
而docker run命令中,变量值被双引号包裹,shell解析时会保留完整内容,所以能正常传递。
解决方法
有三种方式可以修复这个问题:
用单引号包裹变量值
YAML会忽略单引号内的特殊字符,确保变量值完整传递:services: api: build: context: ./backend dockerfile: Dockerfile container_name: api ports: - 8080:8080 environment: - MYSQL_DB_USER=user - MYSQL_DB_PASS=password - MYSQL_DB_HOST='jdbc:mysql://dbhost:3306/dbname?autoReconnect=true&serverTimezone=UTC&useSSL=false' ...转义
&符号
在每个&前添加反斜杠\,避免被YAML解析为锚点:services: api: build: context: ./backend dockerfile: Dockerfile container_name: api ports: - 8080:8080 environment: - MYSQL_DB_USER=user - MYSQL_DB_PASS=password - MYSQL_DB_HOST=jdbc:mysql://dbhost:3306/dbname?autoReconnect=true\&serverTimezone=UTC\&useSSL=false ...改用键值对格式定义环境变量
这种写法更直观,且双引号内的特殊字符不会被YAML解析:services: api: build: context: ./backend dockerfile: Dockerfile container_name: api ports: - 8080:8080 environment: MYSQL_DB_USER: user MYSQL_DB_PASS: password MYSQL_DB_HOST: "jdbc:mysql://dbhost:3306/dbname?autoReconnect=true&serverTimezone=UTC&useSSL=false" ...
验证方式
修改配置后,执行docker-compose up -d启动服务,进入容器执行以下命令检查变量值是否完整:
docker exec api echo $MYSQL_DB_HOST
如果输出完整的JDBC URL,说明环境变量已正确传递,服务应该能正常启动。
内容的提问来源于stack exchange,提问作者Joao Vitorino
相关产品推荐
相关产品推荐

