如何阻止Terraform执行init操作时自动升级provider版本?
问题根因
- 你使用的
-get=false参数仅用于禁止Terraform下载、更新Terraform模块,完全不控制provider的拉取逻辑,所以无法阻止provider升级。 - 你挂载的本地main.tf未添加aws provider的严格版本约束,Terraform默认会匹配符合兼容性要求的最新可用版本,即便本地存在旧版provider也会尝试拉取最新版。
- 你虽然将provider二进制放到了
/bin目录,但未显式告知Terraform优先从该路径查找插件,Terraform默认会先查询远端registry的版本信息。
解决方法
方案1:添加严格版本约束
在挂载的main.tf(或同目录新增versions.tf)中添加如下配置,严格锁死aws provider版本:terraform { required_providers { aws = { source = "hashicorp/aws" version = "=3.55.0" } } }版本号前的
=表示必须严格匹配该版本,不允许使用更高版本。方案2:指定插件查找目录
执行init命令时添加-plugin-dir参数,强制Terraform仅从你预存provider的/bin目录查找插件,完全不会请求远端registry:terraform init -get=false -plugin-dir=/bin方案3:镜像全局配置(一劳永逸)
构建镜像时新增如下配置,后续运行容器无需额外加参数、修改挂载的tf文件:- 设置全局环境变量:
TF_PLUGIN_CACHE_DIR=/bin - 预生成对应版本的
.terraform.lock.hcl依赖锁文件,放到镜像的默认工作目录 - 可选开启
TF_CLI_ARGS_init="-plugin-dir=/bin",给init命令设置默认参数
- 设置全局环境变量:
注意事项
- 执行init命令时不要加
-upgrade参数,该参数会强制忽略本地已有版本和锁文件配置,直接拉取符合版本约束的最新版provider。 - 如果本地项目目录已存在
.terraform.lock.hcl文件,需确保文件内记录的aws provider版本为v3.55.0,且哈希校验值和你预装的二进制匹配,否则Terraform会判定本地插件不合法,重新拉取远端版本。
内容的提问来源于stack exchange,提问作者grayaii
相关产品推荐
相关产品推荐

