API是否确实不支持下载图像?有办法解决这个问题吗?
UPDATE 1:
我遇到了以下ServerFault帖子:
下载docker映像以传输到非互联网连接的计算机上
公认的解决方案使用
docker save
命令,这对我的情况没有帮助。但是那里发布的另一种解决方案引用了以下StackOverflow帖子:拉动docker镜像
那里的一种解决方案涉及称为docker-registry的命令行工具-debug,除其他外,它可以生成用于下载映像的
curl
命令。这是我得到的: user@host:~$ docker-registry-debug curlme docker ubuntu
# Reading user/passwd from env var "USER_CREDS"
# No password provided, disabling auth
# Getting token from https://index.docker.io
# Got registry endpoint from the server: https://registry-1.docker.io
# Got token: signature=1234567890abcde1234567890abcde1234567890,repository="library/docker",access=read
curl -i --location-trusted -I -X GET -H "Authorization: Token signature=1234567890abcde1234567890abcde1234567890,repository="library/docker",access=read" https://registry-1.docker.io/v1/images/ubuntu/layer
user@host:~$ curl \
-i --location-trusted -I -X GET \
-H "Authorization: Token signature=1234567890abcde1234567890abcde1234567890,repository="library/docker",access=read"
https://registry-1.docker.io/v1/images/ubuntu/layer
HTTP/1.1 404 NOT FOUND
Server: gunicorn/18.0
Date: Wed, 29 Nov 2017 01:00:00 GMT
Expires: -1
Content-Type: application/json
Pragma: no-cache
Cache-Control: no-cache
Content-Length: 29
X-Docker-Registry-Version: 0.8.15
X-Docker-Registry-Config: common
Strict-Transport-Security: max-age=31536000
所以很不幸,它看起来像生成的
curl
命令一样不起作用。更新2:
好像我可以从Docker Hub下载layer blob。这是我目前的处理方法。
获取授权令牌:
user@host:~$ export TOKEN=\
"$(curl \
--silent \
--header 'GET' \
"https://auth.docker.io/token?service=registry.docker.io&scope=repository:library/ubuntu:pull" \
| jq -r '.token' \
)"
提取图像清单并提取斑点总和:
user@host:~$ curl \
--silent \
--request 'GET' \
--header "Authorization: Bearer ${TOKEN}" \
'https://registry-1.docker.io/v2/library/ubuntu/manifests/latest' \
| jq '.'
下载单层斑点并将其写入文件:
user@host:~$ curl \
--silent \
--request 'GET' \
--header "Authorization: Bearer ${TOKEN}" \
'https://registry-1.docker.io/v2/library/ubuntu/manifests/latest' \
| jq -r '.fsLayers[].blobSum'
sha256:a3ed95caeb02ffe68cdd9fd84406680ae93d633cb16422d00e8a7c22955b46d4
sha256:be588e74bd348ce48bb7161350f4b9d783c331f37a853a80b0b4abc0a33c569e
sha256:e4ce6c3651b3a090bb43688f512f687ea6e3e533132bcbc4a83fb97e7046cea3
sha256:421e436b5f80d876128b74139531693be9b4e59e4f1081c9a3c379c95094e375
sha256:4c7380416e7816a5ab1f840482c9c3ca8de58c6f3ee7f95e55ad299abbfe599f
sha256:660c48dd555dcbfdfe19c80a30f557ac57a15f595250e67bfad1e5663c1725bb
将所有的blob和写入文件:
user@host:~$ BLOBSUM=\
"sha256:a3ed95caeb02ffe68cdd9fd84406680ae93d633cb16422d00e8a7c22955b46d4"
user@host:~$ curl \
--silent \
--location \
--request GET \
--header "Authorization: Bearer ${TOKEN}" \
"https://registry-1.docker.io/v2/library/ubuntu/blobs/${BLOBSUM}" \
> "${BLOBSUM/*:/}.gz"
下载所有清单中的层斑点:
user@host:~$ curl \
--silent \
--request 'GET' \
--header "Authorization: Bearer ${TOKEN}" \
'https://registry-1.docker.io/v2/library/ubuntu/manifests/latest' \
| jq -r '.fsLayers[].blobSum' > ubuntu-blobsums.txt
现在,我有很多层斑点,我需要将它们重新组合为图像-我想。
相关链接:论坛:Docker Hub API检索图像
Docker社区论坛:手动下载Docker Hub图像
Docker问题#1016:不使用docker命令获取Docker图像。例如使用wget
ServerFault:下载docker映像以传输到非互联网连接的计算机上
StackOverflow:下载docker映像以传输到非互联网连接的计算机上
StackOverflow:如何下载没有docker镜像的使用pull命令吗?
StackOverflow:有没有办法为没有Internet访问权限的机器下载没有“ docker pull”的docker hub镜像?
StackOverflow:Docker官方注册表(Docker Hub)URL
#1 楼
因此,事实证明Moby Project在Moby Github上有一个shell脚本,可以以可导入Docker的格式从Docker Hub下载映像:-v2.sh
脚本的用法语法由以下给出:
download-frozen-image-v2.sh target_dir image[:tag][@digest] ...
然后可以使用
tar
和docker load
:tar -cC 'target_dir' . | docker load
为了验证脚本是否按预期工作,我从Docker Hub下载了Ubuntu映像并将其加载到Docker中:
user@host:~$ bash download-frozen-image-v2.sh ubuntu ubuntu:latest
user@host:~$ tar -cC 'ubuntu' . | docker load
user@host:~$ docker run --rm -ti ubuntu bash
root@1dd5e62113b9:/#
实际上,我必须首先将数据从Internet客户端(未安装Docker)复制到目标/目标计算机(已安装Docker):
user@nodocker:~$ bash download-frozen-image-v2.sh ubuntu ubuntu:latest
user@nodocker:~$ tar -C 'ubuntu' -cf 'ubuntu.tar' .
user@nodocker:~$ scp ubuntu.tar user@hasdocker:~
,然后在目标主机上加载并使用映像:
user@hasdocker:~ docker load ubuntu.tar
user@hasdocker:~ docker run --rm -ti ubuntu bash
root@1dd5e62113b9:/#
评论
具有Internet连接的机器没有并且不能安装Docker。但是你应用了docker load
– 030
17年12月3日在15:11
@ 030只是为了测试/演示脚本是否有效以及可以将下载的图像数据导入Docker。实际上,我首先必须将数据复制到安装了Docker的计算机上。
–igal
17年12月3日在15:13
也许您可以添加该部分以进行澄清
– 030
17年12月3日在15:13
@ 030我添加了一个示例会话,说明了工作流在实际中的样子。
–igal
17年12月3日在15:20
#2 楼
有一个名为Skopeo的工具,可以从存储库中检索Docker映像并将其保存为多种格式。例如,下载映像并保存层作为tarball:
skopeo copy docker://ubuntu docker-archive:/tmp/ubuntu.tar:ubuntu
/tmp/ubuntu.tar传输到另一台计算机。
将图像加载到没有Internet连接的Docker实例上: br />它在CentOS 7存储库中以软件包名称
docker load --input /tmp/ubuntu.tar
提供。目前没有Debian或Ubuntu软件包(但很容易编译)。评论
FWIW现在有deb软件包:github.com/containers/skopeo/blob/master/install.md
–杰里米·戴维斯(Jeremy Davis)
20-09-18在23:05
#3 楼
感谢您的动力。我制作了Powershell版本的产品。 -scp工具到没有root或管理员权限的docker机器
https://gitlab.com/Jancsoj78/dockerless_docker_downloader
一个新的黑客工具:) br />
#4 楼
对我来说,您还不清楚要实现什么目标,以及为什么这些尝试不能解决问题。如果需要解决此问题,我需要@Tensibai和其他说明的问题,请首先在具有Internet连接的系统上执行docker pull,保存docker映像,将其复制到没有Internet连接的计算机上,加载该映像并运行它。演示
系统A上没有映像:
userA@systemA ~ $ docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
userA@systemA ~ $
从dockerhub中提取映像:
userA@systemA ~ $
docker pull nginx
Using default tag: latest
latest: Pulling from library/nginx
bc95e04b23c0: Pull complete
f3186e650f4e: Pull complete
9ac7d6621708: Pull complete
Digest: sha256:b81f317384d7388708a498555c28a7cce778a8f291d90021208b3eba3fe74887
Status: Downloaded newer image for nginx:latest
userA@systemA ~ $ docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
nginx latest 9e7424e5dbae 10 days ago 108MB
保存docker镜像:
userA@systemA ~ $ docker save nginx -o nginx.tar
将docker镜像复制到systemB并加载。
userB@systemB ~ $ docker load -i nginx.tar
cec7521cdf36: Loading layer 58.44MB/58.44MB
350d50e58b6c: Loading layer 53.76MB/53.76MB
63c39cd4a775: Loading layer 3.584kB/3.584kB
Loaded image: nginx:latest
userB@systemB ~ $ docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
nginx latest 9e7424e5dbae 10 days ago 108MB
评论
具有Internet连接的机器没有并且不能安装Docker。问题是寻求一种无需使用Docker客户端即可下载映像的方法。请参阅我的解决方案。
–igal
17年12月3日在15:03
#5 楼
这是一个经过修改的python脚本,因此具有独立于操作系统的解决方案:docker-drag像这样使用它,它将创建一个TAR归档文件,您可以使用docker load导入它: />
python docker_pull.py hello-world
python docker_pull.py alpine:3.9
python docker_pull.py kalilinux/kali-linux-docker
评论
如果关闭您的github帐户,则一无所有,如果可以共享它,则保留链接,但也请在此处粘贴脚本。您可以编辑答案,粘贴代码,然后选择它,然后在编辑器顶部栏中输入ctrl + K或{}(代码)按钮对其进行格式化。
–滕西拜
19年4月9日在13:16
我希望将代码粘贴到此处,但是它长100行,并且我认为它不可读。不过,您可以派生代码来保存自己的脚本副本。
–杜特兹
19-4-9在13:19
那不是我的意思,要有一个自我维持的答案,如果链接断开,您真的认为这可能会在几个月后帮助某人阅读此答案吗? (顺便说一句,答案的最大大小为30k个字符)
–滕西拜
19-4-9在13:39
#6 楼
如果您的公司有nexus或类似的存储库,则他们可能已经设置了nexus来满足您的需求。您可以尝试在相对的docker hub路径前面添加仓库的主机/ IP。示例:
docker pull nexus.example.com:18443/nginx
docker pull nexus.example.com:18443/selenium/node-chrome
docker pull nexus.example.com:18443/postgres:9.4
评论
“更具体地说,我想在没有(也不能)安装Docker客户端软件的受限环境中的机器上,从Docker Hub下载Docker映像。” =>那么在本机上放置图像有什么意义呢? (更简便的解决方法是使用数据透视主机,您可以在其中使用docker host从dockerhub提取docker,然后将docker save / docker推送到内部注册表)@Tensibai要将其复制到另一台具有Docker但无法访问Internet的计算机。
您是否看过docker pull代码?听起来可以通过基本的http调用构建类似的内容
@Tensibai我想我明白了。我也认为我从Docker社区获得了一个解决方案。我将在今天晚些时候返回并发布解决方案。
@Tensibai我发布了带有shell脚本的解决方案,可以解决问题。