Terraform中docker_container的image属性.latest含义及旧镜像指定疑问
.latest字段的疑问解答 这里的.latest和Docker镜像的latest标签完全是两回事——它是Terraform的docker_image资源导出的一个属性字段,用来指向本地已拉取完成的镜像的唯一标识(可能是镜像ID,也可能是带Digest的完整镜像引用)。
为什么教程里都用docker_image.nginx.latest?
当你定义docker_image资源时,Terraform会帮你拉取指定的镜像(不管是latest标签,还是带Digest的特定旧版本),拉取完成后,这个资源会导出几个供其他资源引用的属性,.latest就是专门给docker_container用的本地镜像引用字段。它的作用是让Terraform准确关联到它管理的那个本地镜像实例,和你指定的镜像标签、Digest没有直接的命名关联。
为什么指定Digest后还是只能用.latest?
你尝试的docker_image.nginx:1.22.0@sha256:...是错误的Terraform语法——Terraform的资源引用格式是资源类型.资源名称.属性名,不能在资源引用后直接拼接标签或Digest。
当你在docker_image的name字段里指定了带Digest的镜像地址(比如nginx:1.22.0@sha256:xxx),Terraform会精准拉取这个特定版本的镜像,此时.latest属性指向的就是这个本地的旧版本镜像实例,所以docker_container通过docker_image.nginx.latest就能正确引用到你要的那个旧版本,不会拉错成latest标签的镜像。
验证.latest的实际值
你可以执行terraform show命令查看docker_image.nginx资源的属性,会发现.latest的值是类似nginx@sha256:f2dfca5620b64b8e5986c1f3e145735ce6e291a7dc3cf133e0a460dca31aaf1f或者镜像ID的字符串,这才是Docker实际识别的本地镜像标识,而非简单的标签名称。
内容的提问来源于stack exchange,提问作者BertC

