Docker容器Job_portal无法连接MySQL:问题排查求助
常见错误原因及对应解决方法
1. DSN使用localhost而非MySQL服务名
Docker Compose默认会为所有服务创建共享网络,容器之间需通过服务名(即docker-compose.yml中MySQL服务的名称)互相访问,localhost指向容器自身,无法连通其他容器。
排查:
查看main.go或.env中的DSN配置,确认是否存在类似写法:
dsn := "user:password@tcp(localhost:3306)/job_portal?charset=utf8mb4&parseTime=True&loc=Local"
解决:
将DSN中的localhost替换为docker-compose.yml里MySQL服务的名称(比如mysql):
dsn := "user:password@tcp(mysql:3306)/job_portal?charset=utf8mb4&parseTime=True&loc=Local"
若用.env文件,确保DB_HOST变量设置为服务名:
DB_HOST=mysql DB_PORT=3306
2. MySQL容器未就绪就发起连接
Job_portal启动速度快于MySQL,此时MySQL还未完成初始化,导致连接失败。
解决:
在docker-compose.yml的Job_portal服务中添加依赖与健康检查,确保等待MySQL就绪后再启动:
services: mysql: image: mysql:8.0 environment: MYSQL_ROOT_PASSWORD: ${DB_PASSWORD} MYSQL_DATABASE: ${DB_NAME} healthcheck: test: ["CMD", "mysqladmin", "ping", "-h", "localhost"] interval: 5s timeout: 5s retries: 5 job_portal: build: . depends_on: mysql: condition: service_healthy environment: - DB_HOST=${DB_HOST}
3. MySQL权限限制外部访问
默认MySQL可能仅允许root@localhost访问,拒绝容器网络内的连接请求。
解决:
在docker-compose.yml中通过环境变量创建允许任意IP访问的用户:
mysql: image: mysql:8.0 environment: MYSQL_ROOT_PASSWORD: ${DB_PASSWORD} MYSQL_DATABASE: ${DB_NAME} MYSQL_USER: ${DB_USER} MYSQL_PASSWORD: ${DB_PASSWORD} MYSQL_ALLOW_EMPTY_PASSWORD: "no"
或手动进入MySQL容器执行授权命令:
docker exec -it <mysql-container-id> mysql -u root -p GRANT ALL PRIVILEGES ON job_portal.* TO 'user'@'%' IDENTIFIED BY 'password'; FLUSH PRIVILEGES;
4. .env环境变量未正确传递
检查docker-compose.yml是否正确加载.env,且Job_portal服务是否引用了正确变量。
排查:
确认docker-compose.yml顶部是否加载了.env文件:
version: '3.8' env_file: - .env
进入Job_portal容器验证环境变量:
docker exec -it <job-portal-container-id> printenv | grep DB_
解决:
确保docker-compose.yml中Job_portal服务的environment字段正确引用变量,或通过env_file加载整个文件。
5. Docker网络不互通
检查容器是否在同一网络,IP寻址是否正常。
排查:
查看容器所属网络:
docker network inspect <compose-network-name>
在Job_portal容器内ping MySQL服务名验证连通性:
docker exec -it <job-portal-container-id> ping mysql
解决:
为所有服务指定同一自定义网络:
networks: job_portal_net: driver: bridge services: mysql: networks: - job_portal_net mail_service: networks: - job_portal_net job_portal: networks: - job_portal_net
验证步骤
- 停止所有容器:
docker-compose down - 重新构建启动:
docker-compose up --build - 查看Job_portal日志:
docker-compose logs job_portal - 检查MySQL连接:
docker-compose exec mysql mysql -u ${DB_USER} -p${DB_PASSWORD} ${DB_NAME}
内容的提问来源于stack exchange,提问作者Arjun Malhotra

