用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