如何将 docker 注册表设置为只读(以便安全地进行垃圾收集)?

问题描述 投票:0回答:2

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 docker-registry
2个回答
1
投票

抱歉,我没有足够的代表来发表评论。

为了补充优秀的BMitch's答案,我想指出我必须使用

-e REGISTRY_STORAGE_MAINTENANCE_READONLY="{\"enabled\":true}"
按照建议此处启用只读模式。


1
投票

有一个只读配置选项,因此您可以使用以下命令重新启动注册表:

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
。上次我查看代码时,我认为它对多平台图像过于激进。在某些时候,我想重写它以在运行的服务器上安全,并且可能只是在后台定期运行而不是作为单独的作业。

© www.soinside.com 2019 - 2024. All rights reserved.