gpt4 book ai didi

Dockerized terraform 和 tfstate

转载 作者:行者123 更新时间:2023-12-02 20:46:33 26 4
gpt4 key购买 nike

我有这个 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 文件夹,因为我只是为当前目录设置了一个卷,所以它无法看到共享模块文件夹。

你们如何解决这个问题?

谢谢!

最佳答案

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

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

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

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

    26 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com