You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

在Jenkins Docker容器中执行terraform plan失败的问题排查

问题解决:Terraform无法连接Docker守护进程

问题根源

你的hashicorp/terraform:light容器里的127.0.0.1指向容器自身的localhost,而不是运行Docker daemon的jenkins-docker(docker:dind)容器。两个容器处于独立的网络命名空间,必须通过正确的网络地址访问。

解决方案步骤

1. 确认容器网络配置

确保jenkins-blueocean和jenkins-docker在同一个用户自定义网络中(按照官方教程,这个网络通常叫jenkins)。可以用以下命令验证:

docker network inspect jenkins | grep -E "Name|jenkins-"

如果不在同一网络,需要把jenkins-blueocean连接到该网络:

docker network connect jenkins jenkins-blueocean

2. 修改Jenkinsfile配置

在流水线的Docker代理配置中,加入网络参数,并传递DOCKER_HOST环境变量,让Terraform能找到正确的Docker daemon地址:

pipeline {
    agent {
        docker {
            image 'hashicorp/terraform:light'
            args '-i --entrypoint='
            network 'jenkins'  // 加入和jenkins-docker同网络的配置
            environment {
                DOCKER_HOST = 'tcp://jenkins-docker:2375/'  // 用容器名作为主机名访问dind
            }
        }
    }
    stages {
        stage('Hello') {
            steps {
                echo 'Hello World from Github.'
            }
        }
        stage('Test') {
            steps {
                sh 'ls -al'
                sh 'terraform --version'
                sh 'terraform init'
                sh 'terraform plan'
                sh 'ls -al'
            }
        }
    }
}

3. 简化main.tf的Docker Provider配置

因为已经通过环境变量DOCKER_HOST传递了地址,main.tf里可以去掉硬编码的host配置,让provider自动读取环境变量:

terraform {
  required_providers {
    docker = {
      source = "kreuzwerker/docker"
      version = "~> 2.13.0"
    }
  }
}

// 去掉硬编码的host,自动读取DOCKER_HOST环境变量
provider "docker" {}

resource "docker_image" "nginx" {
  name         = "nginx:latest"
  keep_locally = false
}

resource "docker_container" "nginx" {
  image = docker_image.nginx.latest
  name  = "tutorial"
  ports {
    internal = 80
    external = 8000
  }
}

可选:如果不想依赖环境变量

也可以直接在main.tf里指定正确的host地址(前提是容器在同一网络):

provider "docker" {
  host = "tcp://jenkins-docker:2375/"   
}

验证逻辑

  • jenkins-docker容器在jenkins网络中暴露了2375端口(未加密的Docker API端口)
  • hashicorp/terraform:light容器加入同一网络后,可以通过容器名jenkins-docker直接访问该端口
  • 环境变量DOCKER_HOST会被Terraform的Docker Provider自动识别,无需硬编码地址

内容的提问来源于stack exchange,提问作者Red Cricket

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.23 15:57:20