Dockerized terraform和tfstate

时间:2018-09-19 17:59:41

标签: docker terraform

我有这个docker容器来运行terraform。

alias terraform ='docker run -i -t -v〜/ .aws:/root/.aws:ro -v $ {pwd):/ app -w / app / rubendob / terraform:0.11.8'< / p>

只是官方地形图像的副本。没有什么花哨。

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/

工作正常,但是容器创建了.terraform文件夹,其中包含tfstate和其他内容。

因此,如果我想运行相同的命令但无法进入开发环境,则无法运行,因为它可以检测到先前的.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文件夹,因为我只是将卷设置为当前目录,则无法看到共享模块文件夹。

你们如何解决这个问题?

谢谢!

1 个答案:

答案 0 :(得分:2)

我必须同意这里的评论。我鼓励您重新评估您从此过程中获得的收益。

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

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

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