QNAP に Pypi キャッシュサーバを建てる

Posted: , Modified:   Docker Python Pip ARM QNAP Qiita

本稿は Qiita 投稿記事 のバックアップです.

はじめに

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 のマニュアルは ここ から参照できる.

fig6.png

コンテナの作成タブから,利用するコンテナイメージを検索する. デフォルトでは DockerHub にあるイメージを利用できる.

fig7.png

目的のイメージが見つかったらインストールする.

fig8.png

インストールが終わった,あるいは既にインストール済みの場合は, コンテナの作成画面が開く.

コンテナの名前は好きに決めれば良い. コマンドとエントリーポイントは Dockerfile の設定をここで上書きできるが, 特に指示されていなければデフォルトで良いだろう. CPU やメモリの制限は環境によって変わるので,ここではデフォルトのままにしておく. 次に,詳細設定のネットワーク項目を確認する.

fig9.png

ネットワークの設定で,どのポートがフォワーディングされるか確認する. devpi server はデフォルトで 3141 を利用する. ホスト側のポート番号は,始め auto になっているので 3141 へ変更しておく. また,ベースとなったイメージによっては関係ないポートも空いているので,削除しておく. 下の図の場合,6080 は不要なので削除する.

fig10.png

なお,共有フォルダの項目で,キャッシュサーバが利用するディレクトリをマウントすることもできる. 以上の設定が終わればコンテナを作成する.

キャッシュサーバ利用側の設定

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 のキャッシュサーバを建ててまた少し幸せになった話が参考になりました.