如何使用 CMD 在 docker 容器中运行 terraform apply --auto-approve
Posted
技术标签:
【中文标题】如何使用 CMD 在 docker 容器中运行 terraform apply --auto-approve【英文标题】:How to run terraform apply --auto-approve in docker container using CMD 【发布时间】:2021-08-01 05:40:45 【问题描述】:我正在尝试在我的 Windows 机器的 Docker 容器中运行 Terraform。 我实际上成功地在 Docker 容器中运行 Terraform。但是,我想运行命令 'terraform apply --auto-approve' 而不是普通的 'terraform apply',这样 terraform 就不会要求确认以应用更改。
我使用 AWS 作为提供商。 我有一个自己编写的 dockerfile,它使用 hashcorp/terraform:light 作为基础镜像。
以下是我的dockerfile:
# Use an official HashiCorp Terraform runtime as a base image.
FROM hashicorp/terraform:light AS base
#To create working directory.
WORKDIR /***wall-infra
# To add contents to the working directory.
ADD . /***wall-infra
# Copy the contents.
COPY . /***wall-infra
# To check the current version of Hashicorp Terraform.
# Use the base image to create a packaged image.
FROM base AS package
#To add to the working directory.
WORKDIR /root/.aws
# To copy the AWS credentials to root folder.
COPY ./Key/aws/config /root/.aws
COPY ./Key/aws/credentials /root/.aws
# Use the packaged image to create a final image.
FROM package AS final
#To add to the working directory.
WORKDIR /***wall-infra
# To Run Terraform init and initialize.
RUN terraform init
#RUN command inside the container.
CMD ["plan"]
CMD ["apply"]
上述 dockerfile 确实有效,但在作为 Docker 容器运行时会询问“是”/“否”以进行确认。 我想在某种程度上使用它:
#RUN command inside the container.
CMD ["apply", "--auto-approve"]
但它说这是一种无效的格式。猜猜dockerfile的CMD不能这样运行多个命令。
谁能提供一些见解并帮助我?
【问题讨论】:
apply
可以在不添加 terraform
的情况下工作吗,例如 CMD ["terraform", "apply", "-auto-approve"]
之类的东西?
我不这么认为。实际上,如果我们正常运行 Terraform,我们可以运行terraform apply -auto-approve
,但不要认为在容器内运行时会出现这种情况。当我按照您的建议运行上述内容时,出现以下错误:来自发件人的错误:无法匹配排除模式:模式中的语法错误
不看定义,我猜hashicorp/terraform
运行时容器将terraform
设置为它的入口点,所以你不需要将它包含在CMD 中。
您的问题与 terraform 自动应用无关 - 错误来自其他地方
嘿,我已经解决了这个问题。我会单独留下答案。
【参考方案1】:
您使用的是什么版本的 Terraform?我的版本 (0.14.8) 没有 --auto-apply
选项,我在网络上的其他任何地方都看不到它。我怀疑您打算使用-auto-approve
,它应该按照您尝试的方式工作:
# ...
# RUN command inside the container.
CMD ["apply", "-auto-approve"]
【讨论】:
对不起,我的错。我的意思是“terraform apply --auto-approve”(已在描述中进行了更正。谢谢)。因此,即使运行它,我也收到一条错误消息:“来自发件人的错误:无法匹配排除模式:模式中的语法错误”我确实尝试了每种命令组合。还是不行。 试过了:CMD ["apply", "-auto-approve"]
CMD ["apply", "--auto-approve"]
CMD ["apply --auto-approve"]
这些是我得到的以下错误。 1。 => 错误 [内部] 加载构建上下文 2。来自发件人的错误:无法匹配排除模式:模式中的语法错误。有没有办法自动批准应用命令?【参考方案2】:
我已在 docker 文件本身中使用“ENTRYPOINT”解决了该问题。简单的 'apply' 和 'plan' 在 Docker 文件中起作用的原因是,命令 terraform
在基础映像中设置为 'ENTRYPOINT'本身(即hashicorp/terraform
)。
考虑到这一点,我在文件系统中创建了一个名为“run”的文件(简单地创建了一个没有扩展名的文件),并在其中添加了命令 terraform plan
和 terraform apply --auto-approve
在 '.dockerignore' 文件中添加了新的代码行 'ENTRYPOINT /***wall-infra/run'
。因此,一旦Docker容器创建并运行,如果首先在文件系统中获取'run' shell文件并运行它,使'--auto-approve'
进入画面.
修改后的 Dockerfile:
.dockerignore(原版的最后一部分)
# Use the packaged image to create a final image.
FROM package AS final
#To add to the working directory.
WORKDIR /***wall-infra
# To Run Terraform init and initialize.
RUN terraform init
#RUN Terraform run command inside the container.
ENTRYPOINT /***wall-infra/run
运行(没有扩展名的文件,但在容器内仍像外壳文件一样)
terraform plan
terraform apply --auto-approve
这对我来说是一个新信息,我希望这对寻求答案的每个人都有用。
谢谢大家。
【讨论】:
以上是关于如何使用 CMD 在 docker 容器中运行 terraform apply --auto-approve的主要内容,如果未能解决你的问题,请参考以下文章
如何运行容器?- 每天5分钟玩转 Docker 容器技术(22)