【问题标题】:Dockerized terraform and tfstateDockerized terraform 和 tfstate
【发布时间】: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 值来解决您的问题

标签: docker terraform


【解决方案1】:

我必须同意这里的 cmets。我鼓励你重新评估你从这个过程中获得的好处。

话虽如此,它导致冲突的原因是因为您试图从一个公共目录调用 2 个不同的工作区。您可以通过在进入容器时覆盖工作目录(请参阅https://docs.docker.com/engine/reference/run/#workdir)或简单地将目录更改为正确的上下文来避免这种情况。

我还建议您尝试使用不同工作区管理环境的替代方法。

  1. 不要使用文件夹来管理您的 IaC 环境。这会导致漂移,因为您的基础架构没有通用模板。
  2. 请使用单个工作区和变量来控制环境规范。 示例:编写您的模块,以便当您更改环境变量(var.stage 很流行)时,计划会根据您的要求进行更改。通常,环境应尽可能少地变化,数量、暴露和容量通常是可变配置。开发人员可能会在私有拓扑中部署 1 个具有 1 个内核和 1GB RAM 的 VM,但生产可能是具有 2 个内核和 4GB RAM 的 3 个 VM,具有额外的公共拓扑。你当然可以有更多的变化:开发可能在与应用程序相同的服务器上运行数据库进程以节省成本,但生产可能有一个专用的数据库实例。所有这些都可以通过更改单个变量、三元语句和插值来管理。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-06-26
    • 2019-12-08
    • 2019-06-04
    • 2019-05-16
    • 2021-06-26
    • 1970-01-01
    相关资源
    最近更新 更多