【发布时间】:2018-09-23 00:18:03
【问题描述】:
我有这个 docker 容器来运行 terraform。
别名 terraform='docker run -i -t -v ~/.aws:/root/.aws:ro -v $(pwd):/app -w /app/rubendob/terraform:0.11.8'
只是官方 terraform 图像的副本。没有什么花哨。
FROM golang:alpine
MAINTAINER "HashiCorp Terraform Team <terraform@hashicorp.com>"
ENV TERRAFORM_VERSION=0.11.8
RUN apk add --update git bash openssh
ENV TF_DEV=true
ENV TF_RELEASE=true
WORKDIR $GOPATH/src/github.com/hashicorp/terraform
RUN git clone https://github.com/hashicorp/terraform.git ./ && \
git checkout v${TERRAFORM_VERSION} && \
/bin/bash scripts/build.sh
RUN rm -rf /var/lib/apt/lists/*
WORKDIR $GOPATH
ENTRYPOINT ["terraform"]
所以我这样称呼:
alias terraform='docker run -i -t -v ~/.aws:/root/.aws:ro -v $(pwd):/app -w /app/ rubendob/terraform:0.11.8'
然后我有了下一个文件夹结构,它工作正常,因为 ups,我决定在 dev 文件夹中运行一些 terraform 的东西。
ls -ls tf
total 0
0 drwxr-xr-x 3 ruben.ortiz staff 96 15 sep 23:43 dev
0 drwxr-xr-x 6 ruben.ortiz staff 192 11 sep 19:53 modules
0 drwxr-xr-x 4 ruben.ortiz staff 128 15 sep 12:39 prod
我像这样运行容器
terraform plan tf/prod/
工作正常,但容器创建了带有 tfstate 和其他内容的 .terraform 文件夹。
因此,如果我想运行相同的命令,但开发环境根本无法运行,因为它检测到以前的 .terraform 文件夹
ls -lisah tf/.terraform/
total 8
901814 0 drwxr-xr-x 5 ruben.ortiz staff 160B 15 sep 12:38 .
885805 0 drwxr-xr-x 6 ruben.ortiz staff 192B 15 sep 23:54 ..
901815 0 drwxr-xr-x 15 ruben.ortiz staff 480B 16 sep 00:05 modules
901821 0 drwxr-xr-x 3 ruben.ortiz staff 96B 10 sep 23:02 plugins
901819 8 -rw-r--r-- 1 ruben.ortiz staff 567B 16 sep 18:43 terraform.tfstate
如果我进入 dev 文件夹,因为我只是为当前目录设置了一个卷,所以它无法看到共享模块文件夹。
你们如何解决这个问题?
谢谢!
【问题讨论】:
-
Terraform 已经作为静态链接的二进制文件分发,因此在容器中运行它并没有真正带来任何优势。他们使用的 Dockerfile 也确实需要成为多阶段构建。如果您将它用于 Jenkins 代理,那么它可能会有所帮助。
-
我真的很期待避免手动安装 terraform 或使用 brew。
-
没有什么太痛苦的:'brew install terraform' 和 linux 是一个带有可执行二进制文件的简单安装过程。如果您希望通过 Terraform 部署过程实现更多自动化,请查看 Atlantis:runatlantis.io(最近被 Hashicorp 收购)。
-
@Rubendob 不使用基本的 golang 映像,因为它包含很多构建依赖项。您实际上正在下载多个 Terraform 二进制文件。您也许可以为每个工作区使用不同的
TF_DATA_DIR值来解决您的问题