Docker Compose v1(docker-compose)已弃用,Harbor v2.10+仅支持v2+(docker compose无连字符);错误安装pip版v1或未正确重命名二进制将导致command not found。

docker-compose 版本必须用 docker compose(无连字符)
Harbor v2.10+ 完全弃用 docker-compose(v1.x),只认 docker compose(v2+)。运行 docker compose version 输出 command not found 是部署失败最常见原因。CentOS/RHEL 用户常误装 Python 版 pip install docker-compose,结果版本是 1.29.x,但命令仍是 docker-compose —— 这个组合必报错。
正确做法是:
- 从 GitHub Releases 下载二进制:
curl -L "https://github.com/docker/compose/releases/download/v2.24.5/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose - 重命名并赋权:
mv /usr/local/bin/docker-compose /usr/local/bin/docker compose(注意空格)、chmod +x /usr/local/bin/docker compose - 验证:
docker compose version必须输出类似Docker Compose version v2.24.5
harbor.yml 里 https 块不能“半启用”
很多用户把 https.enabled: true 设为 true,却没配 certificate 和 private_key 路径,或者路径下文件权限不对(如属主不是 root 或未 chown 10000:10000),结果 ./install.sh 启动后 harbor-portal 容器反复退出,日志里反复出现 open /data/cert/server.crt: no such file or directory。
测试环境最稳妥的写法是直接注释掉整个 https 块,并确认顶部有:
https: enabled: false http: port: 8080
同时把 hostname 改成真实可解析的 IP 或域名(别用 localhost),否则 docker login 会卡在 unauthorized: authentication required。
容器启动就退出?先查 harbor-db 状态
docker ps -a 显示 harbor-core 或 harbor-jobservice 状态为 Exited (1),90% 是 harbor-db 没起来。别急着重装,按顺序查:
- 看数据库容器是否运行:
docker inspect harbor-db | grep -A 5 "Status",若"ExitCode": 1,说明 PostgreSQL 启动失败 - 查具体错误:
docker logs harbor-db,高频原因是磁盘空间不足或/data/database目录权限不对(Harbor 所有容器以 UID 10000 运行,目录必须chown 10000:10000 /data/database) - 检查
harbor.yml中database.password是否含特殊字符(如@、/),PostgreSQL URL 会解析失败;建议改用字母数字组合
客户端 push 镜像失败:ca.crt 必须手动信任
即使你生成了自签名证书并配置了 HTTPS,docker push registry.example.com/myapp:latest 仍会报 x509: certificate signed by unknown authority —— 因为 Docker daemon 默认不信任你的 CA。
解决方法分两步:
- 把生成的
ca.crt(不是server.crt)拷到客户端机器:sudo mkdir -p /etc/docker/certs.d/registry.example.com:443,然后sudo cp ca.crt /etc/docker/certs.d/registry.example.com:443/ca.crt - 重启 Docker daemon:
sudo systemctl restart docker(Ubuntu/Debian)或sudo systemctl restart docker(RHEL/CentOS) - 验证:
curl -k https://registry.example.com/api/v2.0/ping应返回{"code":200,"message":"OK"};再试docker login
这个步骤容易被跳过,尤其在多台开发机或 CI 机器上,漏一台就会 push 失败。


















