如何使用 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 planterraform 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的主要内容,如果未能解决你的问题,请参考以下文章

如何将WebLogic服务器运行于Docker容器中

如何在一个Docker中同时运行多个程序进程?

如何运行容器?- 每天5分钟玩转 Docker 容器技术(22)

如何运行容器?- 每天5分钟玩转 Docker 容器技术(22)

如何在Docker容器中运行Nginx而不停止?

docker容器中的EntryPoint和CMD命令区别