自定义PostgreSQL镜像Docker Run未启动,手动Start正常原因咨询
自定义PostgreSQL镜像启动失败问题分析与解决
问题根源
官方PostgreSQL镜像的初始化入口脚本(entrypoint)需要以root权限完成一系列前置操作:比如设置数据目录的权限、初始化系统配置项,最终才切换到postgres用户启动数据库服务。
你的Dockerfile里提前执行了USER postgres,直接切换到非root用户运行容器,导致初始化脚本无法执行那些需要root权限的步骤,启动流程中途失败,容器直接退出,所以docker container ls看不到运行中的容器。
而手动执行docker start my-database时,第一次启动失败后,数据目录已经完成了部分初始化,后续启动不再需要走完整的初始化流程,因此能正常启动。
修复方案
删除Dockerfile中多余的USER postgres和WORKDIR /行,修改后的Dockerfile如下:
FROM postgres:11.9-alpine COPY ddl/*.sql /docker-entrypoint-initdb.d/
重新构建并运行容器:
docker build -t my-postgres:1.0.0 -f Dockerfile . docker run -d --name my-database \ -e POSTGRES_PASSWORD=abc123 \ -p 5432:5432 \ my-postgres:1.0.0
额外说明
官方PostgreSQL镜像默认以root用户启动,入口脚本会自动完成权限配置和用户切换,完全不需要手动指定USER postgres,强行切换反而会破坏原有启动逻辑。
内容的提问来源于stack exchange,提问作者VeryNiceArgumentException
相关产品推荐
相关产品推荐

