Terraform搭建Docker+PostgreSQL时遇密码认证及容器初始化错误
解决Terraform部署Docker PostgreSQL时的密码认证与初始化错误
问题根源分析
- Docker容器环境变量格式错误:PostgreSQL容器的
POSTGRES_PASSWORD环境变量误用冒号:而非等号=,导致容器无法识别超级用户密码,触发初始化失败。 - 模块间缺乏依赖控制: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
相关产品推荐
相关产品推荐

