如何在 Dockerfile for Docker Cloud 中正确初始化 git 子模块
Posted
技术标签:
【中文标题】如何在 Dockerfile for Docker Cloud 中正确初始化 git 子模块【英文标题】:How to correctly initialize git submodules in Dockerfile for Docker Cloud 【发布时间】:2020-02-29 14:15:28 【问题描述】:我们正在 Docker Cloud 上构建一个 Docker 容器。构建过程需要 git 子模块。
为了初始化本地构建的子模块,我们在 Dockerfile 中添加了以下行:
RUN git submodule update --init --recursive
见: https://github.com/open62541/open62541/blob/master/Dockerfile#L9
对应的提交: https://github.com/open62541/open62541/commit/ee9c18a6a05722edfe7c0d8d8e140d802fa2e5f2 和拉取请求:https://github.com/open62541/open62541/pull/3191
注意: 与类似问题相比,所有子模块都是 github 上的公共 repos,无需身份验证。
没有子模块初始化行的情况:
在 Docker 云上构建:成功https://cloud.docker.com/u/open62541/repository/registry-1.docker.io/open62541/open62541/builds/dcd3283c-76af-4f6b-bb00-cecbaaffc82f 本地构建:失败git clone https://github.com/open62541/open62541.git
cd open62541
# Parent commit without git submodule update
git checkout e97abd591a159ce894488d93796b858d9f0d00b9
# This will fail because the submodules are obviously not initialized
docker build .
错误:
CMake Error at CMakeLists.txt:830 (message):
File /opt/open62541/deps/ua-nodeset/Schema/Opc.Ua.NodeSet2.xml not found.
You probably need to initialize the git submodule for deps/ua-nodeset.
Dockerfile中子模块初始化的情况:
在 Docker 云上构建:失败https://cloud.docker.com/u/open62541/repository/registry-1.docker.io/open62541/open62541/builds/28663705-c324-4c7f-a084-f94eb80057bcStep 7/18 : RUN git submodule update --init --recursive
---> Running in b358c21c4d53
fatal: not a git repository: /src/b6tohshrfzzntavvhek3zna/.git/modules/deps/mdnsd
Unable to find current revision in submodule path 'deps/mdnsd'
本地构建:成功
git clone https://github.com/open62541/open62541.git
cd open62541
# Commit which added git submodule init in Dockerfile
git checkout ee9c18a6a05722edfe7c0d8d8e140d802fa2e5f2
# This will succeed
docker build .
如何正确初始化 dockerfiles 中的子模块,使其在 Docker 云上运行,同时只需拉取主 repo 并构建 docker 容器?
相关问题:
Docker cloud submodule authentication 私有 git 子模块。没有答案。 Google container builder DockerFile with git submodules 私有 git 子模块。与 Google Container Builder 相关 Docker Hub and git submodules Docker Hub,但与私有子模块有关 docker autobuild with git private submodule Docker Hub,但与私有子模块有关【问题讨论】:
【参考方案1】:查看我在这里给出的答案:https://***.com/a/59640438/1021344
为简单起见,在此转载: 你需要使用钩子:https://docs.docker.com/docker-hub/builds/advanced/#custom-build-phase-hooks
TL;DR: 把它放在hooks/post_checkout
:
#!/bin/bash
# Docker hub does a recursive clone, then checks the branch out,
# so when a PR adds a submodule (or updates it), it fails.
git submodule update --init
【讨论】:
以上是关于如何在 Dockerfile for Docker Cloud 中正确初始化 git 子模块的主要内容,如果未能解决你的问题,请参考以下文章
如何使用 Dockerfile 在启动 docker 容器上运行 jboss-cli
Docker学习笔记-- 如何使用Dockerfile构建镜像