(Docker で) ローカルに APT のパッケージリポジトリキャッシュサーバ (apt-cacher-ng) を建てたら幸せになった。
という記事で APT のキャッシュサーバを建てた。
自分は Python を使う系の人なので、 apt-get install の時だけでなく pip install のダウンロード時間も節約したいと思った。
devpi-server
devpi-server という素晴らしいパッケージを導入すれば、 PyPI のキャッシュサーバが手軽に建てられるらしい。
これをやはり Dockerfile で記述することにした。
なお、 pip install には ローカルキャッシュ機構が備わっている ので、この方法は単一のサーバで単一のインストールするだけなら、あまり意味が無いと思われる。
- 複数のサーバインスタンス間で個別にパッケージを取得する場合
- 利用できる回線の帯域が小さい、もしくは限定されている場合
に特に有用。
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 のダウンロードに大きく時間を使っていたように感じた。