泊坞窗。中断后如何恢复下载图像?

时间:2016-02-10 12:47:19

标签: docker

断开连接后如何恢复pull?每次在断开连接后再次运行pull时,docker pull some-image进程始终从头开始。我的连接非常不稳定,即使只下载100MB图像也需要很长时间,而且每次都会失败。所以,我几乎不可能拉出更大的图像。那么,我该如何恢复拉动过程?

3 个答案:

答案 0 :(得分:10)

<强>更新

pull进程现在将根据已下载的图层自动恢复。这是通过https://github.com/moby/moby/pull/18353实现的。

<强>旧

还没有resume功能。但是,使用docker的下载管理器可以实现discussions此功能。

答案 1 :(得分:2)

Docker的代码不像github上的开发库中的moby那样更新。人们多年来一直在与此有关的问题。我曾尝试手动使用一些尚未在上游的补丁程序,但都无法正常工作。

moby的github存储库(码头工人的开发仓库)有一个名为download-frozen-image-v2.sh的脚本。该脚本通过命令行使用bash,curl和其他诸如JSON解释器的功能。它将检索docker令牌,然后将所有层下载到本地目录。然后,您可以使用“ docker load”插入本地docker安装。

尽管它与履历表并不太好。它在脚本中与“ curl -C”不起作用有关。我已经找到并解决了这个问题。我进行了一个修改,该修改使用“ .headers”文件进行初始检索,在进行监视时,该文件始终返回302,然后使用curl(+恢复支持)将最终结果检索到图层tar文件。它还必须在调用函数上循环,该函数检索一个有效的令牌,不幸的是,令牌只能持续30分钟左右。

它将一直循环执行此过程,直到收到416声明该范围已达到而无法恢复为止。它还针对卷毛头检索来验证大小。我已经能够使用此修改后的脚本检索所有必要的图像。 Docker具有更多与检索有关的层,并具有远程控制过程(Docker客户端),这使得控制变得更加困难,他们认为此问题仅影响某些处于不良连接状态的人。

我希望这个脚本能对您有所帮助:

更改: fetch_blob函数使用一个临时文件进行首次连接。然后从中检索30x HTTP重定向。它尝试对最终URL进行标头检索,并检查本地副本是否具有完整文件。否则,它将开始恢复卷曲操作。向其传递有效令牌的调用函数具有围绕检索令牌的循环,以及确保获取完整文件的fetch_blob。

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

单击here以获取修改后的脚本。

将来,如果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

答案 2 :(得分:-3)

试试这个

ps -ef | grep docker

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

这对我有用!