我有一个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镜像构建上反映存储库上正在进行的更新。是否有可能实现这一目标?
答案 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行之后使缓存无效。
将
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将显示在您的存储库名称下
# 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~