当前位置: 首页 > 面试题库 >

docker在git checkout同一文件时添加缓存

秦俊
2023-03-14
问题内容

我需要重用docker缓存在CI服务器构建映像中使用checkout项目。

签出相同文件时,Docker ADD不使用缓存。

我在git分支 A中docker build -t somename .通常使用docker缓存执行它,但是如果我通过转到分支
Bgit checkout B,不执行任何操作,通过转到分支 Agit checkout A并再次运行,docker build -t somename .则仅在第一个ADD之前使用docker缓存。

这里的例子:

Docker文件

# DOCKER-VERSION 0.10.0
FROM myregistry:5000/ruby:2.1.2-1
MAINTAINER ME

# Gem sources
RUN gem source -r https://rubygems.org/
RUN gem source -a http://gems.mydomain

# Never install a ruby gem docs
RUN echo "gem: --no-rdoc --no-ri" >> ~/.gemrc

# gems install
RUN mkdir /foo
WORKDIR /foo

RUN gem install bundler
ADD Gemfile /foo/Gemfile
RUN bundle install

# expose ports
EXPOSE 8080

从构建日志

Sending build context to Docker daemon 19.54 MB
Sending build context to Docker daemon 
Step 0 : FROM myregistry:5000/ruby:2.1.2-1
 ---> 9ce683a713b4
Step 1 : MAINTAINER ME
 ---> Using cache
 ---> 8f54114fd2e7
Step 2 : RUN gem source -r https://rubygems.org/
 ---> Using cache
 ---> f58a08708863
Step 3 : RUN gem source -a http://gems.mydomain
 ---> Using cache
 ---> 3e69e17c5954
Step 4 : RUN echo "gem: --no-rdoc --no-ri" >> ~/.gemrc
 ---> Using cache
 ---> 1edb37962dd4
Step 5 : RUN mkdir /foo
 ---> Running in 3d3441c34ee3
 ---> aeb90f00bc9b
Removing intermediate container 3d3441c34ee3
Step 6 : WORKDIR /foo
 ---> Running in 84b881d8f621
 ---> 10e1d8984458
Removing intermediate container 84b881d8f621
Step 7 : RUN gem install bundler
 ---> Running in 31e98523ce46
Successfully installed bundler-1.6.2
1 gem installed
 ---> 84d5195ab831
Removing intermediate container 31e98523ce46
Step 8 : ADD Gemfile /foo/Gemfile
 ---> 3e5f2675ee22
Removing intermediate container c90e8be5ea17
Step 9 : RUN bundle install
 ---> Running in ac0e83e5eebb    
Fetching gem metadata from http://gems.mydomain/......
Fetching additional metadata from http://gems.mydomain/..
Resolving dependencies...
Installing rake 10.3.2
Installing i18n 0.6.9
Installing multi_json 1.10.1
.
.
.
Installing railties 3.2.19
Installing responders 0.9.3
Using bundler 1.6.2
Your bundle is complete!
Use `bundle show [gemname]` to see where a bundled gem is installed.    
 ---> 19beae703adb
Removing intermediate container ac0e83e5eebb
Step 10 : EXPOSE 8080
 ---> Running in 1b1e55d349e5
 ---> 32405bdac6d1
Removing intermediate container 1b1e55d349e5
Successfully built 32405bdac6d1

git checkout B

git checkout A

docker build -t somename。

第二个构建日志

Sending build context to Docker daemon 19.52 MB
Sending build context to Docker daemon 
Step 0 : FROM myregistry:5000/ruby:2.1.2-1
 ---> 9ce683a713b4
Step 1 : MAINTAINER ME
 ---> Using cache
 ---> 8f54114fd2e7
Step 2 : RUN gem source -r https://rubygems.org/
 ---> Using cache
 ---> f58a08708863
Step 3 : RUN gem source -a http://gems.mydomain
 ---> Using cache
 ---> 3e69e17c5954
Step 4 : RUN echo "gem: --no-rdoc --no-ri" >> ~/.gemrc
 ---> Using cache
 ---> 1edb37962dd4
