报错核心是这一句:

failed to create network huoshan_tts_service_default: Error response from daemon: all predefined address pools have been fully subnetted

意思是:

Docker 默认可分配的网段已经用光了,所以 docker compose 想创建 huoshan_tts_service_default 这个网络时,分不出新的子网了。

你的日志前面这些都没问题:
• Dockerfile 正常加载
• 镜像正常 build 完成
• 容器服务也准备好了

真正失败点在:
• Service huoshan-tts-service Built
• Network huoshan_tts_service_default Error

所以这是 Docker 网络资源耗尽,不是 Python、Dockerfile、requirements.txt 的错误。

⸻

为什么会这样

一般有几个常见原因:

1)机器上残留了很多 Docker 网络

你可能反复执行过很多项目的 docker compose up,每个项目都会自动建一个 xxx_default 网络,久了就堆满了。

2)自定义网络很多,没有清理

有些旧项目已经不用了,但 network 还留着。

3)Docker 默认地址池太小

Docker 默认 bridge 网络会从预定义地址池里切子网,如果机器长期跑很多 compose 项目,就可能耗尽。

⸻

先怎么排查

先看当前网络数量:

docker network ls

再看哪些网络还挂着容器:

docker network inspect <网络名>

如果你只是想快速恢复,一般先清理不用的网络。

⸻

最常用解决办法

方案一:清理没在用的 Docker 网络

这个最常见、最安全。

docker network prune

它会删除 未被容器使用的网络。

如果你确认很多旧项目都不用了,可以执行:

docker system prune

如果想更彻底一点:

docker system prune -a

注意:
• docker network prune 主要清理网络
• docker system prune 还会清理停止容器、无用镜像、缓存等

先建议你用这个:

docker network prune -f

然后再重新执行:

docker compose up -d

⸻

方案二:删除指定旧项目网络

先看有哪些网络:

docker network ls

如果看到很多类似:

xxx_default
yyy_default
zzz_default

可以删除不用的:

docker network rm 网络名

例如:

docker network rm old_project_default

前提是这个网络没有被运行中的容器占用。

⸻

方案三:给当前 compose 显式指定网络段

如果你不想依赖 Docker 自动分配,可以在 docker-compose.yml 里手动指定一个网段。

例如:

services:
  huoshan-tts-service:
    build: .
    networks:
      - tts_net

networks:
  tts_net:
    driver: bridge
    ipam:
      config:
        - subnet: 172.30.100.0/24

这样 Docker 就不去自动挑默认子网了。

但要注意:
• 这个网段不能和现有 Docker 网络冲突
• 也不能和服务器局域网、VPC 网段冲突

⸻

方案四:扩大 Docker 默认地址池

如果这台服务器会长期跑很多 compose 项目,建议改 Docker 守护进程配置。

编辑:

/etc/docker/daemon.json

例如配置成:

{
  "default-address-pools": [
    {
      "base": "172.80.0.0/16",
      "size": 24
    },
    {
      "base": "192.168.0.0/16",
      "size": 24
    }
  ]
}

然后重启 Docker:

systemctl restart docker

这个方案适合长期治理,但要注意:
• 重启 Docker 会影响当前运行中的容器
• 地址池不能和现有网络环境冲突

⸻

你现在最建议的处理顺序

先执行这几步:

docker network ls
docker network prune -f
docker compose up -d

如果还不行,再看是否有大量旧网络:

docker network ls

如果网络确实非常多,再考虑:
• 删除无用项目网络
• 或者在 compose 里手动指定 subnet
• 或者修改 /etc/docker/daemon.json 扩大地址池

⸻

一句话总结

这不是代码错误,也不是镜像构建错误,而是:

Docker 可用的默认网络子网分配完了,导致 compose 无法创建项目默认网络。

最直接的修复通常是:

docker network prune -f

然后重试。

更多推荐