【问题标题】:Get docker image digest / hash from within the container从容器中获取 docker 图像摘要/哈希
【发布时间】:2018-08-24 15:38:40
【问题描述】:

我知道可以访问 docker api 并且以下命令可以正常工作:
curl -s --unix-socket /var/run/docker.sock http:/v1.24/containers/$HOSTNAME/json | jq -r '.Image'

但是,我真的很想避免将 docker.sock 暴露给容器本身,因为它是 CI 构建的一部分。有没有其他方法可以在不暴露docker.sock 并向其发出curl 请求的情况下从容器本身中检索容器映像ID/哈希(即2acdef41a0c)?

可能类似于这里显示的 Docker, how to get container information from within the container

【问题讨论】:

  • 如果你在 gitlab-ci 你有这些变量可用docs.gitlab.com/ce/ci/variables/README.html
  • 如果您需要获取图像哈希,您可以在启动时使用 ENV 变量将其传递给 docker 容器
  • 它通过 Docker Swarm 插件在 Jenkins 中运行。你会在--env 中传递什么?
  • 我的意思是,如果它是一个 shell 命令,你可以执行 docker images ... 并解析哈希,但在我的情况下,我只有一个字段,我可以在其中手动添加 --env 未执行的参数通过 bash/shell AFAIK。 (github.com/jenkinsci/docker-swarm-plugin)
  • 我明白了,如果你在 CI 中,你可以在构建时将它传递给 ENV 文件

标签: docker jenkins docker-swarm


【解决方案1】:

与@Shayk 响应相同,但使用 docker SDK (python) https://docker-py.readthedocs.io/

import docker
....
client = docker.from_env()
image_name = "ubuntu:bionic"
image_id = str(client.images.get(image_name).id).split(":")[1][:12]

container = client.containers.run(image_name, 
    network = "host",
    environment=[f"IMAGE_ID={image_id}",f"IMAGE_NAME={image_name}"],
    detach=True)

【讨论】:

    【解决方案2】:

    这会在容器内设置 IMAGE 环境变量:

    docker run --rm -it -e IMAGE=$(docker images ubuntu:bionic --format {{.ID}}) ubuntu:bionic
    

    【讨论】:

    • 有趣的想法,但这确实不适用于 CI 服务器,因为容器是由 CI 服务器提供的,您不能“只”执行上面的命令。即使可以,这也意味着您需要为使用的每个图像创建大量的代理模板,这是不切实际的。
    【解决方案3】:

    在容器内运行的以下命令应为您提供容器 ID 或 docker 映像哈希 - cat /proc/self/cgroup | head -n 1 | cut -d '/' -f3 | cut -c 1-12

    【讨论】:

    • 这只给出容器 id 而不是图像 id/hash(你可以用docker images 看到):)
    • 你是对的@tftd,我想我误解了这个问题
    猜你喜欢
    • 2019-08-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-12
    • 2023-01-25
    • 1970-01-01
    • 2018-01-20
    相关资源
    最近更新 更多