You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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解析时会保留完整内容,所以能正常传递。

解决方法

有三种方式可以修复这个问题:

  1. 用单引号包裹变量值
    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'
        ...
    
  2. 转义&符号
    在每个&前添加反斜杠\,避免被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
        ...
    
  3. 改用键值对格式定义环境变量
    这种写法更直观,且双引号内的特殊字符不会被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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.12 08:56:06