毎度、ググっても出てこない小ネタを取り扱っております。
本記事は個人的な見解であり、筆者の所属するいかなる団体にも関係ございません。
0. はじめに
GitLabのDependency Proxyの話です。
GitLab Premiumの機能でしたが、13.6(2020年11月)からCommunity EditionのCoreの無料版で使えるようになりました。
社内のオンプレGitLabに設定してみたという話になります。(GitLab.comでは2020年11月から利用可能になっています)
The Dependency Proxy is moving to open source | GitLab
https://about.gitlab.com/blog/2020/10/30/minor-breaking-change-dependency-proxy/
Using the Dependency Proxy to improve your pipelines | GitLab
https://about.gitlab.com/blog/2020/12/15/dependency-proxy-updates/
こちらは利用編でオンプレGitLabに導入する設定編はこちらです。
オンプレGitLabで依存関係プロキシ(Dependency Proxy)を設定してDockerHubのダウンロード制限を回避する(設定編) - Qiita
1. dockerから使ってみる
1-1. docker loginせずにRateLimitを確認する
$ TOKEN=$(curl "https://auth.docker.io/token?service=registry.docker.io&scope=repository:ratelimitpreview/test:pull" | jq --raw-output .token) && curl --head --header "Authorization: Bearer $TOKEN" "https://registry-1.docker.io/v2/ratelimitpreview/test/manifests/latest" 2>&1 | grep RateLimit
% Total % Received % Xferd Average Speed Time Time Time Current
Dload Upload Total Spent Left Speed
100 4379 0 4379 0 0 6141 0 --:--:-- --:--:-- --:--:-- 6133
RateLimit-Limit: 100;w=21600
RateLimit-Remaining: 100;w=21600
RateLimit-Remaining: 100;w=21600
だから残り100ですね。
1-2. docker pullしてからRateLimit-Remaining:
を見る
$ docker pull alpine:latest
latest: Pulling from library/alpine
801bfaa63ef2: Already exists
Digest: sha256:3c7497bf0c7af93428242d6176e8f7905f2201d8fc5861f45be7a346b5f23436
Status: Downloaded newer image for alpine:latest
docker.io/library/alpine:latest
$ TOKEN=$(curl "https://auth.docker.io/token?service=registry.docker.io&scope=repository:ratelimitpreview/test:pull" | jq --raw-output .token) && curl --head --header "Authorization: Bearer $TOKEN" "https://registry-1.docker.io/v2/ratelimitpreview/test/manifests/latest" 2>&1 | grep RateLimit
% Total % Received % Xferd Average Speed Time Time Time Current
Dload Upload Total Spent Left Speed
100 4379 0 4379 0 0 6202 0 --:--:-- --:--:-- --:--:-- 6202
RateLimit-Limit: 100;w=21600
RateLimit-Remaining: 99;w=21600
RateLimit-Remaining: 99;w=21600
になっています。
1-3. Dependency Proxyを設定したGitLabにdocker loginする
$ docker login gitlab.example.jp
Username: tetsurou.yano
Password: XXXXXXXXXXXX
Login Succeeded
1-4. docker pullする前のDependency Proxy画面を確認
以下の通り、何もダウンロードされていません。
1-5. Dependency Proxy経由で docker pullしてみる
docker pullしてみます。ついでにtimeも測ってみましょう。
今回設定したGitLabのDependency ProxyのURLは以下の通りです。
https://gitlab.example.jp/dependencyproxytestgroup/dependency_proxy/containers
このURLに取得したいDockerHubのイメージを追加します。
テストしてalpine:latest
をpullしてみましょう。
URLは以下のようになります。
gitlab.example.jp/dependencyproxytestgroup/dependency_proxy/containers/apline:latest
docker pull
する場合は以下のようになります。
docker pull gitlab.example.jp/dependencyproxytestgroup/dependency_proxy/containers/apline:latest
■実行結果(Docker Ver.20.10.0)
$ docker pull gitlab.example.jp/dependencyproxytestgroup/dependency_proxy/containers/alpine:latest
latest: Pulling from dependencyproxytestgroup/dependency_proxy/containers/alpine
ba3557a56b15: Already exists
Digest: sha256:4661fb57f7890b9145907a1fe2555091d333ff3d28db86c3bb906f6a2be93c87
Status: Downloaded newer image for gitlab.example.jp/dependencyproxytestgroup/dependency_proxy/containers/alpine:latest
gitlab.example.jp/dependencyproxytestgroup/dependency_proxy/containers/alpine:latest
GitLab 13.10からDocker 20系にも対応しました。
■下記のエラーはGitLab 13.9までです。
docker pull gitlab.example.jp/dependencyproxytestgroup/dependency_proxy/containers/alpine:latest
Error response from daemon: received unexpected HTTP status: 500 Internal Server Error
あら?エラーですね。。。
調べてみるとDocker 20系にはまだ対応してないのだそうで。
Support "pull-by-digest" in the Dependency Proxy (#290944) · 課題 · GitLab.org / GitLab · GitLab
https://gitlab.com/gitlab-org/gitlab/-/issues/290944
■再度実行結果(Docker Ver.19.03.6)
気を取り直して、バージョン19系のdockerからdocker pullしてみます。
time docker pull gitlab.example.co.jp/dependencyproxytestgroup/dependency_proxy/containers/alpine:latest
latest: Pulling from dependencyproxytestgroup/dependency_proxy/containers/alpine
801bfaa63ef2: Pull complete
Digest: sha256:77593302d30498d9b13d69c2fa68d22fd0e8223a19b51846cbf9c11644958adb
Status: Downloaded newer image for gitlab.example.co.jp/dependencyproxytestgroup/dependency_proxy/containers/alpine:latest
gitlab.example.co.jp/dependencyproxytestgroup/dependency_proxy/containers/alpine:latest
real 0m4.238s
user 0m0.027s
sys 0m0.015s
$ docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
gitlab.example.jp/dependencyproxytestgroup/dependency_proxy/containers/alpine latest 389fef711851 2 weeks ago 5.58MB
上手くいきました。
1-6. Dependency Proxy画面を確認する
イメージが1つ増えました。
1-7. 再度、docker pullしてみる
一旦ローカルのイメージを削除して再度pullしてみます。
$ time docker pull gitlab.example.co.jp/dependencyproxytestgroup/dependency_proxy/containers/alpine:latest
latest: Pulling from dependencyproxytestgroup/dependency_proxy/containers/alpine
801bfaa63ef2: Pull complete
Digest: sha256:77593302d30498d9b13d69c2fa68d22fd0e8223a19b51846cbf9c11644958adb
Status: Downloaded newer image for gitlab.example.co.jp/dependencyproxytestgroup/dependency_proxy/containers/alpine:latest
gitlab.example.co.jp/dependencyproxytestgroup/dependency_proxy/containers/alpine:latest
real 0m3.255s
user 0m0.013s
sys 0m0.030s
先ほどは、4.2秒だったので1秒ほど早くなりました。
大きなDockerイメージだともっと顕著に差が出るはずです。
1-8. RateLimit-Remaining:
を再度確認する
$ TOKEN=$(curl "https://auth.docker.io/token?service=registry.docker.io&scope=repository:ratelimitpreview/test:pull" | jq --raw-output .token) && curl --head --header "Authorization: Bearer $TOKEN" "https://registry-1.docker.io/v2/ratelimitpreview/test/manifests/latest" 2>&1 | grep RateLimit
% Total % Received % Xferd Average Speed Time Time Time Current
Dload Upload Total Spent Left Speed
100 4378 0 4378 0 0 6063 0 --:--:-- --:--:-- --:--:-- 6055
RateLimit-Limit: 100;w=21600
RateLimit-Remaining: 99;w=21600
2. まとめ
長くなったので、docker pull利用編はここで終了します。
GitLab CI/CD利用編は別途書きたいと思います。
追記: GitLab CI/CDのパイプライン編を書きました
GitLab CI/CDのパイプラインでDependency Proxyを利用する - Qiita
https://qiita.com/ynott/items/9407abd6fec369ad7a55