从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
相关产品推荐
相关产品推荐

