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