使用Docker Compose启动Postgres容器时遇docker-entrypoint.sh权限拒绝
PostgreSQL容器启动权限错误(Docker Compose专属问题)
问题详情
使用Docker Compose部署PostgreSQL 16-alpine服务时,容器启动失败,抛出错误:
error: exec: "/usr/local/bin/docker-entrypoint.sh": stat /usr/local/bin/docker-entrypoint.sh: permission denied
服务配置文件docker-compose.yml:
db: restart: always image: postgres:16-alpine volumes: - ./postgresql:/var/lib/postgresql/data env_file: - ./.env
.env文件内容:
DB_ENGINE=django.db.backends.postgresql POSTGRES_HOST=db POSTGRES_DB=djangodb POSTGRES_PORT=5432 POSTGRES_USER=<some_user> POSTGRES_PASSWORD=<some_password>
已尝试但无效的操作:
- 移除卷绑定挂载
- 使用默认环境变量
- 强制以root用户运行容器
- 本地构建镜像并添加权限配置
单独执行docker run命令运行同一镜像可正常创建容器并进入shell,确认问题仅出现在Docker Compose部署场景。
解决方案
1. 清理环境变量冲突
.env文件中多余的变量可能干扰PostgreSQL入口脚本的执行,先简化.env内容,只保留PostgreSQL必需的变量:
POSTGRES_DB=djangodb POSTGRES_USER=<some_user> POSTGRES_PASSWORD=<some_password>
然后强制重建容器:
docker-compose up -d --force-recreate db
2. 修复本地挂载目录权限
本地绑定目录的权限可能被错误继承,导致容器内postgres用户无法访问。删除旧目录并重新创建:
rm -rf ./postgresql mkdir ./postgresql sudo chown 999:999 ./postgresql # PostgreSQL Alpine镜像默认使用uid=999的postgres用户
再启动服务:
docker-compose up -d db
3. 清除Docker Compose缓存
Docker Compose可能复用旧的容器状态,彻底清理后重新部署:
docker-compose down -v # 删除容器、卷及网络 docker-compose build --no-cache db docker-compose up -d db
4. 检查Docker Compose用户权限
尝试以sudo权限运行Docker Compose,排查是否是当前用户权限不足导致的问题:
sudo docker-compose up -d db
注:长期不建议用sudo运行,解决后需调整用户组权限(将当前用户加入docker组)。
5. 更新Docker Compose版本
旧版Docker Compose可能与新版PostgreSQL镜像存在兼容性问题,更新到最新稳定版:
# Linux系统更新命令示例 sudo curl -L "https://github.com/docker/compose/releases/latest/download/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose sudo chmod +x /usr/local/bin/docker-compose
内容的提问来源于stack exchange,提问作者Alberto Coppi
相关产品推荐
相关产品推荐

