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

Docker部署CouchDB实例间数据复制失败问题求助

解决CouchDB Docker实例间复制失败问题

核心问题分析

你遇到的两个错误本质上都是网络连通性和地址解析问题:

  1. invalid_json:大概率是因为URL中直接携带认证信息的格式不符合CouchDB的JSON序列化要求,同时后续的连接失败也会间接导致JSON解析报错。
  2. replication_auth_error/econnrefused:当你调用localhost:5984/_replicate时,复制操作是由couchdb1容器内部执行的。容器内的localhost指向容器自身,而非宿主机,因此couchdb1无法通过localhost:5985访问到宿主机上映射的couchdb2实例,导致连接拒绝。

解决方案1:使用Docker Compose内部服务名访问(推荐)

同一Docker Compose网络下的服务可直接通过服务名互相访问,无需依赖宿主机端口映射。修改复制请求如下:

const replicateTest = async () => {
  try {
    const { data } = await axios.post(
      "http://admin:admin@localhost:5984/_replicate",
      {
        source: "test_1", // 源数据库在本地,直接写名称即可
        target: {
          url: "http://couchdb2:5984/test_1", // 使用compose服务名+容器内部端口
          auth: {
            basic: {
              username: "admin",
              password: "admin"
            }
          }
        },
        create_target: true
      },
      {
        headers: {
          "Content-Type": "application/json",
          Accept: "application/json"
        }
      }
    );
    console.log(data);
  } catch (err) {
    console.error(err.response?.data || err.message);
  }
};

关键说明:

  • 源数据库test_1在couchdb1本地,无需写完整URL,直接填数据库名即可。
  • target使用Docker Compose服务名couchdb2,容器内部端口为5984(而非宿主机的5985),同一compose网络内服务可直接通过该地址访问。
  • 单独配置认证信息,避免URL中带账号密码导致的JSON序列化问题。

解决方案2:使用宿主机IP访问(非compose网络场景适用)

如果需要通过宿主机IP访问,可使用Docker提供的特殊域名或宿主机实际IP:

const replicateTest = async () => {
  try {
    const { data } = await axios.post(
      "http://admin:admin@localhost:5984/_replicate",
      {
        source: "test_1",
        target: {
          url: "http://host.docker.internal:5985/test_1", // Docker Desktop指向宿主机的域名
          auth: {
            basic: {
              username: "admin",
              password: "admin"
            }
          }
        },
        create_target: true
      },
      {
        headers: {
          "Content-Type": "application/json",
          Accept: "application/json"
        }
      }
    );
    console.log(data);
  } catch (err) {
    console.error(err.response?.data || err.message);
  }
};

Linux环境补充配置:

如果是Linux系统,需要在docker-compose.yaml的couchdb1服务中添加extra_hosts:

couchdb1:
  # 其他配置不变
  extra_hosts:
    - "host.docker.internal:host-gateway"

验证步骤

  1. 进入couchdb1容器,执行以下命令验证连通性:
    docker exec -it my-couchdb1 curl http://admin:admin@couchdb2:5984/_all_dbs
    
    若能返回数据库列表,说明网络连通正常。
  2. 运行修改后的复制代码,检查是否成功。

内容的提问来源于stack exchange,提问作者InonBr

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.14 17:23:19