要件
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 後に鍵を削除すればいいのでは. で, 書いてみたのが
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 かなぁ...(しない)