https://docs.docker.com/registry/garbage-collection/表示
“注意:您应该确保注册表处于只读模式或根本不运行。如果您要在垃圾收集运行时上传图像,则存在图像图层被错误删除导致损坏的风险图像。”
但是如果我停止注册表容器,那么我就无法执行垃圾收集。我不知道如何切换到只读模式。
这是我开始垃圾收集的方式:
docker exec registry bin/registry garbage-collect --delete-untagged /etc/docker/registry/config.yml
以及注册表是如何启动的:
docker run -d --restart=always --name registry \
-e REGISTRY_HTTP_ADDR=0.0.0.0:5000 \
-e "ENABLE_CORS=true" \
-e REGISTRY_HTTP_HEADERS_Access-Control-Allow-Origin='["*"]' \
-p 5000:5000 \
-v /registry-storage:/var/lib/registry registry:2
有一个只读配置选项,因此您可以使用以下命令重新启动注册表:
docker run -d --restart=always --name registry \
-e REGISTRY_HTTP_ADDR=0.0.0.0:5000 \
-e REGISTRY_STORAGE_MAINTENANCE_READONLY='{"enabled":true}' \
-e REGISTRY_MAINTENANCE_READONLY_ENABLED= \
-e "ENABLE_CORS=true" \
-e REGISTRY_HTTP_HEADERS_Access-Control-Allow-Origin='["*"]' \
-p 5000:5000 \
-v /registry-storage:/var/lib/registry registry:2
或者您可以将该卷安装为只读:
docker run -d --restart=always --name registry \
-e REGISTRY_HTTP_ADDR=0.0.0.0:5000 \
-e "ENABLE_CORS=true" \
-e REGISTRY_HTTP_HEADERS_Access-Control-Allow-Origin='["*"]' \
-p 5000:5000 \
-v /registry-storage:/var/lib/registry:ro registry:2
如果您选择后一个选项,或者只是决定关闭注册表,GC 可以在单独的容器中运行,不需要使用
exec
:
docker run --rm \
-v /registry-storage:/var/lib/registry \
--entrypoint /bin/sh \
registry:2 bin/registry garbage-collect --delete-untagged /etc/docker/registry/config.yml
在任何生产环境中使用它之前,请务必进行测试
--delete-untagged
。上次我查看代码时,我认为它对多平台图像过于激进。在某些时候,我想重写它以在运行的服务器上安全,并且可能只是在后台定期运行而不是作为单独的作业。