在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
相关产品推荐
相关产品推荐

