LoginSignup
1
1

More than 5 years have passed since last update.

Dockerのビルド時にプライベートリポジトリをpip install

Last updated at Posted at 2017-04-18

要件

Docker ビルド時に,
github, BitBucket 等のプライベートリポジトリのライブラリを pip install したい

条件

プライベートリポジトリにアクセスするための鍵は $HOME/.ssh 以下にある

案1

ローカルで wheel 作成して Dockerfile でコピー

pip wheel djando
(django はプライベートじゃないけども)

良い点

  • 鍵問題と Docker を切り離せる
  • イメージをビルドし直す際に wheel を使いまわせる

問題点

  • ライブラリのビルドをローカル環境で行うためコンテナ内の実行環境と合わない可能性がある

例1: Django を wheel で取得した場合
-> Django-1.8.1-py2.py3-none-any.whl
python2-3 互換性があり, OS 非依存(any) こちらの場合なら問題ないが,

例2: MysqlClient を wheel で取得した場合
-> mysqlclient-1.3.10-cp27-cp27m-macosx_10_10_intel.whl
CPython2.7で、macosx10.10 用ビルド と実行環境が制限される.
Docker Container は linux カーネル上で動作するため動作に支障が出る可能性がある.

linux 上で取得と wheel 化を行えばよさそうだが, 手間がかかりすぎて本末転倒.

案2

イメージに鍵を埋め込む.
O'REILLY の Docker 本で「やるな」とある. セキュリティ的によろしくなさすぎるので却下.

案2-2

イメージに永続的に鍵が残らなければいいので, 鍵をコピーして pip install 後に鍵を削除すればいいのでは. で, 書いてみたのが

Dockerfile.
COPY id_rsa /root/.ssh/
COPY id_rsa.pub /root/.ssh/
RUN chmod 600 /root/.ssh/id_rsa && \
    chmod 600 /root/.ssh/id_rsa.pub && \
    echo "Host github.com\n\tStrictHostKeyChecking no\n" >> /root/.ssh/config
RUN pip install -r requirements.txt
RUN rm /root/.ssh/*

こんな感じ.
鍵ファイルのアクセス権限は 600 でないといけない (.ssh は 700).
また, HostKeyChecking は無効にしておかないとビルドではエラーになる.
pip install が終了したら認証情報はイメージから全て削除する.

これでインストールできるけども

鍵ファイルは通常ローカルの $HOME/.ssh 以下にあり, Docker ビルドは Dockerfile のあるディレクトリとトップディレクトリとしてその内部にあるファイルしかアクセスできない.
そのため, 鍵ファイルをコピーして Dockerビルドでアクセスできる領域に持ってくる必要がある.
こちらも永続的置いておくのはあまりイケてないので, 一時的にコピーしてビルド後に削除するようなビルドスクリプトを書くのがいいと思う.
Docker のコマンドで完結しないが仕方のないこと...

案3

プライベートリポジトリのライブラリだけ頑張って Docker の実行環境に合うように wheel 化して残りは普通にビルド内でインターネットから pip install する.

プライベートリポジトリ内ライブラリの数によるが, これでいい気がしてきた.
でも wheel のバージョン管理も必要になるのか...

まとめ

個人開発環境として配布するなら 案2-2, 本番運用するなら案3 かなぁ...(しない)

1
1
2

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
1
1