0
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

GitLabのDependency Proxyを使ってDockerHubのRate Limitを回避する

Last updated at Posted at 2023-02-23

GitLabのDependency Proxyを使ってみた時のメモ。
GitLab Japanの方の以下のブログを参考にした。

上記の記事があるのでブログ化しようか迷ったが、上記の記事で古い点があったのでブログ化した。
検証にはGitLab Community Edition 15.8.3を利用した。

Dependency Proxyとは

詳しくはオンプレGitLabで依存関係プロキシ(Dependency Proxy)を設定してDockerHubのダウンロード制限を回避する(設定編)で述べられているが、要はDockerHubを利用した際に429 Too Many RequestsYou have reached your pull rate limit. You may increase the limit by authenticating and upgrading: https://www.docker.com/increase-rate-limitsが出てpullに失敗するのを避けるため、Proxyを設定してイメージをGitLab側にキャッシュさせるものである。

使い方としては、

docker pull <GitLabのDependency ProxyのURL>/<DockerHubのイメージ名>:<タグ>

で実行すると、初回はDockerHubからGitLabにPullされ、2回目以降はGitLabのものをpullする動きとなる。
なお、Dependency Proxyの単位はGroup単位もしくはホスト単位のようでProject単位では設定できない模様。
今回はGroup単位のもので確認している。ホスト単位で設定する場合はこちらの公式ドキュメントを参考にするとよさそう。

Dependency Proxyのインストール

こちらで確認したところ、docker-composeでGitLabをインストールする場合はデフォルトで有効化されており、helmでGitLabをインストールする場合は無効化されている模様。
自分はhelmでGitLabを使っているため、helmのvalues.yamlglobal.appConfigに以下の設定を入れてデプロイした。

    dependencyProxy:
      enabled: true
      proxy_download: true
      bucket: gitlab-dependency-proxy
      connection: {}

デプロイのコマンドは以下。

helm upgrade -i -f ./values.yaml gitlab gitlab/gitlab -n gitlab

デプロイ後、GitLabにアクセスし、適当なGroupを作成してGroupのSetings->Packages and registriesからDependency Proxyが見えたらOK。

1677117486460.png

Dependency Proxyの利用

Proxy URLの取得方法はGitLab Japanのブログの方は古くなっており、現在はPackages and registries->Dependency Proxyから取得できる。

1677117641696.png

レジストリにログインする。注意点として、helmでインストールした場合、

  • registry.domain
  • gitlab.domain
    のそれぞれのIngressリソースが作成され、通常コンテナイメージの管理はregistry.domainを利用するが、Dependency Proxyの場合はgitlab.domainの方を利用する。そのため、ログインコマンドは以下のようになる。
docker login gitlab.app.hogeeee.info

試しにnginxのイメージをpullしてみる。

docker pull gitlab.app.hogeeee.info/myapp/dependency_proxy/containers/nginx

pull前のDependency Proxyの表示は以下。

1677119033816.png

GitLab上にはイメージは存在していないが、Proxyとして動くため、pullコマンドは問題なく動作する。

$ docker pull gitlab.app.hogeeee.info/myapp/dependency_proxy/containers/nginx
gitlab.app.hogeeee.info/myapp/dependency_proxy/containers/nginx:latest:           resolved       |++++++++++++++++++++++++++++++++++++++|
manifest-sha256:7f797701ded5055676d656f11071f84e2888548a2e7ed12a4977c28ef6114b17: done           |++++++++++++++++++++++++++++++++++++++|
config-sha256:3f8a00f137a0d2c8a2163a09901e28e2471999fde4efc2f9570b91f1c30acf94:   done           |++++++++++++++++++++++++++++++++++++++|
layer-sha256:7e9b29976cce358fbdd777b91ce2c52d18090dd1507d0616793e9ce8cc15979c:    done           |++++++++++++++++++++++++++++++++++++++|
layer-sha256:077b9569ff86b205b47334ce8fa1c4bcf55b124b2fe880f40b56f9932f856f68:    done           |++++++++++++++++++++++++++++++++++++++|
layer-sha256:a0bc35e7077319c74cd587e1c911894c0bc003e1783c0bc2e59e351d41cfa543:    done           |++++++++++++++++++++++++++++++++++++++|
layer-sha256:3082a16f3b619613a40d0b9056c6142493980314187ef6b6281909a40f6b7147:    done           |++++++++++++++++++++++++++++++++++++++|
layer-sha256:bb263680fed18eecdc67f885094df6f589bafc19004839d7fdf141df236a61aa:    done           |++++++++++++++++++++++++++++++++++++++|
layer-sha256:258f176fd22609802ed5def498ce4c7d1fa80a8ddba258b6e9eca0364df3ddb3:    done           |++++++++++++++++++++++++++++++++++++++|
elapsed: 103.7s                                                                   total:  24.3 M (240.0 KiB/s)

実行後、キャッシュされたことが分かる。
1677119157125.png

CI/CDでの利用

利用は非常に簡単。公式ドキュメントにあるように、CI_DEPENDENCY_PROXY_GROUP_IMAGE_PREFIXをつけるだけ。
試しに以下のbusyboxイメージを使うジョブを持った.gitlab-ci.ymlを作成してpushする。

stages:
  - build

build-job:
  image: ${CI_DEPENDENCY_PROXY_GROUP_IMAGE_PREFIX}/busybox
  stage: build
  script:
    - echo "Compiling the code..."
    - echo "Compile complete."

すると実行されたジョブのログからDependency Proxyが使われたことが確認できる。

Running with gitlab-runner 15.8.2 (4d1ca121)
  on gitlab-runner-app-677f44dd67-m2f5h m6cNxfT2, system ID: r_ximVOH9cKkLk
Preparing the "kubernetes" executor
00:00
Using Kubernetes namespace: gitlab-demo
Using Kubernetes executor with image gitlab.app.hogeeee.info:443/myapp/dependency_proxy/containers/busybox ...
Using attach strategy to execute scripts...

Dependency Proxyの方にもbusyboxイメージが追加されていることが確認できる。
1677123221854.png

なお、Privateなリポジトリから引っ張ってくる場合はCI_DEPENDENCY_PROXY_USERCI_DEPENDENCY_PROXY_PASSWORDといった環境変数が用意されているので、こちらを設定して実行してやれば上手くいくと思う(未検証)。

おわりに

Dependency Proxyの利用は非常に簡単なため、DockerHubのRate Limitに悩むチーム・組織などでは導入の検討の価値がありそうだ。
ただ、運用を考えた場合、イメージはデフォルトでは自動で削除されない
Dependency Proxyの設定から90日後にするなどの設定は可能だが、細かい削除ルールを適用したい場合はAPIの活用なども含めて検討する必要がある点は注意した方がいい。

0
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?