1Panel
1Panel copied to clipboard
[BUG]拉取 Docker 镜像时的镜像名校验应支持 digest 格式
联系方式
No response
1Panel 版本
v1.10.11-lts
问题描述
当前检测应该是单纯判定字符和长度,这样的话虽然能快速完成需求,但是实际上并不严谨,比如说 digest 格式的就不支持。
重现步骤
ghcr.io/heiher/hev-socks5-tunnel@sha256:20ee3ad45fde6253b9b090000eb2c51131133199b45686b8ddaa9e6cddc4b5aa
期待的正确结果
期望能改进为正则匹配的实现,避免因域名长度、其他小众格式等原因造成的人为限制。
我按照官方的定义( https://docs.docker.com/reference/cli/docker/image/tag/ )尝试写了一个:
^(?:(?:[a-zA-Z0-9-]+?\.)*[a-zA-Z0-9-]+?(?::[0-9]{1,5})?/)?(?:[a-zA-Z0-9-]+?/)*[a-zA-Z0-9-]+?(?::[a-zA-Z0-9_.-]{1,128}|@sha256:[0-9a-f]{64})?$
主要分为三个部分:
(?:(?:[a-zA-Z0-9-]+?\.)*[a-zA-Z0-9-]+?(?::[0-9]{1,5})?/)? // 可选的 host 部分,其中的 port也是可选部分
(?:[a-zA-Z0-9-]+?/)*[a-zA-Z0-9-]+? // 镜像名部分,因为官方说实际上不一定只有NAMESPACE/REPOSITORY这样的两级,所以对于路径分级不做限制
(?::[a-zA-Z0-9_.-]{1,128}|@sha256:[0-9a-f]{64})? // 镜像版本部分,支持 tag 格式和 digest 格式
当然,上面对于 host、port、path、tag 的格式都没有做细致限制,比如说大部分名字都不能以-开头,端口应该在65535内等,如果完善这些限制的话,表达式会过于复杂。
相关日志输出
No response
附加信息
No response
虽然换成正则其实也相当于是换成了另一个人为限制,最终还是会受限于开发者对于名称合法性的认知。
感谢反馈,上述功能会在后续版本优化。
这里取消了 @ 字符并且增加长度限制,交给 docker 自己进行校验,后端 docker 拉镜像的时候会默认先对格式进行校验
v1.10.14-lts 版本已发布。