Step 5 : RUN mkdir /foo
 ---> Using cache
 ---> aeb90f00bc9b
Step 6 : WORKDIR /foo
 ---> Using cache
 ---> 10e1d8984458
Step 7 : RUN gem install bundler
 ---> Using cache
 ---> 84d5195ab831
Step 8 : ADD Gemfile /foo/Gemfile
 ---> 4977e35c80f7
Removing intermediate container bd59cc0d5e51
Step 9 : RUN bundle install
 ---> Running in 6ff16f32e94a
Fetching gem metadata from http://gems.mydomain/......
Fetching additional metadata from http://gems.mydomain/..
Resolving dependencies...
Installing rake 10.3.2
Installing i18n 0.6.9
Installing multi_json 1.10.1
.
.
.    
Installing railties 3.2.19
Installing responders 0.9.3
Using bundler 1.6.2
Your bundle is complete!
Use `bundle show [gemname]` to see where a bundled gem is installed.
 ---> d9332f9035c3
Removing intermediate container 6ff16f32e94a
Step 10 : EXPOSE 8080
 ---> Running in b20252a00160
 ---> 4d9932882e06
Removing intermediate container b20252a00160
Successfully built 4d9932882e06

问题答案:

当文件的mtime值更改并且git不跟踪文件的mtime值时,Docker使docker
build缓存无效。这种缓存失效也会在其他情况下出现,例如在持续集成或涉及docker,git和branchs的构建环境中。

在要求docker构建容器之前,我一直在运行的Makefile中使用“触摸”目标:

touch:
    @echo "Reset timestamps on git working directory files..."
    find ./ | grep -v .git | xargs touch -t 200001010000.00

接下来,始终在同一Makefile中运行make touchdocker build或始终在同一基于docker的“ build”目标中运行…

另一个选项是设置一个git钩子,该钩子会自动修改mtime值:https
:
//git.wiki.kernel.org/index.php/ExampleScripts#Setting_the_timestamps_of_the_files_to_the_commit_timestamp_of_the_commit_which_last_touched_them

另一个可能的解决方案是派生docker并将mtime从其缓存定义中删除:https
:
//github.com/docker/docker/blob/master/pkg/tarsum/tarsum.go

注意 :从docker
1.8开始,mtime使缓存无效时不再考虑在内。拉取请求#12031更新了此行为



 类似资料:
  • 问题内容: 在我有: 该文件以向我返回正确文件的方式存在,但是当我执行时,我得到了: 有人知道为什么以及如何正确进行吗? 问题答案: 您可以从父目录构建Dockerfile:

  • 在我的Dockerfile中,我得到了: 该文件以ls../的形式存在/myapp。war返回正确的文件,但当我执行sudo docker build-t myapp时 我有: 有人知道为什么以及如何正确操作吗?

  • 问题内容: 在python中保存文件时如何添加BOM(unicode签名): 我需要将文件转换为。现在,脚本运行良好,但没有BOM。 问题答案: 将其直接写入文件开头:

  • 我试图为angular cli项目编写一个docker文件,但我有一个外部依赖项,它是BitBucket上的私有回购,因此我需要传递我的ssh密钥。我正在尝试使用传递ssh密钥 现在的问题是,它不是将这些密钥添加到ssh-agent中,而是请求密码。 我正在使用此命令运行 下面是我运行上面提到的命令时的输出。

  • 我正在尝试构建一个避免不必要的批量的docker映像,并且遇到了一个我认为应该很常见的问题,但是到目前为止我还没有找到一个直截了当的解决方案。(我正在Ubuntu18.04系统上构建docker,从ubuntu层的

  • 我安装了eclipse插件e(fx)clipse来使用JavaFX,并创建了一个新的JavaFX项目。在Package Explorer中,项目结构如下所示: 此外,我还尝试在项目中添加JavaFX主类: 但这会在IDE中导致以下错误: 当我试图从JavaFx部分添加新的FXML文档时,也会出现同样的错误。看来是eclipse IDE bug...但如何绕过它呢?