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

从.env取值配置docker-compose.yml后数据库连接失败求助

数据库连接失败排查求助

环境文件与配置内容

.env 文件内容

DATABASE_USERNAME=value
DATABASE_PASSWORD=value

docker-compose.yml 文件内容

version: "3.9"

services:
  database:
    container_name: database
    image: mysql:8.0.33
    restart: always
    env_file:
      - .env  # 使用.env文件中的环境变量
    environment:
      MYSQL_DATABASE: bookdelivery
      MYSQL_PASSWORD: ${DATABASE_PASSWORD}
      MYSQL_ROOT_PASSWORD: ${DATABASE_PASSWORD}
      MYSQL_ROOT_HOST: '%'
      MYSQL_PORT: 3307
    volumes:
      - ./db:/var/lib/mysql
    ports:
      - "3307:3306"
    networks:
      - bookDeliveryNetwork

  bookdelivery:
    build:
      context: .
      dockerfile: Dockerfile
    container_name: bookdelivery
    restart: on-failure
    env_file:
      - .env  # 使用.env文件中的环境变量
    ports:
      - "1221:1221"
    environment:
      - server.port=1221
      - spring.datasource.username=${DATABASE_USERNAME}
      - spring.datasource.password=${DATABASE_PASSWORD}
      - spring.datasource.url=jdbc:mysql://host.docker.internal:3307/bookdelivery
    depends_on:
      - database
    networks:
      - bookDeliveryNetwork


networks:
  bookDeliveryNetwork:

docker compose config 执行结果

name: bookdelivery                                      
services:                                               
  bookdelivery:                                         
    build:                                              
      context: C:\Users\Noyan\IdeaProjects\bookdelivery
      dockerfile: Dockerfile                            
    container_name: bookdelivery                        
    depends_on:
      database:
        condition: service_started
    environment:
      DATABASE_PASSWORD: value
      DATABASE_USERNAME: value
      server.port: "1221"
      spring.datasource.password: value
      spring.datasource.url: jdbc:mysql://host.docker.internal:3307/bookdelivery
      spring.datasource.username: root
    networks:
      bookDeliveryNetwork: null
    ports:
    - mode: ingress
      target: 1221
      published: "1221"
      protocol: tcp
    restart: on-failure
  database:
    container_name: database
    environment:
      DATABASE_PASSWORD: value
      DATABASE_USERNAME: value
      MYSQL_DATABASE: bookdelivery
      MYSQL_PASSWORD: value
      MYSQL_PORT: "3307"
      MYSQL_ROOT_HOST: '%'
      MYSQL_ROOT_PASSWORD: value
    image: mysql:8.0.33
    networks:
      bookDeliveryNetwork: null
    ports:
    - mode: ingress
      target: 3306
      published: "3307"
      protocol: tcp
    restart: always
    volumes:
    - type: bind
      source: C:\Users\Username\IdeaProjects\bookdelivery\db
      target: /var/lib/mysql
      bind:
        create_host_path: true
networks:
  bookDeliveryNetwork:
    name: bookdelivery_bookDeliveryNetwork

执行 docker-compose up -d 时的错误

Caused by: com.mysql.cj.exceptions.CJCommunicationsException: Communications link failure

排查方向与修复建议

  • 修正数据库连接地址
    同一自定义网络内的容器,应该用服务名database而非host.docker.internal访问数据库。同时MySQL容器内部监听的是3306端口,不是宿主机映射的3307。修改bookdelivery服务的spring.datasource.url为:

    jdbc:mysql://database:3306/bookdelivery?useSSL=false&allowPublicKeyRetrieval=true&serverTimezone=UTC
    
  • 处理数据库初始化延迟
    depends_on: service_started只保证容器启动,但MySQL可能还没完成初始化就被Spring应用连接。可以给Spring应用加连接重试:
    在环境变量中添加:

    spring.datasource.hikari.connection-timeout=30000
    spring.datasource.hikari.maximum-pool-size=10
    spring.datasource.hikari.validation-timeout=5000
    spring.datasource.hikari.connection-test-query=SELECT 1
    
  • 核对数据库用户名配置
    从docker compose config结果看,spring.datasource.username被解析为root,但.env中是DATABASE_USERNAME=value。如果要使用自定义用户,需要在MySQL容器中预先创建用户并授权,当前配置仅设置了root用户的密码,没有自定义用户的初始化逻辑。

  • 检查容器间网络连通性
    进入bookdelivery容器测试与数据库的连通:

    docker exec -it bookdelivery bash
    ping database
    telnet database 3306
    
  • 查看MySQL启动日志
    检查MySQL是否正常初始化:

    docker logs database
    

内容的提问来源于stack exchange,提问作者Sercan Noyan Germiyanoğlu

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.10 12:36:05