2019年4月18日木曜日

docker で git credential を使ったプライベートリポジトリをクローンする方法を考える

概要

プライベートリポジトリを clone する場合には大抵の場合認証情報が必要になります
普通はインタラクティブに入力しますが docker の場合はそうもいきません
今回は git credential を使ってプライベートリポジトリを clone する方法を複数考えてみました

環境

  • macOS 10.14.4
  • docker 18.09.2

build-arg を使う方法

まずは build-arg を使う方法を紹介します
ビルドする際に認証情報を与えるので run する際には常に同じ認証情報を使うことになります
イメージは適当にローカルにあったものを使っているので環境に合わせて変更してください
要件としては git コマンドが使えれば OK です

  • vim Dockerfile
FROM golang:latest

RUN git config --global credential.helper store
ARG credential
RUN echo $credential > /root/.git-credentials

RUN git clone https://repo.url.com/hawksnowlog/private-repo.git

CMD ["cat", "/root/.git-credentials"]
  • docker build -t private_repo_clone --build-arg credential='https://hawksnowlog:secret@repo.url.com' .

docker run はしてもしなくても OK です
build すると clone もされるのですでにイメージはリポジトリがある状態になります

メリット・デメリット

build-arg に認証情報を設定するだけなので無駄なファイルが必要ないです
今回たまたま golang のイメージを使っていますが、このまま go get することも可能です

デメリットとしては run するたびに認証情報を変更できない点です
別のユーザがイメージを使う場合にビルドした人が設定した認証情報を使うことになるのであまりセキュリティ的によろしくありません

認証情報が固定になるのでプライベートな場合に使える方法かなと思います

環境変数を使う方法

コンテナに環境変数渡すオプション「-e」を使って実現する方法を考えます
シェルスクリプトを追加で用意しそこで認証情報の設定と clone を行います

  • vim Dockerfile
FROM golang:latest

ADD . /root
RUN chmod +x /root/credential.sh
RUN git config --global credential.helper store

CMD ["/bin/sh", "-c", "/root/credential.sh"]
  • vim credential.sh
#!/bin/sh

echo $CREDENTIAL > /root/.git-credentials
git clone https://repo.url.com/hawksnowlog/private-repo.git
cat /root/.git-credentials
ls go-vddk
  • docker build -t private_repo_clone .
  • docker run --rm -e CREDENTIAL='https://hawksnowlog:secret@repo.url.com' private_repo_clone

メリット・デメリット

この方法だと毎回認証情報が渡せるのでセキュアかなと思います
内容はただただシェルスクリプトを実行しているだけなので他にもやりようはいくらでもあると思います
が、ポイントは環境変数が参照できるようにわざわざ別のスクリプトを作成しているという点になります
Dockerfile 内だと -e の内容は参照できないためそうしています

ただデメリットが少し多いという気がしていて、まず 1 つファイルが増えてしまう点があります
また毎回 clone が走ってしまうのもデメリットかなと思います
本来であればイメージ作成時に必要なライブラリやファイルの配置し build を完了させておいて run でプロセスだけ起動するという方法が無難かなと思います

あとは微妙な点としては CMD が複数指定できないので clone のあとに何かしたいのであればシェルスクリプトに追記していくしかない点です
本来であればプロセスを起動したいと思うのでそれらの内容をシェルスクリプトに記載する必要があります

その他

git credential を使わなくても単純に clone コマンドに認証情報を入れてもいいと思います
もしくは鍵認証にすれば鍵をイメージ or コンテナに配置する方法でも良いと思います

複数のプライベートリポジトリから clone しなければいけない場合は .git-credentials に複数の認証情報を書き込むように書き換えれば OK です
今回の場合であれば複数の ARG を指定可能にしたり複数の環境変数を参照するように変更すれば OK です

最後に

今回紹介した方法は

  • --build-arg を使ってイメージ自体に認証情報を埋め込む
  • run 時に -e を使って認証情報を渡しそれをスクリプトで読み込む

になります
個人的には前者の方がシンプルで良いかなとは思います
がイメージにパスワードが埋め込まれているのでパブリックに公開するのは難しいかなと思います

他にもやり方はたくさんあるので一例として参考にしてみてください

0 件のコメント:

コメントを投稿