Docker容器启动执行SQL脚本遇权限拒绝问题求助
MySQL容器执行init.sql权限拒绝问题排查与解决
问题背景
使用如下docker-compose.yml配置挂载初始化脚本:
version: '3' services: mysql: image: mysql:8.0 volumes: - ./init.sql:/docker-entrypoint-initdb.d/init.sql environment: MYSQL_DATABASE: matcha MYSQL_ROOT_PASSWORD: 'password'
预期容器启动时自动执行init.sql构建数据库,但Docker日志持续报错:
/usr/local/bin/docker-entrypoint.sh: line 75: /docker-entrypoint-initdb.d/init.sql: Permission denied
进入容器查看,文件位置正确,权限显示为-rwxrwxrwx 1 root root 183 Dec 5 13:57 init.sql。
之后尝试用Dockerfile构建自定义MySQL镜像替代挂载卷:
FROM mysql:8.0 # Generate the init.sql script RUN echo "CREATE DATABASE matcha;" > /docker-entrypoint-initdb.d/init.sql RUN echo "CREATE TABLE matcha.user (id INT(11) NOT NULL AUTO_INCREMENT, name VARCHAR(255) NOT NULL, PRIMARY KEY (id));" >> /docker-entrypoint-initdb.d/init.sql # Make the init.sql script readable by the mysql user RUN chown mysql /docker-entrypoint-initdb.d/init.sql
但问题依然存在。补充:主机为非root用户,无法安装MySQL、添加用户,也无法在主机执行chown给mysql用户。
原因分析
挂载卷场景
容器内文件权限显示为777但仍报错,核心原因是主机层面的安全限制:
- 主机的
SELinux或AppArmor安全策略会阻止容器读取挂载的本地文件,即使容器内权限配置正确,主机的强制访问控制会拦截请求。 - 主机文件的
ACL规则可能限制了非所有者用户的访问,容器内的mysql用户对应主机的某个非root UID,无法绕过主机的权限限制。
Dockerfile构建场景
自定义镜像仍失败,大概率是MySQL初始化流程未触发:
MySQL容器仅在首次启动且无现有数据卷时才会执行docker-entrypoint-initdb.d下的脚本。如果之前启动过容器并保留了数据卷,后续启动会直接跳过初始化步骤,导致脚本未执行,看起来像是权限问题,但实际是流程未触发。
解决办法
针对挂载卷场景(主机非root)
开放主机文件的其他用户读权限
在主机执行:chmod o+r init.sql容器内的mysql用户对应主机的非root UID,开放其他用户读权限可让容器正常读取文件。
临时关闭SELinux(测试环境)
如果是Linux主机,执行:setenforce 0测试是否为SELinux导致,生产环境可添加SELinux规则允许容器访问挂载文件。
针对Dockerfile构建场景
清除旧数据卷,触发初始化流程
执行命令彻底删除旧容器和数据卷:docker-compose down -v然后重新构建启动:
docker-compose build && docker-compose up完善Dockerfile权限配置
在Dockerfile中同时设置文件所有者和可读权限,确保mysql用户能正常读取:FROM mysql:8.0 RUN echo "CREATE DATABASE matcha;" > /docker-entrypoint-initdb.d/init.sql \ && echo "CREATE TABLE matcha.user (id INT(11) NOT NULL AUTO_INCREMENT, name VARCHAR(255) NOT NULL, PRIMARY KEY (id));" >> /docker-entrypoint-initdb.d/init.sql \ && chown mysql:mysql /docker-entrypoint-initdb.d/init.sql \ && chmod 644 /docker-entrypoint-initdb.d/init.sql
内容的提问来源于stack exchange,提问作者Korkrane
相关产品推荐
相关产品推荐

