Docker 码头工人。中断时如何继续下载图像?

Docker 码头工人。中断时如何继续下载图像?,docker,Docker,断开连接后,如何恢复pull?每次断开连接后运行docker pull some image时,pull过程总是从头开始。我的连接非常不稳定,即使下载一个100MB的图像也需要很长时间,每次几乎都会失败。所以,我几乎不可能画出更大的图像。那么,如何恢复拉取过程呢?更新: pull过程现在将根据已下载的层自动恢复。这是通过以下方式实现的 旧版: 还没有恢复功能。但是,docker的下载管理器实现了这一功能。试试这个 ps-ef | grep docker 获取所有docker pull命令的PID

断开连接后,如何恢复
pull
?每次断开连接后运行
docker pull some image
时,
pull
过程总是从头开始。我的连接非常不稳定,即使下载一个100MB的图像也需要很长时间,每次几乎都会失败。所以,我几乎不可能画出更大的图像。那么,如何恢复拉取过程呢?

更新:

pull
过程现在将根据已下载的层自动恢复。这是通过以下方式实现的

旧版:

还没有
恢复
功能。但是,docker的下载管理器实现了这一功能。

试试这个

ps-ef | grep docker

获取所有
docker pull
命令的PID,并对其执行
kill-9
。一旦被杀死,重新发出
docker pull:
命令


这对我有用

Docker的代码没有github上开发库中的moby更新得那么快。多年来,人们一直存在与此相关的问题。我曾尝试手动使用几个补丁程序,但这些补丁程序还没有在上游,没有一个能正常工作

moby的github存储库(docker的开发报告)有一个名为download-freeze-image-v2.sh的脚本。这个脚本通过命令行使用bash、curl和其他类似于JSON解释器的东西。它将检索docker令牌,然后将所有层下载到本地目录。然后,您可以使用“docker load”插入本地docker安装

不过,它与简历不太匹配。它在脚本中有一些关于“curl-C”不起作用的评论。我已经找到并解决了这个问题。我做了一个修改,最初使用“.headers”文件进行检索,在我进行监视时,该文件始终返回302,然后使用curl(+resume support)对层tar文件进行检索。它还必须在调用函数上循环,该函数检索有效令牌,不幸的是,该令牌仅持续约30分钟

它将循环此过程,直到收到416,说明由于其范围已满足,因此不可能恢复。它还根据curl头检索来验证大小。我已经能够检索所有必要的图像使用这个修改后的脚本。Docker有更多与检索相关的层,并且有远程控制过程(Docker客户端),这使得控制更加困难,他们认为这个问题只会影响一些连接不良的人

我希望这个脚本能像帮助我一样帮助你:

变化: fetch_blob函数将临时文件用于其第一个连接。然后,它从该数据库检索30x HTTP重定向。它尝试在最终url上检索标头,并检查本地副本是否包含完整文件。否则,它将开始恢复卷曲操作。传递有效令牌的调用函数有一个循环,用于检索令牌和fetch_blob,以确保获得完整文件

唯一的其他变化是带宽限制变量,可在顶部设置,或通过“BW:10”命令行参数设置。我需要这一点,以使我的连接能够用于其他操作

单击此处查看修改后的脚本

在未来,如果docker的内部客户端能够正确地执行恢复操作,那就太好了。增加令牌验证的时间量将非常有帮助

更改代码的简要视图:

#loop until FULL_FILE is set in fetch_blob.. this is for bad/slow connections
            while [ "$FULL_FILE" != "1" ];do
                local token="$(curl -fsSL "$authBase/token?service=$authService&scope=repository:$image:pull" | jq --raw-output '.token')"
                fetch_blob "$token" "$image" "$layerDigest" "$dir/$layerTar" --progress
                sleep 1
            done
fetch_blob的另一部分:

while :; do
            #if the file already exists.. we will be resuming..
            if [ -f "$targetFile" ];then
                #getting current size of file we are resuming
                CUR=`stat --printf="%s" $targetFile`
                #use curl to get headers to find content-length of the full file
                LEN=`curl -I -fL "${curlArgs[@]}" "$blobRedirect"|grep content-length|cut -d" " -f2`

                #if we already have the entire file... lets stop curl from erroring with 416
                if [ "$CUR" == "${LEN//[!0-9]/}" ]; then
                    FULL_FILE=1
                    break
                fi
            fi

            HTTP_CODE=`curl -w %{http_code} -C - --tr-encoding --compressed --progress-bar -fL "${curlArgs[@]}" "$blobRedirect" -o "$targetFile"`
            if [ "$HTTP_CODE" == "403" ]; then
                #token expired so the server stopped allowing us to resume, lets return without setting FULL_FILE and itll restart this func w new token
                FULL_FILE=0
                break
            fi

            if [ "$HTTP_CODE" == "416" ]; then
                FULL_FILE=1
                break
            fi

            sleep 1
        done

这与当前docker稳定版本上的Ctrl-C有什么不同吗?这可能允许您在不重新下载已完成的层的情况下提取图像,但此Q是关于在暂停之前仅部分下载的层上恢复下载。
Ctrl-C
在我的终端上终止了docker会话,但我仍然可以看到一些与docker相关的僵尸进程。我的回答更侧重于一种更干净的方法来重新绘制图像。我不知道这为什么会被否决。对我来说不起作用。也不起作用:保留挂起的终端,打开另一个终端,然后再次发出命令。这导致了一个相同的状态,除了第一个挂起的两个下载外,所有下载都已完成,第二个仍然挂起。像wget这样的简历部分下载真是太好了。我假设维护sha哈希是为了验证完整性。我正在建立一个虚拟的“开发工作站”作为docker镜像,一些团队成员正在乡下的蜂窝调制解调器上工作,他们在800meg层上度过了一段艰难的时光。虽然最初用于通过光纤连接的服务器云,“TheStreet发现了它自己对事物的用途”,但最终可能演变为一种操作系统内核,用于在工作站和其他设备上运行虚拟化应用程序。您的评论可能会在github讨论中带来更多好处。