我正在尝试构建一个docker映像,其中包含多个源repo所需的所有必要插件/提供程序,这样当自动terraform validate
运行时,就不必下载大量冗余数据。
然而,我认识到这提供了一个维护问题,因为有人可能会更新插件版本,这需要下载,因为docker图像不会包含它。
问题
- 我如何预下载所有提供程序和插件
- 告诉CLI使用这些预下载的插件,
- 还告诉它,如果它在本地找不到所需的内容,那么它可以转到网络
以下是相关文件:.terraformrc
plugin_cache_dir = "$HOME/.terraform.d/plugin-cache" disable_checkpoint = true provider_installation { filesystem_mirror { path = "$HOME/.terraform/providers" } direct { } }
tflint
(与此问题无关,但它显示在下面的Dockerfile中)
plugin "aws" { enabled = true version = "0.21.1" source = "github.com/terraform-linters/tflint-ruleset-aws" } plugin "azurerm" { enabled = true version = "0.20.0" source = "github.com/terraform-linters/tflint-ruleset-azurerm" }
Dockerfile
FROM ghcr.io/terraform-linters/tflint-bundle AS base LABEL name=tflint RUN adduser -h /home/jenkins -s /bin/sh -u 1000 -D jenkins RUN apk fix && apk --no-cache --update add git terraform openssh ADD .terraformrc /home/jenkins/.terraformrc RUN mkdir -p /home/jenkins/.terraform.d/plugin-cache/registry.terraform.io ADD .tflint.hcl /home/jenkins/.tflint.hcl WORKDIR /home/jenkins RUN tflint --init FROM base AS build ARG SSH_PRIVATE_KEY RUN mkdir /root/.ssh && \ echo "${SSH_PRIVATE_KEY}" > /root/.ssh/id_ed25519 && \ chmod 400 /root/.ssh/id_ed25519 && \ touch /root/.ssh/known_hosts && \ ssh-keyscan mygitrepo >> /root/.ssh/known_hosts RUN git clone git@mygitrepo:wrai/tools/wr-studio-installer.git RUN git clone git@mygitrepo:myproject/a.git && \ git clone git@mygitrepo:myproject/b.git && \ git clone git@mygitrepo:myproject/c.git && \ git clone git@mygitrepo:myproject/d.git && \ git clone git@mygitrepo:myproject/e.git && \ git clone git@mygitrepo:myproject/f.git RUN ls -1d */ | xargs -I {} find {} -name '*.tf' | xargs -n 1 dirname | sort -u | \ xargs -I {} -n 1 -P 20 terraform -chdir={} providers mirror /home/jenkins/.terraform.d RUN chown -R jenkins:jenkins /home/jenkins USER jenkins FROM base AS a COPY --from=build /home/jenkins/a/ /home/jenkins/a RUN cd /home/jenkins/a && terraform init FROM base AS b COPY --from=build /home/jenkins/b/ /home/jenkins/b RUN cd /home/jenkins/b && terraform init FROM base AS c COPY --from=build /home/jenkins/c/ /home/jenkins/c RUN cd /home/jenkins/c && terraform init FROM base AS azure_infrastructure COPY --from=build /home/jenkins/d/ /home/jenkins/d RUN cd /home/jenkins/d && terraform init FROM base AS aws_infrastructure COPY --from=build /home/jenkins/e/ /home/jenkins/e RUN cd /home/jenkins/e && terraform init