macOS Monterey下Docker Postgres容器启动失败,移除apt-get upgrade可恢复
问题现象
Docker Compose脚本在Windows10上可正常构建运行,但在macOS Monterey执行docker compose up --build时,postgres容器启动后立刻退出,报错如下:
The files belonging to this database system will be owned by user "postgres".
This user must also own the server process
initdb: error: invalid locale settings; check LANG and LC_* environment variables
排查过程
问题出在postgres服务的构建脚本db.Dockerfile中:
FROM postgres:14.4 RUN apt-get update -y -q && \ apt-get upgrade -y -q && \ apt-get install git -y -q
移除所有apt-get命令后,容器可正常启动;仅移除apt-get upgrade -y -q命令,容器也能正常运行。但业务需要安装git来克隆私有仓库中的数据库备份进行恢复,之前尝试直接设置LANG和LC_CTYPE环境变量无法解决问题。
原因分析
Postgres官方镜像的locale配置依赖Debian系统基础库,apt-get upgrade会更新系统locale相关组件,在macOS的Docker虚拟化环境下,这种更新会破坏容器初始化时的locale加载逻辑,导致initdb检测到无效的locale设置。而Windows环境下Docker的底层虚拟化机制不同,未触发该冲突。直接设置locale环境变量无效,是因为升级后的系统包覆盖了原有locale配置,容器初始化时无法正确加载指定的locale。
可行解决方案
方案1:保留Git安装,移除Upgrade命令(最简有效)
如果不需要升级系统包,直接去掉apt-get upgrade命令,同时清理apt缓存减小镜像体积:
FROM postgres:14.4 RUN apt-get update -y -q && \ apt-get install git -y -q && \ rm -rf /var/lib/apt/lists/*
方案2:强制修复Locale(需保留Upgrade时使用)
如果必须执行系统升级,需要在Dockerfile中明确生成并设置正确的locale:
FROM postgres:14.4 RUN apt-get update -y -q && \ apt-get upgrade -y -q && \ apt-get install -y -q git locales && \ # 生成UTF-8 locale echo "en_US.UTF-8 UTF-8" >> /etc/locale.gen && \ locale-gen en_US.UTF-8 && \ # 清理缓存 rm -rf /var/lib/apt/lists/* # 全局设置locale环境变量 ENV LANG=en_US.UTF-8 \ LC_ALL=en_US.UTF-8
额外提示
docker-compose.yaml中设置的POSTGRES_HOST: "localhost"对容器自身连接数据库无影响,但如果其他服务(如app)需要连接postgres,建议使用服务名postgres而非localhost,避免网络连接问题。
内容的提问来源于stack exchange,提问作者Ryan

