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
。
答案 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可执行文件避免了在两个不同的文件系统之间以及潜在地(取决于您的系统配置)两个不同的操作系统等之间进行转换的需求。