总结一下本文,docker引擎不是越多越好,此外阿里云的容器引擎加速可适用大多数情况。
docker引擎备份
仅使用阿里云
docker引擎备份,唯一使用的镜像地址是我的阿里云docker镜像加速地址,效果好(注意下面的阿里云镜像加速地址要替换成你自己的)。地址参考:阿里云容器镜像服务。
{
"builder": {
"gc": {
"defaultKeepStorage": "20GB",
"enabled": true
}
},
"experimental": false,
"registry-mirrors": [
"https://youraliyuncode.mirror.aliyuncs.com"
]
}
其它docker引擎备份
额外的镜像地址,某些地址会引起拉取镜像失败。
"https://registry.docker-cn.com",
"https://docker.mirrors.ustc.edu.cn",
"http://hub-mirror.c.163.com",
"https://cr.console.aliyun.com/",
"https://docker.registry.cyou",
"https://docker-cf.registry.cyou",
"https://dockercf.jsdelivr.fyi",
"https://docker.jsdelivr.fyi",
"https://dockertest.jsdelivr.fyi",
"https://mirror.aliyuncs.com",
"https://dockerproxy.com",
"https://mirror.baidubce.com",
"https://docker.m.daocloud.io",
"https://docker.nju.edu.cn",
"https://docker.mirrors.sjtug.sjtu.edu.cn",
"https://docker.mirrors.ustc.edu.cn",
"https://mirror.iscas.ac.cn",
"https://docker.rainbond.cc",
"https://alzgoonw.mirror.aliyuncs.com"
问题的由来
我尝试在dify中启用searXNG,需要执行命令:
docker run --rm -d -p 8081:8080 -v "${PWD}/api/core/tools/provider/builtin/searxng/docker:/etc/searxng" searxng/searxng
命令解读
这条docker run
命令是用来在Docker容器中启动一个服务(在这个情况下是SearXNG),并且配置了多个选项来控制容器的行为。下面是对每个参数的详细解读:
docker run
: 这是用于启动一个新的容器的Docker命令。--rm
: 当容器退出时,自动删除该容器。这有助于保持系统的整洁,避免留下停止但未删除的容器。-d
: 以分离模式(后台运行)启动容器。这意味着容器将在后台运行,而不是占用当前终端。-p 8081:8080
: 将主机的端口8081映射到容器内的端口8080。这意味着你可以通过访问主机上的8081端口来与容器内部运行的服务(监听在8080端口上)进行通信。-v "${PWD}/api/core/tools/provider/builtin/searxng/docker:/etc/searxng"
: 这是一个卷挂载选项,将主机上的目录${PWD}/api/core/tools/provider/builtin/searxng/docker
挂载到容器内的/etc/searxng
路径。这里${PWD}
代表当前工作目录的环境变量值,使得无论从哪个目录执行此命令,都会使用当前目录作为起点来寻找指定的本地路径。这个选项通常用于让容器能够访问主机文件系统中的特定配置或数据文件。searxng/searxng
: 指定了要使用的镜像名称。Docker会尝试从Docker Hub下载名为searxng/searxng
的最新版本镜像(如果你本地没有的话),然后基于这个镜像创建并启动新的容器。
总结来说,这条命令的作用是以分离模式在后台启动一个SearXNG服务的容器,它将主机的8081端口请求转发给容器内的8080端口,并且将当前目录下的api/core/tools/provider/builtin/searxng/docker
目录挂载到容器内的/etc/searxng
目录下,以便于配置和数据共享。同时,当容器停止时,它会自动被移除。
执行效果
可惜执行起来会报错:
Unable to find image 'searxng/searxng:latest' locally
docker: Error response from daemon: failed commit on ref "unknown-sha256:391a2ad1486f55c46728d4d466cad83fd3f44627222bd555c3c83bf2e1a39948": commit failed: "unknown-sha256:391a2ad1486f55c46728d4d466cad83fd3f44627222bd555c3c83bf2e1a39948" failed size validation: 7616 != 7293: failed precondition.
See 'docker run --help'.
报错解读
这个报错信息表明在尝试运行searxng/searxng:latest
镜像时,Docker遇到了几个问题:
找不到本地镜像:首先,错误信息中的第一行“Unable to find image ‘searxng/searxng:latest’ locally”表示你的系统中没有名为
searxng/searxng:latest
的Docker镜像。这意味着Docker将尝试从Docker Hub下载该镜像。下载或验证失败:接下来的部分指出,在尝试从Docker Hub下载该镜像或将下载的数据提交到本地存储库时发生了错误。“failed commit on ref…”这部分说明了具体的错误发生在尝试提交一个引用(即下载的镜像部分)到本地仓库的过程中。这里提到的
unknown-sha256:391a2ad1486f55c46728d4d466cad83fd3f44627222bd555c3c83bf2e1a39948
是一个SHA-256哈希值,用于唯一标识下载的数据块。校验和验证失败:更具体地,“failed size validation: 7616 != 7293”指出下载的数据块未能通过大小验证检查。这里的数字分别代表了实际下载的数据大小和预期的数据大小,它们不匹配,导致了“failed precondition”的错误。这种情况可能是因为网络问题、文件损坏或者Docker Hub上的镜像本身存在问题。
问题的解决
解决方案
尝试重新拉取镜像:首先尝试手动删除并重新拉取镜像,这可以解决由于网络问题或文件损坏导致的问题。
shell docker rmi searxng/searxng:latest docker pull searxng/searxng:latest
检查是否有特定版本标签可用:有时
latest
标签可能会有问题。你可以访问Docker Hub上的SearXNG页面查看并选择一个特定版本的标签来代替latest
使用。确保有足够的磁盘空间:确保你的系统上有足够的磁盘空间来下载和存储新的Docker镜像。
更新Docker:确保你正在使用的Docker是最新版本,因为旧版本可能存在已知的问题或bug。
如果上述步骤无法解决问题,可能是Docker Hub上的searxng/searxng:latest
镜像存在一些问题。在这种情况下,建议关注相关项目的公告或联系维护者获取更多信息。同时,也可以考虑在社区论坛或项目GitHub问题页面上寻求帮助。
尝试手动拉取
即使尝试手动拉取,也会报错:
所以问题明白了,本地没有镜像,自动执行拉取镜像时失败,理由是docker hub里最新镜像验证失败。
网络方法
网上给的方法是:
1、增加docker引擎镜像地址;
2、指定镜像版本。
我都试了,都没用。于是我想,是不是docker引擎镜像地址出错了,比如有一个有问题的地址在捣乱。。。于是我尝试仅保留我的阿里云镜像加速地址,那个相对可靠。
最终解决办法
果然,在将阿里云容器镜像加速地址作为唯一docker引擎地址后,镜像拉取非常顺利,问题解决。