首页 > 解决方案 > Terraform:Docker 提供者忽略了图像摘要的更新

问题描述

我尝试通过 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.

这不是真的,因为摘要 fromdocker_registry_image不同于docker_image.

配置似乎很简单,但我仍然无法配置它。

标签: dockerterraformdocker-swarm

解决方案


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


推荐阅读