错误原因分析
- SELinux 安全模块限制:CentOS 系统默认启用 SELinux,会限制容器对某些目录的访问权限。
- Docker 权限不足:容器缺少执行初始化脚本所需的权限。
解决方案
方法一:添加特权模式(好使)
在 docker-compose.yml 中为容器添加 --privileged 参数,赋予容器 root 权限:
services:
your_service:
image: your_image
privileged: true # 添加此行
volumes:
- ./initdb.d:/docker-entrypoint-initdb.d
注意:使用特权模式存在安全风险,建议仅在测试环境中使用。
方法二:修改 SELinux 配置
临时禁用 SELinux(重启后失效):
setenforce 0
永久禁用 SELinux(需重启系统):
vi /etc/selinux/config # 将 SELINUX=enforcing 改为 SELINUX=disabled
方法三:检查目录权限
确保主机目录权限正确:
chmod 755 ./initdb.d
并在 docker-compose.yml 中正确映射:
volumes: - ./initdb.d:/docker-entrypoint-initdb.d:ro # 添加只读权限
验证步骤
- 修改
docker-compose.yml后,执行docker-compose down清理旧容器。 - 重新启动服务:
docker-compose up -d。 - 检查日志:
docker-compose logs。
其他建议
- 若问题持续,升级 Docker 版本至 20.10.9+(如 CentOS 7)。
- 确认
docker-entrypoint-initdb.d目录下文件格式正确(如.sh或.sql)。
优先推荐方法一(添加特权模式),若需长期解决方案,建议方法二(禁用 SELinux)。