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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.16 07:40:22