如何防止Dockerfilecachinggit clone

我有一个Dockerfile试图打包和部署一个Web应用程序到一个容器。 在Docker镜像构build过程中,应用程序从git仓库获取代码。 这里是Dockerfile快照:

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

我希望docker不要cachingRUN git clone --depth=1 git-repository-url $GIT_HOME/的步骤RUN git clone --depth=1 git-repository-url $GIT_HOME/这样在版本库上的正在进行的更新可以反映在Docker映像构build中。 是否有可能实现这一目标?

另一个解决方法:

如果您使用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的caching失效。

如果你正在处理私人回购协议,你可以使用github的x-oauth-basicauthenticationscheme和个人访问令牌 :

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

(thx @ captnolimarbuild议编辑澄清authentication)

问题1996年尚不可用,但您有以下解决方法 :

 FROM foo ARG CACHE_DATE=2016-01-01 RUN git clone ... docker build --build-arg CACHE_DATE=$(date) .... 

这将使每个构build的ARG CACHE_DATE行之后的caching失效。

如果你使用github,你可以使用github API来caching特定的运行命令。 你需要安装jq来parsingJSON: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将被执行。

对于github私人回购,你也可以通过你的用户名和密码:

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