はじめに
QNAP に Apt キャッシュサーバを建てるに続き,
QNAP の NAS に Docker コンテナとして Pypi キャッシュサーバを建てる.
LAN 内での pip の高速化とトラフィック削減を目指す.
Pypi キャッシュサーバ
Pipit のキャッシュサーバとして,devpi server を用いる.Docker で運用するので,devpi のイメージを探す.
例えば,scrapinghub/docker-devpi などが見つかった.
前回 にも述べた通り,手元の NAS は ARM ベースであった.
そのため,別途 ARM 用 devpi イメージを作成した.
作成したイメージの Dockerfile は,GitHub に,イメージは DockerHub に置いてある.
devpi server コンテナの起動
コンテナの管理には,Container Stationを利用する.
もしなければ,App Center からインストールする.Container Station のマニュアルは ここ から参照できる.
コンテナの作成タブから,利用するコンテナイメージを検索する.
デフォルトでは DockerHub にあるイメージを利用できる.
目的のイメージが見つかったらインストールする.
インストールが終わった,あるいは既にインストール済みの場合は,
コンテナの作成画面が開く.
コンテナの名前は好きに決めれば良い.
コマンドとエントリーポイントは Dockerfile の設定をここで上書きできるが,
特に指示されていなければデフォルトで良いだろう.
CPU やメモリの制限は環境によって変わるので,ここではデフォルトのままにしておく.
次に,詳細設定のネットワーク項目を確認する.
ネットワークの設定で,どのポートがフォワーディングされるか確認する.
devpi server はデフォルトで 3141 を利用する.
ホスト側のポート番号は,始め auto になっているので 3141 へ変更しておく.
また,ベースとなったイメージによっては関係ないポートも空いているので,削除しておく.
下の図の場合,6080 は不要なので削除する.
なお,共有フォルダの項目で,キャッシュサーバが利用するディレクトリをマウントすることもできる.
以上の設定が終わればコンテナを作成する.
キャッシュサーバ利用側の設定
pip コマンドにキャッシュサーバを利用させるには,
--index-url
オプションとしてキャッシュサーバの URL を,
--trusted-host
オプションとしてキャッシュサーバの IP アドレスを渡す.
trusted-host が必要なのは,キャッシュサーバが https ではなく http のみで待ち受けるためである.
https をサポートさせるのは手間なので,信頼できるネットワーク内でのみ使うということにして,
trusted-host を設定する.
なお,キャッシュサーバの URL は,IP アドレスが xxx.xxx.xxx.xxx
だとすると,
http://xxx.xxx.xxx.xxx:3141/root/pypi
になる.
/root/pypi
の部分は忘れやすいので注意.(/root/pypi
以外のURLアドレスについてはドキュメントを参照)
しかし,毎回 pip コマンドにオプションを付けるのは手間なので,
設定ファイルに利用することもできる.
~/.pip/pip.conf
に以下の内容を記述する.
[global]
index-url="http://xxx.xxx.xxx.xxx:3141/root/pypi"
trusted-host="xxx.xxx.xxx.xxx"
以降,pip を使うときはキャッシュサーバにアクセスするようになる.
Docker での利用
Docker で pip を最も利用するケースは,コンテナ実行時よりはビルド時,すなわち Dockerfile の中になる.
docker build 時にキャッシュサーバを利用可否を決めるように,ARG コマンドを利用する.
ARG PIP_PROXY
RUN if [ -n "$PIP_PROXY" ]; then \
echo "Set pip proxy: $PIP_PROXY"; \
IPPORT=${PIP_PROXY#*//}; \
mkdir -p ~/.pip/; \
echo "[global]\nindex-url=$PIP_PROXY/root/pypi\ntrusted-host=${IPPORT%:*}" >> ~/.pip/pip.conf; \
cat ~/.pip/pip.conf; \
fi
Dockerfile に上記のような項目を追加する.
ARG
で定義されているのが変数であり,docker build
時に —build-arg
オプションで値を渡せる.
上の Dockerfile の場合,--build-arg PIP_PROXY=http://xxx.xxx.xxx.xxx:3141/
を
docker build
に渡すと,~/.pip/pip.conf
を適切に設定する.
—build-arg
を使って PIP_PROXY
変数を設定しない場合はスキップされる.
以上により,ビルド時にキャッシュサーバの利用を決めることができるようになった.
まとめ
QNAP NAS の Container Station を使って,devpi server コンテナを用意した.
ARM 環境の人は手間がかかるので,今回作成したイメージを使うと楽だろう.
また, Dockerfile の ARG コマンドを使って,ビルド時にキャッシュサーバの利用を切り替えるようにした.
今回も,(Docker で) PyPI のキャッシュサーバを建ててまた少し幸せになった話が参考になりました.