在 Travis 實現 Docker Cache

docker 前一篇寫了『用 Travis 自動上傳 Docker Image』,Travis 跑完測試成功後才自動編譯 Docker Image 並且上傳到 Docker Hub。在每次 commit 後,Travis 執行 docker build 時間總是非常長,當然原因很多。如果選用的 Docker base image 非常肥,指令非常多,每次編譯都要重新下載及執行指令,所以執行時間就是這麼長。本篇就是想辦法減少 Travis 編譯 Image 時間,就像把 node_modules 壓縮起來,下次執行測試前先解壓縮再安裝,可以大幅減少 npm install 時間(可以參考之前的『用一行指令加速 npm install』)。這邊我們就需要用到 Travis 的 Cache 功能

啟動 Travis Cache 快取服務

啟動方式如下:
cache:
  directories:
    - ${HOME}/docker
假設有其他目錄需要 cache,像是 npmnode_module 或是 Laravelvendor,都可以透過此方式設定。

讀取 Docker Cache 快取

before_install 內透過 docker load 指令讀取 cache 資料
before_install:
  - if [ -f ${DOCKER_CACHE_FILE} ]; then gunzip -c ${DOCKER_CACHE_FILE} | docker load; fi
其中 DOCKER_CACHE_FILE 可以定義在 env 內
env:
  global:
    - DOCKER_CACHE_FILE=${HOME}/docker/cache.tar.gz

儲存 Docker Image cache 快取

經過測試及編譯 Image 後,就可以進行 儲存 Docker 快取
script:
  # 進行測試
  - make test
  # 編譯 Image
  - make docker
  # 儲存快取
  - if [ "$TRAVIS_BRANCH" == "master" ] && [ "$TRAVIS_PULL_REQUEST" == "false" ]; then
    mkdir -p $(dirname ${DOCKER_CACHE_FILE});
    docker save $(docker history -q appleboy/drone-line:latest | grep -v '<missing>') | gzip > ${DOCKER_CACHE_FILE};
    fi
透過 docker save 指令將 Image 存起來,這樣下次再執行編譯 Image 時,就會先找看看是否有快取。上面設定只有 master branch 才會儲存快取,但是在任何一個 branch 都可以享受到快取的服務喔。