Docker Compose挂载脚本执行提示Permission Denied问题排查
问题原因及解决方案
核心原因
出现Permission denied的常见原因有两个:
- 宿主机上的
run_code.sh文件缺少执行权限(x权限),挂载到容器后权限会被继承,导致无法直接执行。 - RabbitMQ镜像默认以
rabbitmq普通用户运行,若挂载的脚本或其父目录权限设置限制了该用户的读取/执行权限,也会触发权限错误。
具体解决步骤
1. 给宿主机的脚本添加执行权限
在Azure VM的Ubuntu终端中执行以下命令,为本地的run_code.sh添加执行权限:
chmod +x ./cmd/run_code.sh
这个操作会让脚本在容器内也继承到执行权限,直接执行/etc/cmd/run_code.sh就不会报错。
2. 若仍报错,改用bash读取脚本内容执行
如果宿主机无法修改脚本权限(比如文件来自只读存储),可以绕过执行权限检查,让bash直接读取脚本内容并执行:
修改docker-compose中的command字段:
command: bash -c 'cat /etc/cmd/run_code.sh | bash'
这种方式只需要脚本有**读取权限(r权限)**即可,不需要执行权限。
3. 检查容器内目录权限(可选)
如果以上操作仍无效,可临时进入容器检查/etc/cmd目录和脚本的权限:
docker-compose exec rabbitmq bash # 进入容器后执行 ls -l /etc/cmd/run_code.sh ls -ld /etc/cmd
确认rabbitmq用户对该文件和目录有至少读取权限,若没有,可在宿主机调整挂载目录的权限,或者在docker-compose中添加user: root以root用户运行容器(注意:生产环境不建议长期用root运行)。
内容的提问来源于stack exchange,提问作者Giacomo Sachs
相关产品推荐
相关产品推荐

