Strapi连接Docker部署PostgreSQL提示用户密码认证失败
问题根因
核心错误是PostgreSQL容器的数据卷挂载路径配置错误:
官方postgres:alpine镜像默认的数据库数据存储路径为/var/lib/postgresql/data,你当前docker-compose.yml中把持久化卷挂载到了/data路径,完全没有覆盖数据库实际的存储目录。
PostgreSQL镜像的初始化逻辑(读取POSTGRES_USER/POSTGRES_PASSWORD/POSTGRES_DB环境变量创建用户、库、设置密码)仅在数据目录为空、容器首次启动时执行一次。挂载路径错误会导致两个结果:
- 你配置的
strapibase用户和对应密码根本没有被正确持久化,容器实际使用的是内部文件系统中残留的初始数据,和你配置的账号密码不匹配 - 哪怕你多次重启容器,因为初始化逻辑不会重复执行,密码错误的问题会一直存在,这也是pgAdmin和Strapi连接都报密码认证失败的原因
你能通过docker exec进入容器仅代表容器进程正常运行,不代表数据库初始化配置符合预期。
修复步骤
- 停止当前运行的容器,删除无效的旧数据卷,避免错误数据残留:
注意参数docker compose down -v-v会删除该compose项目关联的所有docker卷,之前存的无效数据会被清空,必须执行这一步否则旧的错误配置会残留。- 修改docker-compose.yml中的卷挂载配置,将路径替换为PostgreSQL官方镜像要求的正确路径,修改后的db服务配置如下:
version: '3.3' services: db: image: postgres:alpine networks: - strapi-app-network volumes: - db-data:/var/lib/postgresql/data ports: - "5432:5432" environment: POSTGRES_DB: strapibase POSTGRES_USER: strapibase POSTGRES_PASSWORD: strapibase volumes: db-data: networks: strapi-app-network: driver: bridge- 重新启动数据库服务,等待首次初始化完成:
启动后等待10~15秒,让PostgreSQL完成初始化流程,此时容器会自动读取环境变量创建对应账号、密码和数据库,数据会正确持久化到挂载的卷中。docker compose up -d db- 验证连接后启动Strapi
先用pgAdmin连接127.0.0.1:5432,账号密码填strapibase/strapibase,连接成功后再到Strapi项目目录执行yarn run develop即可正常启动。
- 验证连接后启动Strapi
补充说明:如果后续你把Strapi服务也放到同一个docker-compose编排、加入同一个bridge网络,Strapi配置里的数据库host不要填
localhost,要填compose里的数据库服务名db,容器内部网络通过服务名做DNS解析。如果你是在宿主机直接跑yarn develop连映射到宿主机的5432端口,填localhost是正常可用的。
内容的提问来源于stack exchange,提问作者Samke11
相关产品推荐
相关产品推荐

