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

Terraform搭建Docker+PostgreSQL时遇密码认证及容器初始化错误

解决Terraform部署Docker PostgreSQL时的密码认证与初始化错误

问题根源分析

  1. Docker容器环境变量格式错误:PostgreSQL容器的POSTGRES_PASSWORD环境变量误用冒号:而非等号=,导致容器无法识别超级用户密码,触发初始化失败。
  2. 模块间缺乏依赖控制:PostgreSQL Provider模块会在Docker容器完全启动前尝试连接数据库,此时数据库尚未就绪,引发密码认证失败错误。

分步解决方案

1. 修复Docker容器的环境变量配置

修改modules/docker/main.tf中的env数组,修正密码变量格式并移除无效环境变量:

variable "name" {
  default = "postgres"
}

terraform {
  required_providers {
    docker = {
      source  = "kreuzwerker/docker"
      version = "2.19.0"
    }
  }
}

provider "docker" {
  host = "unix:///var/run/docker.sock"
}

resource "docker_image" "postgres" {
  name = "postgres:latest"
}

resource "docker_container" "postgres" {
  image    = docker_image.postgres.latest
  name     = var.name
  restart  = "always"
  hostname = var.name
  # 修正环境变量格式,移除无效的host/port变量
  env = [
    "POSTGRES_USER=postgres",
    "POSTGRES_PASSWORD=123456"
  ]
  ports {
    internal = 5432
    external = 5432
  }
}

2. 添加模块间依赖确保执行顺序

在root.tf的PostgreSQL模块调用中添加depends_on,确保Docker容器完全启动后再执行数据库配置:

module "docker" {
  source = "./modules/docker"
  name   = "postgres"
}

module "postgres" {
  source = "./modules/postgres"
  name   = "postgres"
  # 添加依赖,等待Docker容器部署完成
  depends_on = [module.docker]
}

3. 优化PostgreSQL Provider的连接配置(可选)

延长连接超时时间,避免容器启动后数据库尚未就绪导致的连接失败:
修改modules/postgres/main.tf中的provider配置:

variable "name" {
  default = "postgres"
}

terraform {
  required_providers {
    postgresql = {
      source  = "cyrilgdn/postgresql"
      version = "1.16.0"
    }
  }
}

provider "postgresql" {
  alias           = "pg1"
  host            = "localhost"
  port            = 5432
  username        = "postgres"
  password        = "123456"
  sslmode         = "disable"
  connect_timeout = 30 # 延长超时时间至30秒
}

resource "postgresql_database" "mutualfunds" {
  provider = postgresql.pg1
  name     = "mutualfunds"
}

验证修复效果

执行以下命令重新部署:

terraform init
terraform apply

此时Docker容器会正常初始化PostgreSQL数据库,Terraform的PostgreSQL模块也会在容器就绪后成功连接并创建目标数据库。

内容的提问来源于stack exchange,提问作者Abdulsalam Almahdi

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.25 17:33:25