You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
* Fix links in README.md
* hide progress bar of curl
% Total % Received % Xferd Average Speed Time Time Time Current
Dload Upload Total Spent Left Speed
100 823 100 823 0 0 803k 0 --:--:-- --:--:-- --:--:-- 803k
* Dockerfile: bump base to `nginx-proxy-connect-stable-alpine:nginx-1.26.3-alpine-3.21.3`
* Dockerfile: `k8s.gcr.io` is no more, long live `registry.k8s.io`; cache `ghcr.io` by default
* gha: test: bump actions, drop cache, fix tested image versions/references
* gha: master/tags: bump actions, drop caching
* disable IPv6 via env
* gha: test: bringup a foreground instance first to check for crashing instance, under a 30s timeout; do not fail
* gha: master-latest: ignore changes to other GHA workflows
* Fix: default DISABLE_IPV6 to false to avoid "entrypoint.sh: line 36: DISABLE_IPV6: unbound variable"
* entrypoint: show the final /etc/nginx/resolvers.conf before starting
* gha: test: timeout with kill and verbosely for foreground test
* gha: test: no-name and terminal interactive for foreground test
* gha: test: no-name and non-terminal-interactive for foreground test
* gha: test: sleep after foreground test so Docker can cleanup; let it kill nicely
* gha: test: sleep after foreground test so Docker can cleanup; kill it -9; stop and remove it after timeout
* gha: test: foreground: no need for portfwds or bind mounts for first-contact test
* gha: test: foreground: fix typo
* gha: test: make it a matrix, test amd64/arm64, show inline colorized logs instead of artifacts
* fix README.md a bit
* gha: test: enhance matrix configuration and add JSON logging; add tests for manifest cache and ipv6 disablement
* gha: test: redirect docker logs to files using &> for both stdout & stderr
* gha: test: rename workflow from 'test' to 'Sanity Check'
* Dockerfile: squash warnings
- it is about 3 years too late to warn me about SecretsUsedInArgOrEnv
* gha: test: update GHA output code for IP address and add error/warning output for nginx log files
* gha: test: add full test with ghcr.io pull via extraImageToPull; add time to check effectiveness; fsync() after image prune
* gha: test: cosmetic fix
* gha: test: add environment variables to disable Docker build summary and record upload
* README: update for the "2nd Docker Apocalypse"
* README: update GitHub Workflow Status badge URLs
* README: update GitHub Workflow Status badge URLs
* update registry.k8s.io references in configuration files and README
* update to version 0.6.5 in examples and README
* update to version 0.6.5 in examples and README
* Add support for Google rtifact Registry (GAR)
* Add test case for Google's public GCR mirror, which is theoretically run
by GAR behind the scenes.
---------
Co-authored-by: lucapette <ciao@lucapette.me>
Co-authored-by: Vangie Du <duwan@live.com>
Co-authored-by: Ricardo Pardini <ricardo@pardini.net>
Co-authored-by: moonbuggy <3319867+moonbuggy@users.noreply.github.com>
Co-authored-by: Matthew Wallace <github@matthewwallace.me>
A caching proxy for Docker; allows centralised management of (multiple) registries and their authentication; caches images from *any* registry.
9
9
Caches the potentially huge blob/layer requests (for bandwidth/time savings), and optionally caches manifest requests ("pulls") to avoid rate-limiting.
10
10
11
+
### `0.6.5`: Updated late February 2025 for the "2nd Docker Apocalypse"
12
+
13
+
Docker, Inc has announced a [2nd apocalypse](https://www.docker.com/blog/revisiting-docker-hub-policies-prioritizing-developer-experience/) for 1st of March'25 (it has [already been pushed back to April](https://www.theregister.com/2025/02/22/docker_hub_pull_limits/)).
14
+
This has caused a new surge of interest in this project; in response I've updated all dependencies to the latest versions,
15
+
added a [Test matrix](https://github.com/rpardini/docker-registry-proxy/actions/workflows/test.yaml), merged some pull requests (including `DISABLE_IPV6=true`, which was a long-standing request), and updated the documentation.
16
+
17
+
Many thanks to all the contributors over the years; I've no intention of abandoning this project -- please keep sending and updating your PRs.
18
+
11
19
### NEW: avoiding DockerHub Pull Rate Limits with Caching
12
20
13
21
Starting November 2nd, 2020, DockerHub will
@@ -18,7 +26,7 @@ also known as the _Docker Apocalypse_.
18
26
The main symptom is `Error response from daemon: toomanyrequests: Too Many Requests. Please see https://docs.docker.com/docker-hub/download-rate-limit/` during pulls.
19
27
Many unknowing Kubernetes clusters will hit the limit, and struggle to configure `imagePullSecrets` and `imagePullPolicy`.
20
28
21
-
Since version `0.6.0`, this proxy can be configured with the env var `ENABLE_MANIFEST_CACHE=true` which provides
29
+
This proxy can be configured with the env var `ENABLE_MANIFEST_CACHE=true` which provides
22
30
configurable caching of the manifest requests that DockerHub throttles. You can then fine-tune other parameters to your needs.
23
31
Together with the possibility to centrally inject authentication (since 0.3x), this is probably one of the best ways to bring relief to your distressed cluster, while at the same time saving lots of bandwidth and time.
24
32
@@ -63,8 +71,7 @@ for this to work it requires inserting a root CA certificate into system trusted
63
71
## master/:latest is unstable/beta
64
72
65
73
-`:latest` and `:latest-debug` Docker tag is unstable, built from master, and amd64-only
66
-
- Production/stable is `0.6.2`, see [0.6.2 tag on Github](https://github.com/rpardini/docker-registry-proxy/tree/0.6.2) - this image is multi-arch amd64/arm64
67
-
- The previous version is `0.5.0`, without any manifest caching, see [0.5.0 tag on Github](https://github.com/rpardini/docker-registry-proxy/tree/0.5.0) - this image is multi-arch amd64/arm64
74
+
- Production/stable is `0.6.5`, see [0.6.5 tag on Github](https://github.com/rpardini/docker-registry-proxy/tree/0.6.5) - this image is multi-arch amd64/arm64
68
75
69
76
## Also hosted on GitHub Container Registry (ghcr.io)
70
77
@@ -86,22 +93,20 @@ for this to work it requires inserting a root CA certificate into system trusted
86
93
- Env `AUTH_REGISTRIES`: space separated list of `hostname:username:password` authentication info.
87
94
-`hostname`s listed here should be listed in the REGISTRIES environment as well, so they can be intercepted.
88
95
- Env `AUTH_REGISTRIES_DELIMITER` to change the separator between authentication info. By default, a space: "``". If you use keys that contain spaces (as with Google Cloud Registry), you should update this variable, e.g. setting it to `AUTH_REGISTRIES_DELIMITER=";;;"`. In that case, `AUTH_REGISTRIES` could contain something like `registry1.com:user1:pass1;;;registry2.com:user2:pass2`.
89
-
- Env `AUTH_REGISTRY_DELIMITER` to change the separator between authentication info *parts*. By default, a colon: "`:`". If you use keys that contain single colons, you should update this variable, e.g. setting it to `AUTH_REGISTRIES_DELIMITER=":::"`. In that case, `AUTH_REGISTRIES` could contain something like `registry1.com:::user1:::pass1 registry2.com:::user2:::pass2`.
90
-
- Env `PROXY_REQUEST_BUFFERING`: If push is allowed, buffering requests can cause issues on slow upstreams.
91
-
If you have trouble pushing, set this to `false` first, then fix remainig timeouts.
92
-
Default is `true` to not change default behavior.
93
-
ENV PROXY_REQUEST_BUFFERING="true"
96
+
- Env `AUTH_REGISTRY_DELIMITER` to change the separator between authentication info *parts*. By default, a colon: "`:`". If you use keys that contain single colons, you should update this variable, e.g. setting it to `AUTH_REGISTRY_DELIMITER=":::"`. In that case, `AUTH_REGISTRIES` could contain something like `registry1.com:::user1:::pass1 registry2.com:::user2:::pass2`.
97
+
- Env `PROXY_REQUEST_BUFFERING`: If push is allowed, buffering requests can cause issues on slow upstreams. If you have trouble pushing, set this to `false` first, then fix remaining timeouts. Default is `true` to not change default behavior.
94
98
- Timeouts ENVS - all of them can pe specified to control different timeouts, and if not set, the defaults will be the ones from `Dockerfile`. The directives will be added into `http` block.:
95
99
- SEND_TIMEOUT : see [send_timeout](http://nginx.org/en/docs/http/ngx_http_core_module.html#send_timeout)
96
100
- CLIENT_BODY_TIMEOUT : see [client_body_timeout](http://nginx.org/en/docs/http/ngx_http_core_module.html#client_body_timeout)
97
101
- CLIENT_HEADER_TIMEOUT : see [client_header_timeout](http://nginx.org/en/docs/http/ngx_http_core_module.html#client_header_timeout)
98
-
- KEEPALIVE_TIMEOUT : see [keepalive_timeout](http://nginx.org/en/docs/http/ngx_http_core_module.html#keepalive_timeout
102
+
- KEEPALIVE_TIMEOUT : see [keepalive_timeout](http://nginx.org/en/docs/http/ngx_http_core_module.html#keepalive_timeout)
99
103
- PROXY_READ_TIMEOUT : see [proxy_read_timeout](http://nginx.org/en/docs/http/ngx_http_proxy_module.html#proxy_read_timeout)
100
104
- PROXY_CONNECT_TIMEOUT : see [proxy_connect_timeout](http://nginx.org/en/docs/http/ngx_http_proxy_module.html#proxy_connect_timeout)
101
105
- PROXY_SEND_TIMEOUT : see [proxy_send_timeout](http://nginx.org/en/docs/http/ngx_http_proxy_module.html#proxy_send_timeout)
102
106
- PROXY_CONNECT_READ_TIMEOUT : see [proxy_connect_read_timeout](https://github.com/chobits/ngx_http_proxy_connect_module#proxy_connect_read_timeout)
103
107
- PROXY_CONNECT_CONNECT_TIMEOUT : see [proxy_connect_connect_timeout](https://github.com/chobits/ngx_http_proxy_connect_module#proxy_connect_connect_timeout)
104
-
- PROXY_CONNECT_SEND_TIMEOUT : see [proxy_connect_send_timeout](https://github.com/chobits/ngx_http_proxy_connect_module#proxy_connect_send_timeout))
108
+
- PROXY_CONNECT_SEND_TIMEOUT : see [proxy_connect_send_timeout](https://github.com/chobits/ngx_http_proxy_connect_module#proxy_connect_send_timeout)
109
+
- Env `DISABLE_IPV6`: If set to `true`, prevents nginx from getting IPv6 addresses from the resolver, without needing a [custom resolver config](#custom_nginx_resolvers_configuration)
For Google Artifact Registry (GAR), username should be `_json_key` and the password should be the contents of the service account JSON.
191
+
Check out [GAR docs](https://cloud.google.com/artifact-registry/docs/docker/authentication#json-key).
192
+
193
+
The service account key is in JSON format, it contains spaces ("``") and colons ("`:`").
194
+
195
+
To be able to use GAR you should set `AUTH_REGISTRIES_DELIMITER` to something different than space (e.g. `AUTH_REGISTRIES_DELIMITER=";;;"`) and `AUTH_REGISTRY_DELIMITER` to something different than a single colon (e.g. `AUTH_REGISTRY_DELIMITER=":::"`).
196
+
197
+
GAR repositories have different domain names depending on the region in which they are hosted. Separate `REGISTRIES` and `AUTH_REGISTRIES` entries must be defined for each region's domain name. `us-east1-docker.pkg.dev` and `us-central1-docker.pkg.dev` are used in the example below.
198
+
199
+
Example with GAR using credentials from a service account from a key file `servicekey.json`:
200
+
201
+
```bash
202
+
docker run --rm --name docker_registry_proxy -it \
or you can run it from another cluster, maybe a management/observability one with provided yaml, in this case, you will need to change the following lines:
0 commit comments