2014-10-23 18 views
9

Ho bisogno di un progetto di checkout nella cache del docker riutilizzare la mia immagine del server CI.aggiunge la cache quando git controlla lo stesso file

Docker ADD non utilizza la cache durante il checkout dello stesso file.

io sono nel ramo git Un eseguire docker build -t somename . esso uso della cache finestra mobile normalmente, ma se vado al ramo B via git checkout B, non fare nulla, andare al ramo A via git checkout A ed eseguire nuovamente docker build -t somename . cache finestra mobile sta usando solo prima del primo ADD.

qui Esempio:

Dockerfile

# 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 

registro dalla costruzione

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

finestra mobile build -t somename.

secondo log di compilazione

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 

risposta

11

Docker invalida la cache di build della finestra mobile quando il valore di mtime di un file è cambiato e git non tiene traccia dei valori di mtime dei file. Questa invalidazione della cache si manifesta anche in altre situazioni, come in un'integrazione continua o in ambienti di compilazione che includono docker, git e rami.

Sono stato con un obiettivo "tocco" in un Makefile che ho eseguito prima di chiedere finestra mobile per costruire un contenitore:

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

Avanti, gestita sempre make touch prima docker build o "costruire finestra mobile-based "destinazione nello stesso Makefile ...

Un'altra opzione è quella di impostare un gancio git che modifica automaticamente valori 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

Un'altra soluzione possibile è t o forcella docker e rimuovere mtime dalla sua definizione di cache: https://github.com/docker/docker/blob/master/pkg/tarsum/tarsum.go

Nota: come finestra mobile di 1,8, mtime non viene più preso in considerazione quando invalidare la cache. Invia richiesta #12031 aggiornato questo comportamento

+1

Questo funziona perfetto per me!:) Ma non tocca i file .gitignore e .git *. Io uso il comando modificato come 'grep -v .git /'. – nacyot

0

git checkout, git clone, git fetch, uno così via modificare la data di creazione del file. Quindi la finestra mobile visualizza un altro file è uguale.

comando docker ADD non riesce a memorizzare nella cache al momento della creazione della modifica del file.

Problemi correlati