“docker diff”を使って”pip install”のライブラリインストール先を調べる

Docker

はじめに

クラウド化、コンテナ化、マイクロサービス化が進み、システムを 複数の言語で作られたサブシステム で構成することが増えてきました。
どんどん学習も大変になって来ています。
Python、Go、TypeScript、Ruby といろんな言語を学習する必要に迫られているわけですが、それぞれの ライブラリ管理ツール ( PIP、BUNDLER、NPM、... ) がライブラリをどこにインストールするのか調べたいと思いました。

Linux のファイル寿司テム全体で diff を使って変更されたファイルを確認できれば便利ですね。

そんなときに便利なのが docker diff コマンドです。

検証環境

$ uname -moi
x86_64 MacBookPro16,1 Darwin

$ bash -version | head -n 1
GNU bash, version 5.1.8(1)-release (x86_64-apple-darwin20.3.0)

$ docker --version
Docker version 20.10.7, build f0df350

docker diff を使って pip コマンドでライブラリがインストールされる場所を調べる

それでは docker diff コマンドを使って pip install でライブラリがどこにインストールされるのかを調べてみます。

pip は Python のコマンドですので、Python の Docker イメージを使用します。

1. Docker コンテナの起動

Docker コンテナを起動します。
起動する際に わかりやすい名前を付けておきます

今回は example という名前をつけました。

$ docker run -it --name example python bash
Unable to find image 'python:latest' locally
latest: Pulling from library/python
4c25b3090c26: Pull complete
1acf565088aa: Pull complete
b95c0dd0dc0d: Pull complete
5cf06daf6561: Pull complete
942374d5c114: Pull complete
64c0f10e4cfa: Pull complete
419e258e9e29: Pull complete
3fff52a3f4a6: Pull complete
9476e460b958: Pull complete
Digest: sha256:46a1f3fd3d713fc9151753a6a75da327d1c872152ace16e8b3225458f8754d07
Status: Downloaded newer image for python:latest
root@66c913ceb8e0:/#

無事起動できました。

2. pip install を使ってライブラリをインストール

pip install でライブラリをインストールしてみます。

何でも良いのですが今回は Pandas をインストールしてみました。

root@66c913ceb8e0:/# pip install pandas
Collecting pandas
  Downloading pandas-1.3.2-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (11.5 MB)
     |████████████████████████████████| 11.5 MB 4.4 MB/s
Collecting pytz>=2017.3
  Downloading pytz-2021.1-py2.py3-none-any.whl (510 kB)
     |████████████████████████████████| 510 kB 15.9 MB/s
Collecting numpy>=1.17.3
  Downloading numpy-1.21.2-cp39-cp39-manylinux_2_12_x86_64.manylinux2010_x86_64.whl (15.8 MB)
     |████████████████████████████████| 15.8 MB 21.9 MB/s
Collecting python-dateutil>=2.7.3
  Downloading python_dateutil-2.8.2-py2.py3-none-any.whl (247 kB)
     |████████████████████████████████| 247 kB 22.0 MB/s
Collecting six>=1.5
  Downloading six-1.16.0-py2.py3-none-any.whl (11 kB)
Installing collected packages: six, pytz, python-dateutil, numpy, pandas
Successfully installed numpy-1.21.2 pandas-1.3.2 python-dateutil-2.8.2 pytz-2021.1 six-1.16.0
WARNING: Running pip as the 'root' user can result in broken permissions and conflicting behaviour with the system package manager. It is recommended to use a virtual environment instead: https://pip.pypa.io/warnings/venv

インストールが終わったら exit します。

root@66c913ceb8e0:/# exit
exit

3. docker diff コマンドを使って追加/変更/削除されたファイルを確認

docker diff コマンドを使って、Linux ファイルシステム上の追加/変更/削除されたファイルを確認します。

# 引数には先程実行したDockerコンテナ名を指定します
$ docker diff example
C /root
A /root/.bash_history
A /root/.cache
A /root/.cache/pip
A /root/.cache/pip/http
...(省略)...
A /usr/local/lib/python3.9/site-packages/__pycache__
A /usr/local/lib/python3.9/site-packages/__pycache__/six.cpython-39.pyc
A /usr/local/lib/python3.9/site-packages/pandas
A /usr/local/lib/python3.9/site-packages/pandas/_config
A /usr/local/lib/python3.9/site-packages/pandas/_config/__init__.py
A /usr/local/lib/python3.9/site-packages/pandas/_config/__pycache__
A /usr/local/lib/python3.9/site-packages/pandas/_config/__pycache__/dates.cpython-39.pyc
A /usr/local/lib/python3.9/site-packages/pandas/_config/__pycache__/display.cpython-39.pyc
A /usr/local/lib/python3.9/site-packages/pandas/_config/__pycache__/localization.cpython-39.pyc
A /usr/local/lib/python3.9/site-packages/pandas/_config/__pycache__/__init__.cpython-39.pyc
A /usr/local/lib/python3.9/site-packages/pandas/_config/__pycache__/config.cpython-39.pyc
A /usr/local/lib/python3.9/site-packages/pandas/_config/config.py
A /usr/local/lib/python3.9/site-packages/pandas/_config/dates.py
A /usr/local/lib/python3.9/site-packages/pandas/_config/display.py
A /usr/local/lib/python3.9/site-packages/pandas/_config/localization.py
A /usr/local/lib/python3.9/site-packages/pandas/compat
...(省略)...

コンテナ作成時点から変更されたファイル が一覧表示されます。

各行の左端の文字は、種別(追加(= A)、変更(= C)、削除(= D))を示しています。
コンテナ作成時点には存在しなかったファイルが見つかった場合は「A」フラグ付きで出力されますし、コンテナ作成時点には存在していたディレクトリが見つからなかった場合は「D」フラグ付きで出力されます。

pip install にて、大量にファイルが追加されたようです。

ということで、インストール先は/usr/local/lib/python3.9/site-packages/pandas であることがわかりました。

ひとこと

プログラムのバグで 「想定しないファイルが書き換えられているのかもしれない」 といった場合の調査にも利用できるのではないでしょうか?

Docker