Mac OS运行docker-compose up时出现Permission denied错误求助
问题根因
你在Dockerfile构建阶段给脚本添加的执行权限被docker-compose的bind mount挂载覆盖了:
你配置的volumes规则
./:/usr/src/app会将本地主机的当前目录完整挂载到容器内的/usr/src/app路径,直接覆盖了构建阶段COPY到容器内的所有文件,因此你在Dockerfile里执行的chmod +x修改仅作用于构建时的临时容器文件,实际运行时用的是本地未添加执行权限的脚本文件,所以权限报错会持续存在。
解决方案
你可以选择任意一种适配你场景的方案:
- 方案1(开发环境首选,操作最简单)
直接在本地主机的项目目录下执行命令给对应脚本添加执行权限即可:
执行后重启docker-compose服务,挂载进去的脚本本身就具备执行权限,报错即可解决。chmod +x docker/api/wait-for-postgres.sh docker/api/start.sh - 方案2(无需修改本地文件权限)
修改docker-compose.yml的command配置,显式用sh解释器执行脚本,不依赖脚本本身的执行权限:command: [ "sh", "docker/api/wait-for-postgres.sh", "postgres", "sh", "docker/api/start.sh" ] - 方案3(生产环境适用)
删除docker-compose.yml中volumes里的./:/usr/src/app挂载规则,直接使用Dockerfile构建阶段复制到容器内的文件,此时你在Dockerfile中配置的chmod +x权限会正常生效。
补充注意事项
如果后续运行Node服务时仍有文件读写权限报错,是因为官方node镜像默认运行用户为node,和本地挂载文件的UID/GID不匹配导致的,可以在docker-compose的api服务配置中添加user: root临时以root用户运行容器解决,或者在构建镜像时统一容器内运行用户和本地文件的UID/GID即可。
内容的提问来源于stack exchange,提问作者Louis Charles
相关产品推荐
相关产品推荐

