我想从Docker Hub手动下载Docker映像。更具体地说,我想在没有(也不能)安装Docker客户端软件的受限环境中的机器上,从Docker Hub下载Docker映像。我以为可以使用官方API做到这一点,但事实并非如此-请参阅以下讨论:例如使用wget

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


评论

“更具体地说,我想在没有(也不能)安装Docker客户端软件的受限环境中的机器上,从Docker Hub下载Docker映像。” =>那么在本机上放置图像有什么意义呢? (更简便的解决方法是使用数据透视主机,您可以在其中使用docker host从dockerhub提取docker,然后将docker save / docker推送到内部注册表)
@Tensibai要将其复制到另一台具有Docker但无法访问Internet的计算机。

您是否看过docker pull代码?听起来可以通过基本的http调用构建类似的内容

@Tensibai我想我明白了。我也认为我从Docker社区获得了一个解决方案。我将在今天晚些时候返回并发布解决方案。

@Tensibai我发布了带有shell脚本的解决方案,可以解决问题。

#1 楼

因此,事实证明Moby Project在Moby Github上有一个shell脚本,可以以可导入Docker的格式从Docker Hub下载映像:
-v2.sh

脚本的用法语法由以下给出:

download-frozen-image-v2.sh target_dir image[:tag][@digest] ...


然后可以使用tardocker 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