从容器内访问图像哈希


Accessing the image hash from within the container

是否可以从容器内访问用于创建容器的图像的哈希id ?我想提供一个"签名版本"在每个页面的底部从一个php应用程序运行在一个容器。

我想一种方法是使用环境变量从docker组成文件:

environment:
      - IMAGE_HASH=${IMAGE_HASH}

,然后使用包装器脚本首先将IMAGE_HASH=ABC123写入.env文件,然后再运行docker-compose up。该脚本可以检查图像以获取哈希ID。

但是我想知道是否有一种"适当的"方法来做到这一点?因此在撰写文件中输入如下内容:

environment:
    - IMAGE_HASH=this.imagehash

目前还没有合适的方法。有些人要求在容器中包含某种类型的元数据,但这需要更改运行时规范,然后运行时需要更新到新的规范。

也没有简单的方法在构建时包含它,因为如果您试图在带有图像摘要的图像中设置环境变量,则会在哈希逻辑中产生循环。设置该变量会修改映像配置,从而更改映像配置的摘要,从而更改清单的摘要,即您的映像摘要。

所以你最多只能在运行时用你在容器创建过程中设置的文件或环境变量来做这些。我不知道有什么预定义的变量可以帮助解决这个问题。

也许最好的方法是为图像摘要获取一个服务模板,但这可能很复杂,因为compose可能指向一个尚未被提取的图像,所以你最终会将注册表逻辑添加到compose中,而docker可能希望将其分开。也可以部署没有被推送到注册表的图像,这意味着你必须在docker中做摘要逻辑,而且由于该摘要是在一个字节数组上,从清单的json导出,它开始变得复杂(改变字段顺序或空白改变摘要而不改变导入的json,所以你进入规范json问题)。

如果您正在寻找只是读取容器的唯一值,有一个环境变量已经存在于每个容器:HOSTNAME,也许这就是您正在寻找的?

例如,我在PHP站点的一些HTML模板中使用这个,以确保我在刀片模板中下载了最新的CSS或JS副本:

<link rel="stylesheet" href="/css/global.css?_={{ $_ENV['HOSTNAME'] }}"/>

其他的答案指出了为什么它是困难的。

在这个问题中已经有一个解决方法。另一个可能的解决方法:

在构建时根据随机散列(或时间戳或某些组合)向映像中添加环境变量。哈希可以在构建开始时创建,并且应该保证只使用一次。

这个自创建的哈希id可以从运行的容器内部访问。

缺点是,你需要在自己创建的哈希和docker的哈希id之间创建和使用一个引用表。

您甚至可以用自己创建的哈希id标记图像。由于可能有多个标记,因此应该不会产生任何问题。根据使用的工作流程,标签可以提供帮助。