LoginSignup
9

More than 5 years have passed since last update.

(Docker で) PyPI のキャッシュサーバを建ててまた少し幸せになった話

Posted at

(Docker で) ローカルに APT のパッケージリポジトリキャッシュサーバ (apt-cacher-ng) を建てたら幸せになった。

という記事で APT のキャッシュサーバを建てた。

自分は Python を使う系の人なので、 apt-get install の時だけでなく pip install のダウンロード時間も節約したいと思った。

devpi-server

devpi-server という素晴らしいパッケージを導入すれば、 PyPI のキャッシュサーバが手軽に建てられるらしい。

これをやはり Dockerfile で記述することにした。

なお、 pip install には ローカルキャッシュ機構が備わっている ので、この方法は単一のサーバで単一のインストールするだけなら、あまり意味が無いと思われる。

  • 複数のサーバインスタンス間で個別にパッケージを取得する場合
  • 利用できる回線の帯域が小さい、もしくは限定されている場合

に特に有用。

Dockerfile

下記が本題の Dockerfile 。

Dockerfile
#
# Build:
#     docker build -t devpi-server .
#
# Run:
#     docker run -d -p 3141:3141 --name devpi-server-run devpi-server
#
FROM ubuntu
EXPOSE 3141
VOLUME ["/var/cache/devpi"]

ENV DEBIAN_FRONTEND noninteractive
RUN apt-get update && \
    apt-get install --no-install-recommends -y python3-pip && \
    pip3 install -q -U pip devpi-server

CMD chmod 777 /var/cache/devpi && \
    devpi-server \
        --serverdir /var/cache/devpi \
        --host 0.0.0.0 --port 3141

# 使い方

--trusted-host でキャッシュサーバのホスト名、 --index-url で対象のキャッシュサーバの URL を指定する。

$ pip install --trusted-host XXX.XXX.XXX.XXX --index-url http://XXX.XXX.XXX.XXX:3141/root/pypi/ package-name

なお、 https://pip.pypa.io/en/latest/user_guide.html#environment-variables にもある通り、
pip install のオプションは環境変数で制御することもできる。
その場合には PIP_を接頭辞として大文字・スネークケースでつなげた、
PIP_TRUSTED_HOST と PIP_INDEX_URL で指定する。

比較

time コマンドで計測した。
1 回しか計測していないので、厳密な比較はしていないが充分だと感じた。
ローカルキャッシュを無効化すべく --no-cache-dir を指定している。

$ time pip install --no-cache-dir numpy scipy matplotlib pandas ipython

キャッシュなし

real    3m29.583s

キャッシュあり

real    0m24.950s

大きな差がある。
キャッシュなしでは特に scipy と matplotlib のダウンロードに大きく時間を使っていたように感じた。

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
9