Docker源码编译不支持./configure --prefix=路径的传统安装方式,因其基于Go语言、使用make构建;真正指定路径需分三步:1. 二进制输出位置通过make binary后手动复制或修改BINARYDIR;2. 运行时数据目录由/etc/docker/daemon.json中"data-root"字段设定;3. daemon启动路径需同步更新systemd服务文件中的ExecStart。

Docker 本身不提供源码编译安装时通过 ./configure --prefix= 方式指定安装路径的标准流程,因为它不是用 autotools(autoconf/automake)构建的 C 项目,而是基于 Go 语言开发、使用 make + Go modules 构建的现代工具。其二进制文件默认是静态链接的单体可执行文件(如 dockerd、docker CLI),官方也不鼓励或支持“传统 prefix 安装”——它不生成 .so、.h 或 /usr/share 类资源,也不写 registry 到系统路径。
但如果你确实需要从源码构建并控制最终二进制输出位置、运行时数据目录、或 daemon 启动参数中的根路径,关键要分清三个概念:
1. 编译输出目录(即 build 后的二进制放哪)
源码编译产生的 `dockerd` 和 `docker` 命令默认输出到项目根目录下的 ./bundles/ 子目录(如 ./bundles/23.0/binary-daemon/dockerd)。你无法用 `--prefix` 改变这个路径,但可以:
- 用
make binary构建后,手动cp到任意目标目录(例如/opt/docker/bin/) - 修改
Makefile中BINARYDIR变量(不推荐,易被 upstream 覆盖) - 构建时设置环境变量控制临时输出(仅限调试):
export BUILDDIR=/tmp/docker-build && make binary
2. 运行时数据目录(即镜像、容器、卷实际存放位置)
这才是你真正该“指定安装目录”的地方——它和编译无关,而是在 运行时由 daemon 配置决定。无论二进制放在哪,只要启动时指向正确配置,数据就存到你指定的位置。
- 编辑或创建
/etc/docker/daemon.json,添加:{"data-root": "/opt/docker/data"} - 确保目录存在且权限正确:
sudo mkdir -p /opt/docker/data && sudo chown root:root /opt/docker/data - 重启服务:
sudo systemctl restart docker - 验证:
docker info | grep "Docker Root Dir"→ 应显示/opt/docker/data
3. Daemon 启动时的配置与服务单元文件(影响实际生效路径)
如果你把 dockerd 放在非标准路径(如 /opt/docker/bin/dockerd),需同步更新 systemd 服务文件,否则 systemctl start docker 仍会调用旧路径。
- 复制并重写服务文件:
sudo cp /lib/systemd/system/docker.service /etc/systemd/system/docker.service - 编辑
/etc/systemd/system/docker.service,修改ExecStart=行:ExecStart=/opt/docker/bin/dockerd -H fd:// --containerd=/run/containerd/containerd.sock - 重载并重启:
sudo systemctl daemon-reload && sudo systemctl restart docker
4. 补充:源码构建前可选的 GOPATH / GOBIN 控制(仅影响本地构建过程)
Go 工具链本身支持 GOBIN 环境变量,但 Docker 的 Makefile 默认忽略它,强制输出到 bundles 目录。若你坚持用 Go 原生命令构建单个组件(不推荐用于生产),可:
- 进入
cmd/docker或cmd/dockerd目录 - 设置:
export GOBIN=/opt/docker/bingo install . - 注意:这不会生成完整功能的
dockerd(缺少 vendor 和 build tag),仅适合调试 CLI
不复杂但容易忽略:Docker 源码构建本质是“产出二进制”,真正的“安装目录”由运行配置和 systemd 单元共同定义,而非编译期 prefix。


















