【问题标题】:Bash get docker image ID automaticallyBash 自动获取 docker 镜像 ID
【发布时间】:2019-02-06 22:24:48
【问题描述】:

我正在尝试在我的 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 并一次性执行所有操作。问题是 ImageID 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,这将是我在上面的命令 #2 中插入的图像 ID。

如何编写 bash 命令自动执行此操作?

【问题讨论】:

  • 顺便说一句,将自己添加到docker 组,这样您就不必一直使用sudo docker。如果您无论如何都必须是 root,那么容器的意义何在?
  • 我是 docker 新手。我该怎么做?
  • 在 Debianish 平台上,sudo adduser "$USER" docker 其中$USER 是您自己的帐户名。然后您可以exec sg docker 加入群组,或退出并重新登录。其他平台可能有类似的安排,但可能在细节上有所不同。
  • 是的,在我的 centos 上看起来不一样。会解决的谢谢!
  • docs.docker.com/install/linux/linux-postinstall 有一些说明。 projectatomic.io/blog/2015/08/… 似乎表明在 RPM 平台上默认情况下不启用此功能。

标签: linux bash docker awk docker-image


【解决方案1】:

这是一个简单的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}
  • 无需将其缩减为仅前 12 个字符。允许但不需要缩写。如果您愿意,使用sed -nE 's/^Loaded image ID: sha256:([0-9a-f]{12}).*/\1/p' 可以轻松修剪到 12 个字符(尽管这不是完全可移植的)。
  • 那个p 直到一个空格?如果您在上面看到,在长哈希码之后有一些额外的字符串。
  • 哎呀,这很奇怪。更新。 docker load -q 能摆脱谷壳吗?
  • 是的,xargs -i sudo docker tag ... 但也许更好的解决方案是sudo ./yourscript 并将sudo 保留在脚本本身之外? (我分裂了;另一方面,您想在sudo 下不必要地运行代码。)
【解决方案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 个长度。我想知道那里可能有一些额外的行。
  • 好的。我更新了我的问题。 Linux 上的输出略有不同。如果您可以发布基于sedawk 的答案,它会起作用。
【解决方案3】:

来自docker load 文档:

它恢复图像和标签。

因此,您可以只使用图像在执行 docker save 之前的标记。

【讨论】:

  • 保存的时候已经有标签和名字了。但是加载后,变成<none>
猜你喜欢
  • 1970-01-01
  • 2022-11-30
  • 1970-01-01
  • 2017-08-26
  • 2019-07-08
  • 2022-01-14
  • 2022-01-21
  • 1970-01-01
  • 2019-01-24
相关资源
最近更新 更多