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

从GitHub构建Docker镜像时Git子模块未克隆的问题排查

Docker Build with Git Submodules Fails: Submodules Not Pulled

我之前也碰到过一模一样的问题,在Docker 17.12.0-ce这个版本里,这确实是个官方的bug,不是你的操作有问题。

问题根源

Docker官方文档里提到的递归复制Git子模块,在docker build github.com/org/repo#ref:subdir这种带子目录指定的语法下,旧版本并没有正确触发git clone --recursive的逻辑。当你指定了子目录(这里的:admin)时,Docker只会克隆主仓库的指定分支/标签,然后直接切换到该子目录,完全忽略了子模块的拉取操作,所以才会出现admin目录为空、找不到Dockerfile的错误。

解决方案

1. 本地递归克隆后再构建(最稳妥的临时方案)

先手动把仓库连同子模块一起拉到本地,再执行构建命令:

# 递归克隆整个仓库
git clone --recursive https://github.com/org/repo.git
cd repo
# 切换到指定版本标签
git checkout 1.0
# 构建admin服务的镜像
docker build ./admin

2. 升级Docker版本(彻底解决问题)

这个子模块拉取的bug在Docker 18.09及以后的版本已经被修复了。升级到新版本后,你原来的命令docker build github.com/org/repo#1.0:admin就能正常工作,Docker会自动递归拉取所有子模块。

3. 在Dockerfile中手动拉取子模块(应急方案)

如果暂时没法升级Docker,也可以在主仓库的Dockerfile(或者admin子模块的Dockerfile)里添加拉取子模块的步骤,前提是构建环境里安装了Git:

# 先安装Git(以Debian/Ubuntu基础镜像为例)
RUN apt-get update && apt-get install -y git

# 初始化并拉取子模块
RUN git submodule init
RUN git submodule update --recursive

不过这个方法会增加镜像的体积,只适合临时应急使用。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.15 03:48:47