この2日ほど、Dockerで色々試行錯誤してたときに便利だったコマンドたちです。
<none>でできたイメージを一括削除
何も考えずに作っているとVMの容量が100%になっちゃうときがあります(ありました)。
docker image prune
でキレイにできます。こちらはimages
ではなくimage
のようです。
$ docker image prune
WARNING! This will remove all dangling images.
Are you sure you want to continue? [y/N] y
Deleted Images:
deleted: sha256:18abcdefghijklmnopqrstuvwxyz19abcdefghijklmnopqrstuvwxyz20abcdef
deleted: sha256:21abcdefghijklmnopqrstuvwxyz22abcdefghijklmnopqrstuvwxyz23abcdef
.
.
.
Total reclaimed space: 5.344GB
最後に空いた容量をドヤ顔で教えてくれます。
--rmオプションで終了時にコンテナ削除
基本ですが一応……
--rm
オプションをつけると、コンテナを終了させたときにコンテナ自体も削除してくれます。
検証してるときは何度も同じコンテナ名で起動/終了をさせると思うので必須です。
ちなみに-d
オプション(バックグラウンド起動)のときにも有効です。昔はできなかった気がするなぁと思って調べたらどっかのバージョンからできるようになったんですね。
$ docker run --rm -it jupyter/notebook:latest bash
ENTRYPOINTを無効にして起動
DockerfileにENTRYPOINTを指定して、docker run
時に何かしらを一緒に起動することができますが、環境構築時はシェルを起動していろいろと検証を行いたいときがあるとおもいます。いちいちDockerfileをいじらなくても、起動時に無効にすることが可能です。
$ docker run --entrypoint '' --rm -it jupyter/notebook:latest bash
--entrypoint ''
と明示的に空にすることで無効にできるようです。
起動しているコンテナからイメージ作成
あるコンテナで作業したのをイメージとして残しときたい、とか思ったときに便利なのがcommitです。
$ docker commit 33aabcdefg33 test-docker-commit-image
sha256:24abcdefghijklmnopqrstuvwxyz25abcdefghijklmnopqrstuvwxyz26abcdef
$ docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
test-docker-commit-image latest f2abcdefg1f 7 seconds ago 4.81GB
docker commit <コンテナID> <作成するイメージ名>
で指定します。
当然ですが、Dockerfileから作っているわけではないので再現性がありません。
イメージからDockerfile作成
そんな感じでコンテナから残したイメージをDockerfile化したい、といったとき。
そのものずばりなコマンドはないのですが、historyである程度どういう作業をしたかが把握できます。ここからDockerfileに反映していくといいかなと思います。
$ docker history test-docker-commit-image:latest
IMAGE CREATED CREATED BY SIZE COMMENT
af14d0dd9f68 About a minute ago 19.9MB
b4abcdefgh51 6 hours ago /bin/sh -c #(nop) ENTRYPOINT ["/bin/sh" "... 0B
70abcdefgh99 6 hours ago /bin/sh -c #(nop) EXPOSE 8888/tcp 0B
26abcdefghe5 6 hours ago /bin/sh -c #(nop) WORKDIR /notebook 0B
a6abcdefghaa 6 hours ago /bin/sh -c #(nop) VOLUME [/notebook] 0B
--no-trunc
オプションをつけるとCREATED BY
の部分が省略されずに表示されます。
ただ……試した環境が悪かったのか、手動でapt-get update
やapt-get install
したのが表示されずあれ?となってます。ちょっと検証が必要ですがこういうコマンドもあるんだということで。
昔、太古のバイナリファイルしかない環境で、gdbとかnmとかobjdumpを駆使して泣きそうになりながらソースに反映したのを思い出しました……。
参考文献
https://qiita.com/DQNEO/items/e3a03a14beb616630032
https://qiita.com/nju33/items/733e16511f3b8e739d54