自动获取Docker镜像ID的Bash命令

3

我尝试在我的Linux机器上运行一些docker命令:

1- sudo docker load -i test.tar
2- sudo docker tag bf46cff9b182 test:v1.0
3- sudo docker run -it --network host -v /home/logs:/home/test/test/logs test:v1.0

但是我想要一次性创建runme.sh并执行所有命令。问题在于,镜像ID bf46cff9b182 每次都会动态改变。因此,我需要从load命令的输出中以某种方式将其传递给pipe,这实际上是可能的。

load命令的输出如下:

Loaded image ID: sha256:bf46cff9b1829b50e28f6485c923efff94799dd84cbf747dc86f6e5d006f2a81

在Linux上,它显示为:

4f512fb4b0ea: Loading layer  5.079MB/5.079MB
Loaded image ID: sha256:b6c3df68a9365ccb0935a835aa332b29db780cb7e81eac83acf717b2                                                                             de779073

并且在sha256后的12个字符将是bf46cff9b182,这将是我在上述第二条命令中插入的图像ID。

我该如何编写一个bash命令来自动执行此操作?


顺便提一下,将自己添加到“docker”组中,这样您就不必一直使用“sudo docker”了。如果您仍然需要root权限,那么容器的意义何在呢? - tripleee
我对Docker很新,请问我该怎么做? - Tina J
2
在Debianish平台上,执行sudo adduser "$USER" docker,其中$USER是您自己的帐户名称。然后,您可以执行exec sg docker加入该组,或者注销并重新登录。其他平台可能有类似的安排,但细节可能会有所不同。 - tripleee
是的,看起来在我的CentOS上有所不同。谢谢,我会解决的! - Tina J
1
https://docs.docker.com/install/linux/linux-postinstall/ 有一些指示。 https://www.projectatomic.io/blog/2015/08/why-we-dont-let-non-root-users-run-docker-in-centos-fedora-or-rhel/ 看起来表明在 RPM 平台上默认情况下未启用此功能。 - tripleee
3个回答

4
这是一个简单的 sed 脚本,用于提取 sha256。
docker load -i test.tar |
sed -n 's/^Loaded image ID: sha256:\([0-9a-f]*\).*/\1/p'

现在可以将其捕获到变量中,或使用 xargs 进行管道传递:
docker load -i test.tar |
sed -n 's/^Loaded image ID: sha256:\([0-9a-f]*\).*/\1/p' |
xargs -i docker tag {} test:v1.0

好的。但你能发布一个完整的答案吗?结合另一个答案?res=$(sudo docker load -i test.tar | sed -n 's/^Loaded image ID: sha256://p') id=${res:0:12} - Tina J
1
没有必要将其缩减为仅前12个字符。您可以缩写,但不是必需的。如果您想要,使用 sed -nE 's/^Loaded image ID: sha256:([0-9a-f]{12}).*/\1/p' 轻松地将其缩减为12个字符(尽管这并不完全可移植)。 - tripleee
那个 p 会一直到一个空格吗?如果你看到上面,会有一些额外的字符串跟在长哈希码后面。 - Tina J
1
哎呀,这很奇怪。已更新。docker load -q 命令可以清除冗余内容吗? - tripleee
1
是的,xargs -i sudo docker tag ... 但也许更好的解决方案是 sudo ./yourscript 并将 sudo 从脚本本身中去掉?(我有些犹豫;另一方面,你不必要地想在 sudo 下运行代码。) - tripleee
显示剩余2条评论

2
你可以将id存储在一个变量中,然后在下一个命令中使用。原始答案:“最初的回答”。
res=$(docker load ...)
id=${res:25:12}
docker tag $id ...

这段代码从偏移量25(我希望我数对了)开始获取一个长度为12的子字符串。
编辑: 我发现,你甚至不需要使用sed以“干净”的方式提取哈希值。
res=$(docker load ...)
hash=${res##*sha256:}
id=${hash:0:12}
docker tag $id ...

你能用 grep 让它更干净吗?!也许找到 sha256: 并获取其后的12个长度。我在想那里可能有一些额外的行。 - Tina J
好的。我更新了我的问题。在Linux上输出略有不同。如果您能发布一个基于sedawk的答案,那就可以了。 - Tina J

0

来自docker load文档:

它可以恢复图像和标签。

因此,在执行docker save之前,您可以直接使用图像原本具有的标签。


2
保存时,它已经有标签和名称。但是在加载后,它会更改为 <none> - Tina J
1
这是因为使用 IMAGE-ID 进行保存是不明确的。使用 REPOSITORY:TAG 进行保存,两者都将被保留。 - Stiefel

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接