動機
仕事でRubyのバージョンアップを行いました。ローカルの開発環境ではDockerを使っているので、新しいバージョンのRubyをインストールするようDockerfileを書き換えてイメージをビルドしました。
イメージのビルド後、あたらしいバージョンのRubyで bundle installを実施しました。すると以下のようなメッセージが表示されました。
1 | Ignoring (gem名) because its extensions are not built. |
古いgemが残っているからなのだと思うのですが、ちょっと気持ち悪いので対処したいと思いググってみました。すると、どこかのサイトにgemのインストールディレクトリをまっさらにしてからもう一度 bundle installするとよい、と書かれていたのでその通りにすると、アプリケーションが全く動かなくなってしまいました。bundle installは実行できますが、すでにgemはインストール済という認識でなにも行ってくれません。
docker-compose.ymlを見ると、マウントしているボリュームにbundle installしているようです。そのボリュームを調べたいと思いました。
ボリュームの一覧表示
ボリュームの一覧表示をするにはdocker volume lsを実行します
1 | $ docker volume ls |
かなりの数があります。
使っていないものもあるのだろうなと思い、フィルタオプションでボリュームが参照されているかどうかを指定して(dangling=true)使っていないボリュームの一覧を表示してみます。(参照されていない時がtrue。ドキュメントはこちらです。danglingとは宙ぶらりんという意味のようです。)
1 | $ docker volume ls -f dangling=true |
ほとんどが使われていないボリュームのようです。
では利用されていないボリュームを削除します。ボリュームを削除するにはdocker volume rmコマンドを利用します。VOLUME NAMEを一つずつ指定して削除することもできますが、大変なので一気に削除します。
1 | $ docker volume ls -qf dangling=true | xargs docker volume rm |
削除されたボリューム名が表示されます。
これですっきりしました、残ったボリュームは数個しかありません。ではそれらのボリュームの詳細をみていきたいと思います。
ボリュームの詳細確認
ボリュームの詳細を確認するにはdocker volume inspectコマンドを利用します。
1 | $ docker volume inspect web_bundle |
マウントポイントが記載されています。中身をみてみます。
1 | $ ls -l /var/lib/docker/volumes/web_bundle/_data |
どういうことでしょうか…
Dockerホストにログイン
少しググってみると、Docker Desktop for MacはDocker Desktop HyperKit VMが動作していて、Mac上で仮想マシンが動いているということでした。ですとMacのファイルシステムにそのパスは存在せず、Mac上で動いている仮想マシンに存在するということになります。
その仮想マシン(Dockerホスト)にログインするにはどうするのか調べてみると、screenというコマンドでログインできるようです。screenについての詳細はman screenで確認しました。
screenコマンドでDockerホストに接続します。
1 | $ screen ~/Library/Containers/com.docker.docker/Data/com.docker.driver.amd64-linux/tty |
パッと見、接続できたかどうかわかりづらいですが、エンターキーを押すと、docker-desktop:~#とプロンプトが表示されます。切断するときはCtrl-a Ctrl-kです。Ctrl-dを押すとおなじみのクジラが表示されます。
1 | docker-desktop:~# __ __ |
ボリュームの確認
ではボリュームを確認します。
1 | docker-desktop:~# ls -l /var/lib/docker/volumes/web_bundle/_data |
このボリュームはRailsアプリケーションで利用するgemのインストールディレクトリです。Dockerコンテナでbundle installを行うとこのボリュームのファイルが更新されます。
まとめ
- dockerで利用しているボリュームは
docker volumeコマンドで確認ができる - Docker Desktop for Macは仮想マシンで動作している
- MacからDockerホストに接続するにはscreenコマンドを利用する