2020-05-20 05:08:11 -04:00
---
stage: Package
group: Package
2020-11-26 01:09:20 -05:00
info: To determine the technical writer assigned to the Stage/Group associated with this page, see https://about.gitlab.com/handbook/engineering/ux/technical-writing/#assignments
2020-05-20 05:08:11 -04:00
---
2020-11-13 16:09:31 -05:00
# Dependency Proxy
2019-09-17 08:06:48 -04:00
2020-11-13 16:09:31 -05:00
> - [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/7934) in [GitLab Premium](https://about.gitlab.com/pricing/) 11.11.
> - [Moved](https://gitlab.com/gitlab-org/gitlab/-/issues/273655) to [GitLab Core](https://about.gitlab.com/pricing/) in GitLab 13.6.
2020-12-10 16:10:15 -05:00
> - [Support for private groups](https://gitlab.com/gitlab-org/gitlab/-/issues/11582) in [GitLab Core](https://about.gitlab.com/pricing/) 13.7.
> - Anonymous access to images in public groups is no longer available starting in [GitLab Core](https://about.gitlab.com/pricing/) 13.7.
2019-09-17 08:06:48 -04:00
2020-09-23 14:10:15 -04:00
The GitLab Dependency Proxy is a local proxy you can use for your frequently-accessed
upstream images.
2019-09-17 08:06:48 -04:00
2020-09-23 14:10:15 -04:00
In the case of CI/CD, the Dependency Proxy receives a request and returns the
upstream image from a registry, acting as a pull-through cache.
2019-09-17 08:06:48 -04:00
2020-12-14 19:10:07 -05:00
NOTE:
The Dependency Proxy is not compatible with Docker version 20.x and later.
If you are using the Dependency Proxy, Docker version 19.x.x is recommended until
[issue #290944 ](https://gitlab.com/gitlab-org/gitlab/-/issues/290944 ) is resolved.
2020-09-23 14:10:15 -04:00
## Prerequisites
2019-09-17 08:06:48 -04:00
2020-12-03 13:10:10 -05:00
The Dependency Proxy must be [enabled by an administrator ](../../../administration/packages/dependency_proxy.md ).
2019-09-17 08:06:48 -04:00
2020-09-23 14:10:15 -04:00
### Supported images and packages
2019-09-17 08:06:48 -04:00
2020-09-23 14:10:15 -04:00
The following images and packages are supported.
2019-09-17 08:06:48 -04:00
2020-09-23 14:10:15 -04:00
| Image/Package | GitLab version |
2019-09-17 08:06:48 -04:00
| ---------------- | -------------- |
| Docker | 11.11+ |
2020-09-23 14:10:15 -04:00
For a list of planned additions, view the
[direction page ](https://about.gitlab.com/direction/package/dependency_proxy/#top-vision-items ).
2020-11-20 16:09:12 -05:00
## Enable the Dependency Proxy
The Dependency Proxy is disabled by default.
[Learn how an administrator can enable it ](../../../administration/packages/dependency_proxy.md ).
2020-09-23 14:10:15 -04:00
## View the Dependency Proxy
To view the Dependency Proxy:
- Go to your group's **Packages & Registries > Dependency Proxy** .
The Dependency Proxy is not available for projects.
## Use the Dependency Proxy for Docker images
You can use GitLab as a source for your Docker images.
2019-09-17 08:06:48 -04:00
2020-09-23 14:10:15 -04:00
Prerequisites:
2019-09-17 08:06:48 -04:00
2020-09-23 14:10:15 -04:00
- Your images must be stored on [Docker Hub ](https://hub.docker.com/ ).
- Docker Hub must be available. Follow [this issue ](https://gitlab.com/gitlab-org/gitlab/-/issues/241639 )
for progress on accessing images when Docker Hub is down.
2019-09-17 08:06:48 -04:00
2020-12-03 13:10:10 -05:00
### Authenticate with the Dependency Proxy
2020-12-14 16:09:47 -05:00
> - [Authentication and support for private groups](https://gitlab.com/gitlab-org/gitlab/-/issues/11582) in [GitLab Core](https://about.gitlab.com/pricing/) 13.7.
> - It was [deployed behind a feature flag](../../feature_flags.md), disabled by default.
> - [Became enabled by default](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/49519) on GitLab 13.7.
> - It's enabled on GitLab.com.
> - It's recommended for production use.
> - For GitLab self-managed instances, GitLab administrators can opt to [disable it](../../../administration/packages/dependency_proxy.md#disabling-authentication). **(CORE ONLY)**
WARNING:
This feature might not be available to you. Check the **version history** note above for details.
The requirement to authenticate is a breaking change added in 13.7. An [administrator can temporarily
disable it](../../../administration/packages/dependency_proxy.md#disabling-authentication) if it
has disrupted your existing Dependency Proxy usage.
2020-12-03 13:10:10 -05:00
Because the Dependency Proxy is storing Docker images in a space associated with your group,
you must authenticate against the Dependency Proxy.
Follow the [instructions for using images from a private registry ](../../../ci/docker/using_docker_images.md#define-an-image-from-a-private-container-registry ),
but instead of using `registry.example.com:5000` , use your GitLab domain with no port `gitlab.example.com` .
For example, to manually log in:
```shell
docker login gitlab.example.com --username my_username --password my_password
```
You can authenticate using:
- Your GitLab username and password.
- A [personal access token ](../../../user/profile/personal_access_tokens.md ) with the scope set to `read_registry` and `write_registry` .
#### Authenticate within CI/CD
2020-12-14 19:10:07 -05:00
> [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/280582) in 13.7.
2020-12-10 16:10:15 -05:00
2020-12-08 19:09:42 -05:00
To work with the Dependency Proxy in [GitLab CI/CD ](../../../ci/README.md ), you can use:
2020-12-03 13:10:10 -05:00
2020-12-08 19:09:42 -05:00
- `CI_DEPENDENCY_PROXY_USER` : A CI user for logging in to the Dependency Proxy.
- `CI_DEPENDENCY_PROXY_PASSWORD` : A CI password for logging in to the Dependency Proxy.
- `CI_DEPENDENCY_PROXY_SERVER` : The server for logging in to the Dependency Proxy.
- `CI_DEPENDENCY_PROXY_GROUP_IMAGE_PREFIX` : The image prefix for pulling images through the Dependency Proxy.
2020-12-03 13:10:10 -05:00
2020-12-08 19:09:42 -05:00
This script shows how to use these variables to log in and pull an image from the Dependency Proxy:
2020-12-03 13:10:10 -05:00
```yaml
# .gitlab-ci.yml
dependency-proxy-pull-master:
# Official docker image.
image: docker:latest
stage: build
services:
- docker:dind
before_script:
2020-12-08 19:09:42 -05:00
- docker login -u "$CI_DEPENDENCY_PROXY_USER" -p "$CI_DEPENDENCY_PROXY_PASSWORD" "$CI_DEPENDENCY_PROXY_SERVER"
2020-12-03 13:10:10 -05:00
script:
2020-12-08 19:09:42 -05:00
- docker pull "$CI_DEPENDENCY_PROXY_GROUP_IMAGE_PREFIX"/alpine:latest
2020-12-03 13:10:10 -05:00
```
You can also use [custom environment variables ](../../../ci/variables/README.md#custom-environment-variables ) to store and access your personal access token or other valid credentials.
2020-12-08 19:09:42 -05:00
##### Authenticate with `DOCKER_AUTH_CONFIG`
You can use the Dependency Proxy to pull your base image.
1. [Create a `DOCKER_AUTH_CONFIG` environment variable ](../../../ci/docker/using_docker_images.md#define-an-image-from-a-private-container-registry ).
1. Get credentials that allow you to log into the Dependency Proxy.
1. Generate the version of these credentials that will be used by Docker:
```shell
# The use of "-n" - prevents encoding a newline in the password.
echo -n "my_username:my_password" | base64
# Example output to copy
bXlfdXNlcm5hbWU6bXlfcGFzc3dvcmQ=
```
This can also be other credentials such as:
```shell
echo -n "my_username:personal_access_token" | base64
echo -n "deploy_token_username:deploy_token" | base64
```
1. Create a [custom environment variables ](../../../ci/variables/README.md#custom-environment-variables )
named `DOCKER_AUTH_CONFIG` with a value of:
```json
{
"auths": {
"https://gitlab.example.com": {
"auth": "(Base64 content from above)"
}
}
}
```
1. Now reference the Dependency Proxy in your base image:
```yaml
# .gitlab-ci.yml
image: "$CI_SERVER_HOST":"$CI_SERVER_PORT"/groupname/dependency_proxy/containers/node:latest
...
```
2020-12-03 13:10:10 -05:00
### Store a Docker image in Dependency Proxy cache
2020-09-23 14:10:15 -04:00
To store a Docker image in Dependency Proxy storage:
1. Go to your group's **Packages & Registries > Dependency Proxy** .
1. Copy the **Dependency Proxy URL** .
1. Use one of these commands. In these examples, the image is `alpine:latest` .
- Add the URL to your [`.gitlab-ci.yml` ](../../../ci/yaml/README.md#image ) file:
2019-09-17 08:06:48 -04:00
2020-01-30 10:09:15 -05:00
```shell
2020-09-23 14:10:15 -04:00
image: gitlab.example.com/groupname/dependency_proxy/containers/alpine:latest
2019-09-17 08:06:48 -04:00
```
2020-09-23 14:10:15 -04:00
- Manually pull the Docker image:
2019-09-17 08:06:48 -04:00
2020-01-30 10:09:15 -05:00
```shell
2020-09-23 14:10:15 -04:00
docker pull gitlab.example.com/groupname/dependency_proxy/containers/alpine:latest
2019-09-17 08:06:48 -04:00
```
2020-09-23 14:10:15 -04:00
- Add the URL to a `Dockerfile` :
2019-09-17 08:06:48 -04:00
2020-01-30 10:09:15 -05:00
```shell
2020-09-23 14:10:15 -04:00
FROM gitlab.example.com/groupname/dependency_proxy/containers/alpine:latest
2019-09-17 08:06:48 -04:00
```
2020-08-09 17:10:01 -04:00
GitLab pulls the Docker image from Docker Hub and caches the blobs
on the GitLab server. The next time you pull the same image, GitLab gets the latest
2020-09-23 14:10:15 -04:00
information about the image from Docker Hub, but serves the existing blobs
2020-08-09 17:10:01 -04:00
from the GitLab server.
2019-09-17 08:06:48 -04:00
2020-09-23 14:10:15 -04:00
## Clear the Dependency Proxy cache
2020-04-09 11:09:29 -04:00
2020-09-23 14:10:15 -04:00
Blobs are kept forever on the GitLab server, and there is no hard limit on how much data can be
stored.
2019-09-17 08:06:48 -04:00
2020-09-23 14:10:15 -04:00
To reclaim disk space used by image blobs that are no longer needed, use
the [Dependency Proxy API ](../../../api/dependency_proxy.md ).
2020-12-11 19:09:52 -05:00
## Docker Hub rate limits and the Dependency Proxy
> - [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/241639) in [GitLab Core](https://about.gitlab.com/pricing/) 13.7.
In November 2020, Docker introduced
[rate limits on pull requests from Docker Hub ](https://docs.docker.com/docker-hub/download-rate-limit/ ).
If your GitLab [CI/CD configuration ](../../../ci/README.md ) uses
an image from Docker Hub, each time a job runs, it may count as a pull request.
To help get around this limit, you can pull your image from the Dependency Proxy cache instead.
When you pull an image (by using a command like `docker pull` or, in a `.gitlab-ci.yml`
file, `image: foo:latest` ), the Docker client makes a collection of requests:
1. The image manifest is requested. The manifest contains information about
how to build the image.
1. Using the manifest, the Docker client requests a collection of layers, also
known as blobs, one at a time.
The Docker Hub rate limit is based on the number of GET requests for the manifest. The Dependency Proxy
caches both the manifest and blobs for a given image, so when you request it again,
Docker Hub does not have to be contacted.
### How does GitLab know if a cached tagged image is stale?
If you are using an image tag like `alpine:latest` , the image changes
over time. Each time it changes, the manifest contains different information about which
blobs to request. The Dependency Proxy does not pull a new image each time the
manifest changes; it checks only when the manifest becomes stale.
Docker does not count HEAD requests for the image manifest towards the rate limit.
You can make a HEAD request for `alpine:latest` , view the digest (checksum)
value returned in the header, and determine if a manifest has changed.
The Dependency Proxy starts all requests with a HEAD request. If the manifest
has become stale, only then is a new image pulled.
For example, if your pipeline pulls `node:latest` every five
minutes, the Dependency Proxy caches the entire image and only updates it if
`node:latest` changes. So instead of having 360 requests for the image in six hours
(which exceeds the Docker Hub rate limit), you only have one pull request, unless
the manifest changed during that time.
### Check your Docker Hub rate limit
If you are curious about how many requests to Docker Hub you have made and how
many remain, you can run these commands from your runner, or even in a CI/CD
script:
```shell
# Note, you must have jq installed to run this command
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
...
```
The output is something like:
```shell
RateLimit-Limit: 100;w=21600
RateLimit-Remaining: 98;w=21600
```
This example shows the total limit of 100 pulls in six hours, with 98 pulls remaining.