从.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
相关产品推荐
相关产品推荐

