Docker Compose中自定义Dart应用无法通过服务名连接MariaDB
问题:Docker Compose中Dart应用无法连接MariaDB服务
我尝试在Docker Compose中连接两个服务,查阅相关问题后仍未解决。代码中打印环境变量显示为'mariadb',phpMyAdmin可以正常连接,但自定义Dart应用无法连接,报错域名解析失败。
Docker Compose配置
version: '3' services: mariadb: image: mariadb restart: always environment: MARIADB_ROOT_PASSWORD: password volumes: - mariadb-data:/var/lib/mysql myproject: build: . environment: - DBHOST=mariadb depends_on: - mariadb phpmyadmin: image: phpmyadmin restart: always ports: - "8000:80" environment: - PMA_ARBITRARY=1 - PMA_HOST=mariadb depends_on: - mariadb volumes: mariadb-data:
错误日志
SocketException: Failed host lookup: 'mariadb' (OS Error: System error, errno = -11)
连接代码(Dart)
使用mysql1包,基于Docker Hub标准Dart镜像构建:
final settings = ConnectionSettings(host: 'mariadb',user: 'root',password: EnvStore.dbpass); conn = await MySqlConnection.connect(settings);
解决步骤
1. 确保MariaDB服务完全就绪
depends_on仅保证容器启动顺序,不代表MariaDB服务已就绪。添加健康检查确保服务可用:
修改mariadb服务配置:
mariadb: image: mariadb restart: always environment: MARIADB_ROOT_PASSWORD: password MARIADB_BIND_ADDRESS: 0.0.0.0 # 允许外部容器访问 volumes: - mariadb-data:/var/lib/mysql healthcheck: test: ["CMD", "mysqladmin", "ping", "-h", "localhost", "-u", "root", "-ppassword"] interval: 5s timeout: 5s retries: 5
同时更新myproject服务的依赖条件:
myproject: build: . environment: - DBHOST=mariadb depends_on: mariadb: condition: service_healthy
2. 确认MariaDB绑定地址
默认MariaDB仅绑定127.0.0.1,需修改为0.0.0.0允许容器间访问,上述配置已包含该参数。
3. 检查连接代码的端口配置
mysql1包默认端口为3306,若MariaDB未修改端口,可显式指定确保正确:
final settings = ConnectionSettings( host: 'mariadb', port: 3306, user: 'root', password: EnvStore.dbpass ); conn = await MySqlConnection.connect(settings);
4. 测试容器内DNS解析
进入myproject容器执行命令,验证是否能解析mariadb:
docker exec -it myproject ping mariadb # 或 docker exec -it myproject nslookup mariadb
若无法解析,重启Docker服务或检查Docker DNS配置。
内容的提问来源于stack exchange,提问作者magic
相关产品推荐
相关产品推荐

