2015-01-13 10 views
8

Sono in corso la finestra mobile CircleCI e ho problemi con la memorizzazione nella cache dei comandi di COPIA.Il servizio Cerchione CI circolare non memorizza nella cache la COPIA

I documenti CI Circle menzionano known caching issues e consigliamo di utilizzare this perl script per impostare i timestamp sul file copiato per conservare la cache.

Il Docker best practice docs Stato:

Nel caso delle istruzioni ADD e copia, il contenuto del file (s) essere messo nell'immagine sono esaminati. In particolare, viene eseguito un checksum del/dei file e quindi tale checksum viene utilizzato durante la ricerca della cache da .

Come per le raccomandazioni CircleCi, Mi risparmio la cache su disco poi caricarlo di nuovo sul prossimo test. Sembra che funzioni come comandi prima della cache di COPY correttamente.

Per eseguire il debug, sto trasmettendo il checksum MD5 del file che sto tentando di copiare localmente, quindi dal contenitore finestra mobile e corrisponde correttamente. Quindi, in teoria, dovrebbe caricare la cache. Non sono sicuro che Docker usi md5 come checksum.

questo è il mio circle.yml corrente:

macchina: servizi: - finestra mobile

dependencies: 
    cache_directories: 
    - "~/docker" 
    pre: 
    - mkdir -p ~/docker 
    override: 
    - docker info 
    - if [[ -e ~/docker/image.tar ]]; then docker load -i ~/docker/image.tar; fi 
    - docker images 
    - docker build -t circles . 

checkout: 
    post: 
    - ls -l 
    - ./timestamp-set-to-git.pl 
    - ls -l 

test: 
    override: 
    - md5sum .bowerrc 
    - docker run circles md5sum .bowerrc 
    - docker save circles > ~/docker/image.tar 

Questo è ciò che le uscite di generazione per le operazioni di checksum:

$md5sum .bowerrc 
8d1a712721d735bd41bf738cae3226a2 .bowerrc 

$docker run circles md5sum .bowerrc 
8d1a712721d735bd41bf738cae3226a2 .bowerrc 

Ma il docker build riporta questo:

Step 6 : RUN sudo npm install -g phantomjs gulp 
---> Using cache 
---> a7bbf2b17977 
Step 7 : COPY .bowerrc /var/work/.bowerrc 
---> 7ad82336de64 

Qualcuno sa perché COPY non sta memorizzando nella cache?

+0

Ciao Rimian, ho riscontrato lo stesso problema e ho cercato la soluzione. Quando costruisco il mio contenitore Docker voglio copiare i file dalla mia replica GIT all'interno del contenitore con il comando COPY. A volte funziona, a volte no. Fammi sapere quando hai trovato la soluzione. – skroll

+0

I passaggi prima di COPIA vengono memorizzati nella cache dalla finestra mobile, poiché in questo modo esegue effettivamente solo un hash sulla stringa dopo ESEGUI

risposta

0

Ho riscontrato lo stesso problema utilizzando drone.io (un altro strumento CI).

Il motivo per cui questo accade è che 'git clone' scriverà (sovrascrive) tutti i file locali, che quindi avranno anche il timestamp del tempo di quel clone. Dato che Docker prende l'hash di tutti i file aggiunti in un comando COPY o ADD, questo hash è ora diverso da quello precedente. Docker quindi invalida quella cache e ripristina quel passaggio e quelli successivi.

3

Docker utilizza un TARSUM per decidere se utilizzare la cache e questo include i metadati del file. Il tempo modificato più importante ... l'esecuzione di un clone git lo costringerà a ricostruire da zero.

Per risolvere questo, io uso un Makefile con il seguente obiettivo ...

build: hack-touch 
    docker build -t MYTAG . 
hack-touch: 
    @echo "Reset timestamps on git working directory files..." 
    find conf | xargs touch -t 200001010000.00 
    touch -t 200001010000.00 Gruntfile.js bower.json package.json .bowerrc 

(Nel mio caso, tutto quello che voglio da memorizzare nella cache come file requirements.txt sono in conf fatta eccezione per la Gruntfile roba sulla seconda riga. Nessuno del mio codice sorgente effettivo voglio essere memorizzato nella cache)

Problemi correlati