如何一次运行多个terraform命令?

时间:2019-07-09 12:15:11

标签: terraform

Hashicorp在docker hub上有一个包含Terraform的docker映像:https://hub.docker.com/r/hashicorp/terraform

我可以将terraform项目安装为一个卷并在其上运行terraform init

docker run -it -v $(PWD):/tmp terraform:light init /tmp

但是我不能再运行其他任何terraform命令,因为terraform init必须先运行

docker run -it -v $(PWD):/tmp terraform:light apply /tmp

该命令返回:

  

需要重新初始化插件。请运行“ terraform init”。
  原因:无法满足插件要求。

有道理。

因此,如何运行多个terraform命令?我要先运行init,然后再运行apply

2 个答案:

答案 0 :(得分:1)

通过Docker作为单个命令运行sh -c 'terraform init && terraform apply'将满足您的需求。对于您的特定情况,默认情况下,您将需要使用--entrypoint标志来覆盖运行的terraform。设置--entrypoint=/bin/bash应该允许运行任意命令,前提是Docker容器中bash可用。

terragrunt可以在需要时自动执行terraform init,因此值得研究。

答案 1 :(得分:1)

terraform init命令初始化当前工作目录,以与给定的配置目录一起使用。在这种Docker方案中,给定的配置目录为/tmp,但当前的工作目录是容器本身内的目录,而不是从主机公开的目录。

您可以使用terraform init(或--workdir)选项来确保Terraform将已安装的卷都用作工作目录,而不是传递路径到-w。和配置目录,这是使用Terraform的最常见和最受支持的方式:

docker run -it -v ${PWD}:/tmp -w /tmp terraform:v0.12.3 init
docker run -it -v ${PWD}:/tmp -w /tmp terraform:v0.12.3 apply

话虽如此,Terraform的主要.zip发行档案只是一个可执行文件,应该易于提取并在大多数系统上运行,因此除非您进行集成,否则使用Docker的额外复杂性可能不值得与其他必须使用Docker的系统一起使用。直接运行Terraform可执行文件避免了在两个不同的文件系统之间以及潜在地(取决于您的系统配置)两个不同的操作系统等之间进行转换的需求。