用Docker为ARM64平台准备Terraform运行环境

首先

为了能够在不污染本地环境的情况下轻松执行 Terraform,我们使用 Docker 构建了可执行环境。然而,目前 HashiCorp 公司提供的 Terraform Docker 镜像只能在 x86_64(amd64)架构下运行。

当我进行调查时,发现了许多关于使用Alpine Linux的文章,但要使用Terraform的最新版本,必须使用Alpine Linux Edge版本,或者需要花费一些时间来安装新版本,因为无法控制各种各样的问题,所以我自己编写了Dockerfile并配置了执行环境。

 

获取 PGP 公钥

首先,从HashCorp公司的网页上获取PGP公钥。
将获取的PGP公钥放置在Dockerfile的相同位置(在本例中是存储库根目录)。

 

创建 Dockerfile

我会准备一个类似以下的 Dockerfile。

FROM alpine:3.15.0

ENV TERRAFORM_VERSION=1.2.4

RUN apk add --no-cache curl gnupg

WORKDIR /tmp

COPY hashicorp.asc /tmp/hashicorp.asc
RUN gpg --import hashicorp.asc && \
    rm hashicorp.asc

RUN case $(uname -m) in \
         "x86_64")  TERRAFORM_CPU_ARCH=amd64 ;; \
         "aarch64")  TERRAFORM_CPU_ARCH=arm64 ;; \
    esac && \
    curl -Os https://releases.hashicorp.com/terraform/${TERRAFORM_VERSION}/terraform_${TERRAFORM_VERSION}_linux_${TERRAFORM_CPU_ARCH}.zip && \
    curl -Os https://releases.hashicorp.com/terraform/${TERRAFORM_VERSION}/terraform_${TERRAFORM_VERSION}_SHA256SUMS && \
    curl -Os https://releases.hashicorp.com/terraform/${TERRAFORM_VERSION}/terraform_${TERRAFORM_VERSION}_SHA256SUMS.sig && \
    gpg --verify terraform_${TERRAFORM_VERSION}_SHA256SUMS.sig terraform_${TERRAFORM_VERSION}_SHA256SUMS && \
    grep terraform_${TERRAFORM_VERSION}_linux_${TERRAFORM_CPU_ARCH}.zip terraform_${TERRAFORM_VERSION}_SHA256SUMS | sha256sum -c && \
    unzip terraform_${TERRAFORM_VERSION}_linux_${TERRAFORM_CPU_ARCH}.zip && \
    mv terraform /usr/local/bin/ && \
    chmod +x /usr/local/bin/terraform && \
    rm -f terraform_${TERRAFORM_VERSION}_linux_${TERRAFORM_CPU_ARCH}.zip && \
    terraform version

WORKDIR /app

ENTRYPOINT ["/usr/local/bin/terraform"]

重點是`case $(uname -m) in`這部分。
它用於判定執行Docker build的主機CPU架構並動態切換取得的檔案。

RUN case $(uname -m) in \
         "x86_64")  TERRAFORM_CPU_ARCH=amd64 ;; \
         "aarch64")  TERRAFORM_CPU_ARCH=arm64 ;; \
    esac

如果在预先构建 Docker 镜像并将其推送到 Docker Hub 或其他环境中的情况下,您可以按照以下方式从 ${TARGETPLATFORM} 获取目标 CPU 架构,并使用 docker buildx 进行构建,而不是使用 docker build。

RUN case ${TARGETPLATFORM} in \
         "linux/amd64")  TINI_ARCH=amd64  ;; \
         "linux/arm64")  TINI_ARCH=arm64  ;; \
         "linux/arm/v7") TINI_ARCH=armhf  ;; \
         "linux/arm/v6") TINI_ARCH=armel  ;; \
         "linux/386")    TINI_ARCH=i386   ;; \
    esac

创建 docker-compose.yml 文件

由于每次执行docker命令都很麻烦,因此我将创建一个docker-compose.yml文件。创建后,您可以使用”docker compose run –rm terraform”命令来运行。

version: "3"
services:
  terraform:
    build: .
    volumes:
      - ./:/app/terraform

参考文献

    • https://www.terraform.io/downloads

 

    • https://github.com/BretFisher/multi-platform-docker-build

 

    https://docs.docker.com/engine/reference/builder/#automatic-platform-args-in-the-global-scope
广告
将在 10 秒后关闭
bannerAds