shell
CI
CircleCI
docker
ゆめみDay 25

Dockerの全Image,全Layerを保存するワンライナー

コマンド

  • docker save -o ~/caches/app.tar $(docker image ls -q | xargs -I XXX docker history -q XXX |grep -v \<missing\> | tr '\n' ' ')

解説

  • docker save -o ~/caches/app.tar
    • docker save dockerのimageをtarに保存
    • -o オプションはoutputオプションで指定した場所に保存する、今回は ~/caches/app.tarに保存
  • $(docker image ls -q | xargs -I XXX docker history -q XXX | grep -v \<missing\> | tr '\n' ' ')
    • docker image ls はimageのリストを表示する
    • -q オプションはIDのみを表示する
    • xargs -I XXX docker history -q XXX
      • docker image ls -qで取得したImageのIDをパイプでxargs -I XXXに渡し、XXXdocker history -q XXXの引数に渡している
      • docker historyはdocker image履歴を取得するコマンド
      • -q オプションはIDのみを表示する
    • grep -v \<missing\>
      • は履歴の中から <missing> を除去
    • tr '\n' ' '
      • docker historyの出力が改行区切りで返ってくるので、スペース区切りに変換 -$(docker image ls -q | xargs -I XXX docker history -q XXX | grep -v \<missing\> | tr '\n' ' ') dockerの全layerのidをdocker saveの引数にしている。

経緯

  • Circle CIでテストする時にdockerのimageをsave_cache機能でcircleCI保存して、次回build時はdockerのcacheを再利用するために保存したかった。
  • docker-composeを利用して複数コンテナを利用しているので、CI環境にある全部のimageのlayerを保存する必要があった。

おわりに

  • CI環境のcache保存するために利用しているけど、他の人に自分が持っているdockerの環境を全部渡すためにも利用できるかもしれない。

参考