2015-01-13 29 views
8

我正在運行docker CircleCI,而且我在緩存COPY命令時遇到問題。Circle CI Docker服務不會緩存COPY

Circle CI文檔提及known caching issues並建議使用this perl script來設置複製的文件上的時間戳以保留緩存。

Docker best practice docs狀態:

在ADD和COPY指令的情況下, 文件(一個或多個)的內容被放入圖像進行檢查。具體來說,對文件執行 校驗和,然後在緩存查找過程中使用 期間的校驗和。

根據CircleCi的建議,我將緩存保存到磁盤,然後在下次測試運行時再次加載。這看起來像COPY緩存正確之前的命令一樣。

調試時,我輸出文件的md5校驗和,我試圖在本地複製,然後從docker容器中將其正確匹配。所以,理論上緩存應該加載。我不確定Docker使用md5作爲校驗和。

這是我目前circle.yml:

機: 服務: - 泊塢窗

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 

這是做什麼用的校驗步驟生成輸出:

$md5sum .bowerrc 
8d1a712721d735bd41bf738cae3226a2 .bowerrc 

$docker run circles md5sum .bowerrc 
8d1a712721d735bd41bf738cae3226a2 .bowerrc 

docker build報告此問題:

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

有誰知道爲什麼COPY沒有緩存?

+0

嗨Rimian,我遇到了同樣的問題並尋找解決方案。當我構建我的Docker容器時,我想使用COPY命令從容器內的GIT repro複製文件。有時候它有效,有時不會。當你找到解決方案時讓我知道。 – skroll

+0

COPY之前的步驟由docker緩存,因爲它實際上只在RUN後對該字符串執行散列

回答

0

我遇到了同樣的問題,使用drone.io(另一個CI工具)。

發生這種情況的原因是'git clone'會(超過)寫入所有本地文件,然後它將獲得該克隆時間的時間戳。由於Docker採用在COPY或ADD命令中添加的所有文件的哈希,所以此哈希現在與以前的哈希不同。然後,Docker使該緩存失效並重新執行該步驟以及之後的步驟。

3

Docker使用TARSUM來決定是否使用緩存,並且這包括文件元數據。最重要的修改時間...運行git克隆將強制它從頭開始重建。

要解決這個問題,我用一個Makefile用下面的目標...

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 

(在我的情況,我希望緩存像requirements.txt文件的一切都在CONF除Gruntfile的東西在第二行沒有我想要被緩存的實際源代碼)