You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.15 11:57:45