Docker 对接地形和tfstate

Docker 对接地形和tfstate,docker,terraform,Docker,Terraform,我有这个docker容器来运行terraform 别名terraform='docker run-i-t-v~/.aws:/root/.aws:ro-v$(pwd):/app-w/app/rubendb/terraform:0.11.8' 只是官方地形图的复制品。没什么特别的 FROM golang:alpine MAINTAINER "HashiCorp Terraform Team <terraform@hashicorp.com>" ENV TERRAFORM_VERSION

我有这个docker容器来运行terraform

别名terraform='docker run-i-t-v~/.aws:/root/.aws:ro-v$(pwd):/app-w/app/rubendb/terraform:0.11.8'

只是官方地形图的复制品。没什么特别的

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"]
然后我有了下一个文件夹结构,它工作正常,因为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文件夹和其他内容

所以,如果我想运行相同的命令,但dev环境无法运行,因为它检测到和先前的.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文件夹,因为我刚刚在当前目录下设置了一个卷,它就看不到sharedmodules文件夹

你们如何让大家解决这个问题


谢谢

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

也就是说,它导致冲突的原因是您试图从一个公共目录调用两个不同的工作区。您可以通过在输入容器时重写工作目录(请参阅)或简单地将目录更改为正确的上下文来避免这种情况

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

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

    也就是说,它导致冲突的原因是您试图从一个公共目录调用两个不同的工作区。您可以通过在输入容器时重写工作目录(请参阅)或简单地将目录更改为正确的上下文来避免这种情况

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

  • 不要使用文件夹来管理您的IaC环境。这会导致漂移,因为您的基础架构没有通用模板
  • 请使用单个工作区和变量来控制环境规范。 示例:编写模块,以便在更改环境变量(var.stage很流行)时,更改计划以满足您的需求。通常情况下,环境变化应尽可能小,数量、暴露和容量通常是可变配置。开发人员可能会在私有拓扑中部署1个具有1核和1GB RAM的虚拟机,但生产可能是具有2核的3个虚拟机和具有额外公共拓扑的4GB RAM。当然,您可以有更多的变化:dev可以在与应用程序相同的服务器上运行数据库进程,以节省成本,但生产可能有一个专用的DB实例。所有这些都可以通过更改单个变量、三元语句和插值来管理
    Terraform已经作为静态链接的二进制文件分发,因此在容器中运行它并没有任何优势。他们正在使用的Dockerfile也确实需要成为一个多阶段构建。如果您将它用于Jenkins代理,那么它可能会有所帮助。我真的很期待避免手动安装terraform或使用brew。关于“brew安装terraform”没有什么太痛苦的,linux是一个带有可执行二进制文件的简单安装过程。如果您希望通过Terraform部署过程实现更多自动化,请查看Atlantis:(最近由Hashicorp收购)。@Rubendob不要使用基本golang映像,因为它包含许多构建依赖项。实际上,您下载的不止一个Terraform二进制文件。您可以使用不同的值来解决问题,因为每个工作空间的
    TF\u DATA\u DIR
    已作为静态链接的二进制文件分发,所以在容器中运行它并不会带来任何好处。他们正在使用的Dockerfile也确实需要成为一个多阶段构建。如果您将它用于Jenkins代理,那么它可能会有所帮助。我真的很期待避免手动安装terraform或使用brew。关于“brew安装terraform”没有什么太痛苦的,linux是一个带有可执行二进制文件的简单安装过程。如果您希望通过Terraform部署过程实现更多自动化,请查看Atlantis:(最近由Hashicorp收购)。@Rubendob不要使用基本golang映像,因为它包含许多构建依赖项。实际上,您下载的不止一个Terraform二进制文件。您可以使用每个工作区的
    TF\u DATA\u DIR
    的不同值来解决问题
    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