如何防止Dockerfile缓存git clone

时间:2016-05-03 05:11:23

标签: git docker dockerfile

我有一个Dockerfile试图将Web应用程序打包并部署到容器中。在Docker镜像构建期间,应用程序的代码从git存储库中获取。 这是Dockerfile快照:

........
RUN git clone --depth=1 git-repository-url $GIT_HOME/
RUN mvn package -Dmaven.test.skip
........

我希望docker不要缓存RUN git clone --depth=1 git-repository-url $GIT_HOME/的步骤,以便可以在Docker镜像构建上反映存储库上正在进行的更新。是否有可能实现这一目标?

7 个答案:

答案 0 :(得分:33)

另一种解决方法:

如果您使用github(或者最有可能使用gitlab或bitbucket),您可以将github API的repo表示添加到虚拟位置。

   ADD https://api.github.com/repos/$USER/$REPO/git/refs/heads/$BRANCH version.json
   RUN git clone -b$BRANCH https://github.com/$USER/$REPO.git $GIT_HOME/

当头部改变时,api调用将返回不同的结果,使docker的缓存无效。

如果您正在处理私人信息库,则可以github's x-oauth-basic authentication scheme使用personal access token,如下所示:

   ADD https://$ACCESS_TOKEN:x-oauth-basic@api.github.com/repos/$USER/$REPO/git/refs/heads/$BRANCH version.json

(thx @captnolimar建议编辑以澄清身份验证)

答案 1 :(得分:13)

Issue 1996尚不可用,但您拥有following workaround

FROM foo
ARG CACHE_DATE=2016-01-01
RUN git clone ...

docker build --build-arg CACHE_DATE=$(date) ....

这会在每次构建的ARG CACHE_DATE行之后使缓存失效。

或者:

ADD http://www.convert-unix-time.com/api?timestamp=now /tmp/bustcache
RUN git pull

这也会在此ADD行之后使缓存无效。

Similar idea

  

ARG命令添加到Dockerfile:

# Dockerfile
# add this and below command will run without cache
ARG CACHEBUST=1
     

如果需要使用选定的缓存进行重建,请使用--build-arg选项

运行它
$ docker build -t your-image --build-arg CACHEBUST=$(date +%s) .
     

然后只有Dockerfile中ARG命令下面的层才会重建。

答案 2 :(得分:4)

如果使用github,则可以使用github API来缓存特定的RUN命令。 你需要安装jq来解析JSON:apt-get install -y jq

示例:

docker build --build-arg SHA=$(curl -s 'https://api.github.com/repos/Tencent/mars/commits' | jq -r '.[0].sha') -t imageName .

在Dockerfile中(ARG命令应该在RUN之前):

ARG SHA=LATEST
RUN SHA=${SHA} \
    git clone https://github.com/Tencent/mars.git

或者如果您不想安装jq

SHA=$(curl -s 'https://api.github.com/repos/Tencent/mars/commits' | grep sha | head -1)

如果存储库有新的提交,则将执行git clone。

答案 3 :(得分:4)

对于Gitlab储存库有此问题的任何人:

Gitlab在调用其API时具有此烦人的分支ID方法,该ID将显示在您的存储库名称下 enter image description here

# this will copy the last change from your brach and it'll invalidate the cache if there was a new change
ADD "https://gitlab.com/api/v4/projects/${PROJECT_ID}/repository/branches/master?private_token=${GIT_TOKEN}" /tmp/devalidateCache

# the actual clone
RUN git clone --depth=1 https://${GIT_USER}:${GIT_TOKEN}@gitlab.com/${git_file_uri} ${BASE_BUILD_PATH}

答案 4 :(得分:3)

我自己也遇到了同样的问题,我只是决定在构建映像时使用--no-cache选项,而不是尝试选择git repo。

docker build --no-cache -t my_image .

答案 5 :(得分:1)

对于github私人回购,您也可以传递您的用户名和密码:

RUN git clone -b$BRANCH https://$USER:$PASSWORD@github.com/$USER/$REPO.git $GIT_HOME/

答案 6 :(得分:0)

您还可以使用:

ADD "https://www.random.org/cgi-bin/randbyte?nbytes=10&format=h" skipcache

RUN git reset --hard ~Whatever~

如此处所述:https://stackoverflow.com/a/58801213/8953378