【发布时间】:2019-07-01 15:46:35
【问题描述】:
在我的本地机器上,我构建了 latest 映像,并运行另一个 docker build 在任何地方使用缓存。
然后我将图像以latest 的形式上传到注册表,然后在我的 CI 服务器上,我正在拉取我的应用程序的latest 图像,以便将其用作构建缓存来构建新版本:
docker pull $CONTAINER_IMAGE:latest
docker build --cache-from $CONTAINER_IMAGE:latest \
--tag $CONTAINER_IMAGE:$CI_COMMIT_SHORT_SHA \
.
从构建输出中我们可以看到Gemfile 的COPY 没有使用来自latest 图像的缓存,而我还没有更新该文件:
Step 15/22 : RUN gem install bundler -v 1.17.3 && ln -s /usr/local/lib/ruby/gems/2.2.0/gems/bundler-1.16.0 /usr/local/lib/ruby/gems/2.2.0/gems/bundler-1.16.1
---> Using cache
---> 47a9ad7747c6
Step 16/22 : ENV BUNDLE_GEMFILE=$APP_HOME/Gemfile BUNDLE_JOBS=8
---> Using cache
---> 1124ad337b98
Step 17/22 : WORKDIR $APP_HOME
---> Using cache
---> 9cd742111641
Step 18/22 : COPY Gemfile $APP_HOME/
---> f7ff0ee82ba2
Step 19/22 : COPY Gemfile.lock $APP_HOME/
---> c963b4c4617f
Step 20/22 : RUN bundle install
---> Running in 3d2cdf999972
除了节点:它在我的本地机器上运行良好。
查看 Docker 文档 Leverage build cache 似乎并没有解释这里的行为,因为 Dockerfile 和 Gemfile 都没有改变,所以应该使用缓存。
什么会阻止 Docker 使用 Gemfile 的缓存?
更新
我尝试使用COPY --chown=user:group source dest 复制设置正确权限的文件,但它仍然不使用缓存。
已打开 Docker 论坛主题:https://forums.docker.com/t/docker-build-not-using-cache-when-copying-gemfile-while-using-cache-from/69186
【问题讨论】:
-
我也遇到了同样的问题,你有什么更新吗?
-
对不起,不,我不@Marcelo,我不得不切换到另一个任务,这个问题在我这边处于待处理状态。我会回来的,但我不知道什么时候。
-
谢谢,我还在调查中,如果有消息我会告诉你她的
-
在我的例子中,我试图在 Travis 中构建一个图像,该图像将从 Dockerhub 中构建的另一个图像缓存(然后我遇到了和你一样的问题)。我还不是 100% 确定这是否是问题所在,但 Travis 可能没有从 Dockerhub 映像缓存,因为它们使用不同的 docker 版本(为相同的内容产生不同的哈希值)。对我来说,解决方法是在 Travis 中构建和推送所有内容,并且只使用 docker 作为镜像注册表,因为 Dockerhub 可能正在使用旧的 docker 版本来生成镜像。
-
@Marcelo 我得到了确切的问题,我确认 DockerHub 自动构建有一些东西使
COPY总是被缓存破坏。非常烦人,我没有找到任何参考。