DockerHub の pull rate limit への対応方法メモです。
基本的には DockerHub にログインした状態で pull することになると思います。
ログイン情報のパスワードには DockerHub の設定から API トークンを発行しそれを設定します。
ただ、このユーザー/パスワードを各 CI サービスに適用する方法はサービスによって違います。今回は CodeShip と Drone.io の設定を紹介したいと思います。
CodeShip の場合
CodeShip Pro の場合です。 Basic の場合はコマンドの中で docker login コマンドを実行する方法になると思います。
Using Docker Image Registries | CloudBees Docs
上記リンク先のドキュメントに設定方法が記載されています。
手順としては大きく分けて2つで、Dockerconfig.json の用意とリポジトリ/ YAML の設定になります。
Dockerconfig.json の用意
まず DockerHub にログインするための config.json を生成します。
{ "auths": { "https://index.docker.io/v1/": { "auth": "your_auth_string", "email": "your_email" } } }
json ファイルの中身は上記のようなものになります。
この json ファイルは docker login したら $HOME/.docker/config.json に保存されるものを使えばよいのですが、macOS の場合保存場所が keychain になっているため、下記方法で取得します。公式ドキュメントでは「Docker Credentials On Mac OSX」のあたりです。
まずは以下のような credentials.evn ファイルを作成します。
USERNAME/PASSWORD は適宜埋めてください(PASSWORD には API TOKEN)
DOCKER_USERNAME=... DOCKER_PASSWORD=... DOCKER_REGISTRY=https://index.docker.io/v1/
続いて、以下のコマンドを実行します。
mkdir ./dockercfg docker run -it --rm \ --env-file=credentials.env \ -v "$(pwd):/opt/data/" \ -v "/var/run/docker.sock:/var/run/docker.sock" \ codeship/dockercfg-generator /opt/data/dockercfg
すると、カレントディレクトリ/dockercfg/ に config.json が出来上がります。
リポジトリ / YAML の設定
config.json が出来上がったらそれをシークレットファイルにして、CI 環境が読み込むように YAML に設定をします。
シークレットファイルの作成のためにプロジェクトの設定ページから codeship.aes をダウンロードしてください。リポジトリのルートに配置したら不用意に commit してしまわないように .gitignore に追加しておきましょう。
aes を配置したら以下のコマンドを実行します。パスは適宜変更してください。
jet encrypt dockercfg/config.json dockercfg.encrypted
出来上がった .encrypted ファイルは git add/commit します。
続いて YAML の設定をします。
追記するのは codeship-steps.yml ファイルの方です。
以下のように encrypted_dockercfg_path を追加してください。
- name: spec service: gcc command: /work/build.sh encrypted_dockercfg_path: ./dockercfg.encrypted
動作確認
これで設定は以上です。変更を commit/push して動作確認してみましょう。
うまく設定できていれば DockerHub の Token 一覧画面で最終アクセス日時が更新されるはずです。
Drone.io の場合
Images | Drone
Drone の公式ドキュメントはこちらです。
CodeShip と同じように Dockerconfig.json ファイルを作成し、それを drone のシークレットファイルとして CLI から登録します。
iutest で生成用に用意した Makefile があるので参考にしてください。
https://github.com/srz-zumix/iutest/tree/master/.ci/drone
json ファイルを作成したら以下のコマンドで登録できます。
drone secret add --repository srz-zumix/iutest \ --name dockerconfig \ --data @dockerconfig.json
シークレットファイルをアップデートする場合は update サブコマンドを使います。
drone secret update --repository srz-zumix/iutest \ --name dockerconfig \ --data @dockerconfig.json
PR でもこのシークレットファイルを利用可能にする場合は --allow-pull-request オプションを追加してください。
シークレットファイルを登録したら以下のように、このファイルを使用するように YAML の設定をします。
kind: pipeline name: test image_pull_secrets: - dockerconfig steps: ...
image_pull_secrets に指定するのは secret add/update したときに指定した --name オプションの名前です。
動作確認
設定は以上です。
CodeShip と同様にトークンが利用されたかどうかを確認しましょう。
まとめ
今回対応した CodeShip/Drone どちらも Dockerconfig.json ファイルをシークレットに用意してそれを環境に読ませる方法でした。
最初 Drone の方は
echo -n '<ユーザ名>:<アクセストークン>' | base64
の結果を auth に設定していて、それではうまくいかなくて手こずっていたのですが、CodeShip のやり方を知って助かりました。
(Mac 環境で base64 してるのが原因?)
ともあれ、CodeShip や Drone と同様に Docker の config.json を使った login をする CI サービスではこの方法が使えそうです。
今回は以上です。
0 件のコメント:
コメントを投稿