Docker Entrypoint执行Shell脚本时的权限问题
解决MySQL容器初始化脚本Permission Denied问题
问题根源
MySQL官方镜像的docker-entrypoint.sh会以mysql用户身份执行/docker-entrypoint-initdb.d下的初始化脚本,而你创建的/mysql_server目录默认属于root用户,mysql用户没有该目录的写入权限,所以触发Permission denied错误。你exec进入容器时默认是root用户,所以能正常执行touch,这就是两者的核心差异。
可行解决方案
方案1:将文件创建到mysql用户有权限的目录
修改shell.sh,把文件创建到/tmp(所有用户都有读写权限的临时目录),或者MySQL默认的数据目录/var/lib/mysql(mysql用户拥有完整权限):
#!/bin/sh # 示例:在/tmp下创建文件 touch /tmp/test
方案2:修改/mysql_server目录的权限
在Dockerfile中添加命令,将/mysql_server的所有者改为mysql用户,确保该用户拥有写入权限:
FROM mysql:lts WORKDIR /mysql_server # 将目录所有者改为mysql用户 RUN chown mysql:mysql /mysql_server COPY shell.sh /docker-entrypoint-initdb.d RUN chmod u+x /docker-entrypoint-initdb.d/shell.sh
方案3:临时提升权限执行(不推荐)
如果必须在/mysql_server下创建文件,可以通过sudo提升权限,但需要额外安装sudo并配置免密,这种方式违反最小权限原则,谨慎使用:
FROM mysql:lts WORKDIR /mysql_server # 安装sudo并配置mysql用户免密执行 RUN apt-get update && apt-get install -y sudo \ && echo "mysql ALL=(ALL) NOPASSWD: ALL" >> /etc/sudoers COPY shell.sh /docker-entrypoint-initdb.d RUN chmod u+x /docker-entrypoint-initdb.d/shell.sh
对应的shell.sh:
#!/bin/sh sudo touch /mysql_server/test
推荐选择
优先使用方案1或方案2,方案1实现最简单,方案2更贴合你原本的目录规划需求。
内容的提问来源于stack exchange,提问作者MrLahey
相关产品推荐
相关产品推荐

