背景
Infrastructure as Codeにおいて、プライベートリポジトリからソースコードを引っ張ってきて、ビルドあるいはデプロイしたいということはよくある(と思っている)。
しかし、コードの中や環境変数に、リポジトリのユーザ名・パスワードなどのアカウント情報を書いておくのは、あまりスマートではない。
本稿では、BitbucketのOAuthを使って、Dockerコンテナ内にコードをデプロイする方法について記述する。
BitbucketのOAuth設定
まずはBitbucketのOAuthを設定し、Credentialを用いてBitbucketにAPIアクセスできるようにする。
3.今作成したコンシューマーキーの鍵・シークレットをメモしておく。これでOAuthの準備は完了
アクセストークンの取得
公式を参考にする。
アクセストークンの取得は下記コマンドで可能。
https://bitbucket.org/site/oauth2/access_token を叩いて、認証に成功するとJSONが帰ってくるので、jqコマンドで解析しaccess_tokenを取得する。
jqコマンドのインストールが必要。
# 上記の鍵とシークレットを設定する
$ BB_OAUTH_KEY=****
$ BB_OAUTH_SECRET=****
# API叩いて帰ってきたJSONからjqコマンドで`access_token`を取得する。
$ curl https://bitbucket.org/site/oauth2/access_token \
-d grant_type=client_credentials \
-u ${BB_OAUTH_KEY}:${BB_OAUTH_SECRET} \
| jq -r '.access_token'
Dockerfileからイメージの作成
イメージをビルドする際に、ホストマシンから変数を渡すことで、Dockerfile内にクレデンシャル情報を残さないようにできる。また、上のコマンドを使ってアクセストークンを取得し、リポジトリのクローンを行う。
Dockerfile
# ベースイメージは何でもOK
FROM python:3.6.4-alpine3.7
# build時の変数
ARG BB_OAUTH_KEY
ARG BB_OAUTH_SECRET
RUN apk update
RUN apk add curl
RUN apk add jq
RUN apk add git
# USER_NAME, REPOSITORY_NAME は適宜書き換えてください
RUN git clone https://x-token-auth:`curl https://bitbucket.org/site/oauth2/access_token -d grant_type=client_credentials -u ${BB_OAUTH_KEY}:${BB_OAUTH_SECRET} \
| jq -r '.access_token'`@bitbucket.org/USER_NAME/REPOSITORY_NAME
ビルドコマンド
$ docker build -f ./Dockerfile --build-arg BB_OAUTH_KEY="****" BB_OAUTH_SECRET="****" .
これでビルドは完了。
環境変数を毎回書くのが面倒という時は、--build-arg
を指定せずにホストマシンの環境変数からでも取得してくれる。