Terraform:Docker 提供商忽略图像摘要的更新

Terraform: Docker provider ignores update of image digest

我尝试通过 Terraform 配置我的 Docker 服务,当更新 Docker 图像并且新图像摘要在远程注册表中可用时,terraform apply 我希望 Terraform 检测摘要更新并更新 运行 服务。

我应用了 https://registry.terraform.io/providers/kreuzwerker/docker/latest/docs/resources/registry_image 中的配置,因此我的 Terraform 脚本如下所示:

(...)
data "docker_registry_image" "my-docker-image" {
  name = "my-registry/docker/my-image:2.263.3"
}

resource "docker_image" "docker-image" {
  name = data.docker_registry_image.my-docker-image.name
  pull_triggers = [data.docker_registry_image.my-docker-image.sha256_digest]
  keep_locally = true
}  
(...)

resource "docker_service" "my-service" {
  name = "my-service"

  task_spec {
    container_spec {
      image = data.docker_registry_image.my-docker-image.name
(...)

然后我执行 Terraform,可以清楚地看到来自远程注册表的摘要与 运行 容器中使用的摘要不同:

data.docker_registry_image.my-docker-image: Refreshing state... [id=sha256:d7aa8259d1503b970b14c66a06d144200d8f14a6c7f17d62cbfdad815309c9fb]

docker_image.my-docker-image: Refreshing state... [id=sha256:710bf0daf1b66543943dc086cfb3041000bb219aaf00ec75a8c18c770f4cb776my-registry/docker/my-image:2.263.3]

您可以看到两个摘要不同,但 Terraform 声称:

No changes. Infrastructure is up-to-date.

This means that Terraform did not detect any differences between your
configuration and real physical resources that exist. As a result, no
actions need to be performed.

这不是真的,因为 docker_registry_image 的摘要与 docker_image 的摘要不同。

配置看似简单,我还是配置不出来

看来我误会了digest变了拉取镜像的目的。摘要校验和只是表示图像有更新版本,没有别的。 Terraform 不会更新任何东西(它只能下载较新的版本到本地注册中心),因为图像的版本没有改变,只是 Docker 注册中心中的摘要。 换句话说,如果你想用更新版本的图像更新你的服务,你必须更新图像的版本,而不仅仅是更新现有版本,因为摘要会被发现,但服务不会更新.