如何在Docker容器化的.NET 8 ASP.NET API中连接MySQL数据库
解决Docker容器中.NET 8 API连接MySQL的"No MySQL host available"错误
核心问题与修复步骤
1. 修正数据库连接字符串的主机地址
在你的.NET API配置(如appsettings.json)中,连接字符串的主机不能用localhost或127.0.0.1,必须使用docker-compose里定义的MySQL服务名database——Docker Compose会为同一网络内的服务自动创建DNS解析,通过服务名可直接访问对应容器。
示例连接字符串:
"ConnectionStrings": { "DefaultConnection": "server=database;port=3306;database=db;user=user;password=secretpassword;SslMode=None" }
添加SslMode=None可避免MySQL 5.7的SSL连接兼容性问题。
2. 修复MySQL环境变量冲突
你的配置中同时设置了MYSQL_ROOT_PASSWORD=1234和MYSQL_ALLOW_EMPTY_PASSWORD=1,这两个变量互斥,会导致MySQL初始化异常。直接删除MYSQL_ALLOW_EMPTY_PASSWORD=1这一行即可。
3. 优化容器启动依赖,确保数据库就绪
depends_on仅保证API容器在数据库容器之后启动,但不会等待数据库完成初始化。修改depends_on配置,结合健康检查让API等数据库完全就绪后再启动:
修改docker-compose.yml中api服务的配置:
api: container_name: API build: context: . dockerfile: API/Dockerfile ports: - 5092:8080 depends_on: database: condition: service_healthy
同时修正MySQL的健康检查命令,添加root用户和密码才能正常ping通:
healthcheck: test: ["CMD", "mysqladmin", "ping", "-h", "localhost", "-u", "root", "-p1234"] timeout: 20s retries: 10
4. 确认MySql.Data包版本兼容性
确保安装的MySql.Data包版本与MySQL 5.7兼容,推荐使用8.0.x系列版本(如8.0.33),过高版本可能和MySQL 5.7存在适配问题。
调整后的完整docker-compose.yml
version: '3.4' services: database: container_name: DB image: mysql:5.7 environment: - MYSQL_ROOT_PASSWORD=1234 - MYSQL_DATABASE=db - MYSQL_USER=user - MYSQL_PASSWORD=secretpassword volumes: - dbdata:/var/lib/mysql - ./MySqlScripts/init.sql:/docker-entrypoint-initdb.d/1.sql:ro restart: on-failure healthcheck: test: ["CMD", "mysqladmin", "ping", "-h", "localhost", "-u", "root", "-p1234"] timeout: 20s retries: 10 ports: - 3306:3306 command: --default-authentication-plugin=mysql_native_password api: container_name: API build: context: . dockerfile: API/Dockerfile ports: - 5092:8080 depends_on: database: condition: service_healthy volumes: dbdata:
内容的提问来源于stack exchange,提问作者KnYL3R
相关产品推荐
相关产品推荐

