docker - 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
.
配置似乎很简单,但我仍然无法配置它。
解决方案
看起来我误解了摘要更改时提取图像的目的。摘要校验和仅表明存在更新版本的图像,仅此而已。Terraform 不会更新任何东西(它只能将较新的版本下载到本地注册表),因为镜像的版本没有改变,只有 Docker 注册表中的摘要。换句话说,如果你想用更新版本的镜像更新你的服务,你必须更新镜像的版本,而不仅仅是更新现有版本,因为摘要会被发现,但服务不会更新.
推荐阅读
- javascript - 如何仅在循环的第一次迭代中创建一个空数组然后继续使用它?
- r - 在 R 的 for 循环中的 if else 语句中使用 grepl()
- java - 如何使用 java azure-storage-file-datalake 复制 Azure 存储文件/目录
- html - 如何将 div 放在标题的底部?
- python - Gtk 和 Python:使用 set_label 和线程的问题
- php - 图像拒绝出现在 Laravel
- postgresql - 不受支持的数据类型:自定义 Valuer 返回 nil 的 GORM 字段上的 &[] 错误?
- variables - 如何将隐藏在applescript字符串中的变量转换为可读变量?
- r - R dplyr/array demean 添加一列与 rowmeans
- javascript - 单击按钮时,在 JavaScript 中创建具有唯一 ID 的动态下拉列表