如何在同一个GitLab Job中同时使用Docker和Terraform完成资源部署
GitLab单Job同时使用Docker和Terraform的实现方案
方案1:使用预装双工具的基础镜像
- 优先选择同时内置
docker和terraform的公共CI基础镜像,也可以自行构建专属镜像,示例Dockerfile如下:
# 以docker官方镜像为基础 FROM docker:latest # 安装依赖及terraform RUN apk add --no-cache wget unzip gnupg lsb-release RUN wget -O- https://rpm.releases.hashicorp.com/RPM-GPG-KEY-hashicorp | gpg --dearmor | tee /usr/share/keyrings/hashicorp-archive-keyring.gpg RUN echo "deb [signed-by=/usr/share/keyrings/hashicorp-archive-keyring.gpg] https://apt.releases.hashicorp.com $(lsb_release -cs) main" | tee /etc/apt/sources.list.d/hashicorp.list RUN apk add --update terraform
将构建好的镜像推送到私有/公共镜像仓库后,直接在GitLab Job的image字段配置该镜像即可。
若需要用到Docker-in-Docker(DinD) 能力,需要额外在Job中配置
services字段启用docker:dind服务,同时配置DOCKER_HOST环境变量为tcp://docker:2376。
方案2:运行时动态安装缺失工具
- 无需提前维护镜像,直接选择其中一个工具的官方镜像作为Job基础镜像,在
before_script阶段安装另一个工具即可,示例CI配置如下:
deploy-resources: image: docker:latest # 启用DinD服务 services: - docker:dind variables: DOCKER_HOST: tcp://docker:2376 DOCKER_TLS_CERTDIR: "/certs" before_script: # 安装terraform - apk add --no-cache wget unzip - wget https://releases.hashicorp.com/terraform/1.9.5/terraform_1.9.5_linux_amd64.zip - unzip terraform_1.9.5_linux_amd64.zip - mv terraform /usr/local/bin/ # 验证两个工具都可用 - docker --version - terraform --version script: # 执行业务逻辑 - docker pull your-custom-image:latest - terraform init - terraform apply -auto-approve
- 该方案灵活性高,可随时调整工具版本,缺点是每次Job运行都会重复执行安装步骤,会增加数秒到数十秒的运行耗时。
方案3:拆分为多Job串行执行
- 如果不想在单个镜像内集成两个工具,可以拆分为两个串行Job,通过CI产物传递数据:
- 第一个Job使用
docker官方镜像,完成镜像拉取、打包、导出等操作,将需要传递的配置、镜像tar包等存为GitLab CI artifacts - 第二个Job使用
terraform官方镜像,通过dependencies字段拉取前一个Job的产物,执行资源部署逻辑
- 第一个Job使用
内容的提问来源于stack exchange,提问作者akshit
相关产品推荐
相关产品推荐

