今回達成すること
使用していないDockerイメージの一括削除方法を学んでいきます。
また、Dockerのコマンド履歴ファイルをGitの管理外とするための設定も行なっていきます。
それでは参りましょう。
Dockerイメージの仕組み
Dockerはイメージを作り替えると、過去のイメージを保管したまま新たなイメージを作成します。
これではどんどんイメージが蓄積され、 PCのメモリを大きく消費します。
Dockerイメージのタグの見方
Dockerでは$ docker images
で作成したイメージを確認することができます。
root $ docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
udemy_demoapp_v1_api latest 3ee7026684f7 3 hours ago 699MB
<none> <none> 9cedb9398faf 2 days ago 699MB
udemy_demoapp_v1_front latest 1f728a898fce 3 days ago 733MB
<none> <none> 3bd92b5e7e76 4 days ago 665MB
...
2つのタグが確認できますね。
latestタグ
これは最新のイメージを意味し、現在使用しているイメージとなります。
noneタグ
noneタグとは、同じイメージの中で、最新ではないイメージを指します。
このnoneタグは、「dangling image(ダングリングイメージ)」と呼ばれ、ぶら下がりの意味を持ちます。
参考 What is a dangling image and what is an unused image? - Stack Overflow
noneタグのイメージだけを取得する
それでは<none>
タグのイメージだけを絞り込んでみましょう。
root $ docker images -f 'dangling=true'
REPOSITORY TAG IMAGE ID CREATED SIZE
<none> <none> 9cedb9398faf 2 days ago 699MB
<none> <none> 3bd92b5e7e76 4 days ago 665MB
-f, --filter
... 検索フィルターをかけるオプション。'dangling=true'
... ダングリング状態のものだけを抽出するフィルター。
うーん、2つ合わせて1.2GBのメモリを消費していますね。
削除に必要なイメージIDを取得する
Dockerイメージの削除にはイメージIDが必要です。
-q
オプションをつけることで取得できます。
root $ docker images -f 'dangling=true' -q
9cedb9398faf
3bd92b5e7e76
<none>タグのイメージを一括削除する
2020年8月30日 追記
$ docker image prune
コマンドでも、ダングリングイメージを削除することができます。
それでは上のコマンドとDockerイメージを削除するrmi
コマンドを掛け合わせて一括削除を実行しましょう。
root $ docker rmi $(docker images -f 'dangling=true' -q)
Deleted: sha256:9cedb9398faf8e57fb988efa5695d5b788b3cba0068e3619ae287bb9b86d954a
Deleted: sha256:d77fcf32284c82d8951726546ecb1df0e16aa5178449c0f0f1dca689bf621a3e
...
rmi <イメージID>
... 渡されたIDのDockerイメージを削除する。
いっぱい削除されましたね。削除を確認してみましょう。
root $ docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
udemy_demoapp_v1_api latest 3ee7026684f7 3 hours ago 699MB
udemy_demoapp_v1_front latest 1f728a898fce 3 days ago 733MB
...
うん、すっきりしました。
docker image noneが削除できない!?
2020年8月30日 追記
強制オプション
-f
をつけて実行すれば、コンテナが存在しても削除されます。
$ docker rmi $(docker images -f 'dangling=true' -q) -f
Dockerは、紐づいたコンテナが存在する場合、イメージが削除できません。
その場合はコンテナを削除し、もう一度イメージ削除を実行しましょう。
# コンテナを一括削除
root $ docker rm $(docker ps -q -a) -f
# コンテナを確認
root $ docker ps -a
-
-f
... 稼働中のコンテナを強制的に削除。
Railsの.gitignoreを編集する
Dockerコンテナ上でRails consoleを起動したり、デバッグを実行したりすると、自動で
このファイルはGitHubやHerokuにプッシュする必要はありません。
「api」ディレクトリの
api/.gitignore
...
# 一番下に追加
# シェルコマンド履歴
/.ash_history
# Rubyコマンド履歴
/.irb_history
# デバッグbinding.pryコマンド履歴
/.local
/.local/*
これで保存すると自動的に管理外ファイルとしてくれます。簡単ですね。
まとめ
今回はDockerイメージの一括削除方法を学びました。
Dockerのイメージは適度に削除することを心がけましょう。
ここまでの変更をpushしとこう
これでモデル開発の準備が完了しました。
変更をpushしておきましょう。まずは「api」ディレクトリから。
root $ cd api
api $ git add -A
api $ git commit -m "finished_model_initial_setting"
api $ git checkout master
api $ git merge <編集を行ったブランチ名>
api $ git push
docker-composeファイルも編集したので「root」ディレクトリもpushしておきましょう。
api $ cd ..
root $ git commit -am "edit_docker-compose.yml"
root $ git push
このチャプターまとめ
「モデル開発事前準備」では以下のことを行いました。
- Railsのapplication.rbのタイムゾーン、I18n、Zeitwerkのセッティング
- 4つのGemをインストールして、Hirb.enableを自動化
- Railsの「A server is already running. Check /tmp/pids/server.pid」のエラー対応
- Docker<none>タグのイメージを削除(今ここ)
これで心置きなくユーザーモデルが開発できますね。
次回予告
次回はいよいよ「ユーザーモデル開発」です。
新章始まり、始まり。
どうぞお楽しみに。