执行docker exec操作容器时出现Permission denied报错如何解决
报错根因
权限拒绝问题的核心是命令解析逻辑出了问题,和容器内用户权限无关:
- 原命令中
docker exec的生效范围仅到printf语句段,末尾的>> /proc/1/fd/1是由宿主机的bash解析执行的,本质是尝试在宿主机上往宿主机1号进程的标准输出写内容,普通用户无操作权限自然报错 - 之前添加
--user appuser参数仅能修改容器内执行命令的用户身份,完全不影响宿主机侧的重定向逻辑,因此调整后依然无法生效
实现方案
方案1:零额外配置的最简实现
docker exec执行命令产生的所有标准输出,默认就会被Docker采集接入对应容器的日志流,完全不需要手动操作容器内的/proc文件描述符,直接执行以下命令即可:
docker exec --workdir /app my-container printf 'NEW VERSION UPLOADED %s\n' "$(printenv VERSION)"
执行后打印的版本通知会直接出现在docker logs my-container的输出结果中,满足日志通知需求。
方案2:需直接写入容器内/proc路径的场景
如果有特殊要求必须往容器内/proc/1/fd/1写入内容,需要将完整执行逻辑(包含重定向动作)传入容器内的shell执行,避免宿主机提前解析重定向:
docker exec --workdir /app --user root my-container sh -c 'printf "NEW VERSION UPLOADED %s\n" "$VERSION" >> /proc/1/fd/1'
执行注意事项:
- 必须用
sh -c包裹完整执行语句,确保重定向逻辑在容器内部解析 - 容器内
/proc/1/fd/1默认仅root用户有写入权限,因此需要指定--user root执行,使用普通业务用户(比如之前的appuser)依然会触发权限报错 - 如果需要读取容器内的VERSION环境变量,注意使用单引号包裹
sh -c后的执行语句,避免变量在宿主机侧提前展开。
内容的提问来源于stack exchange,提问作者Seura
相关产品推荐
相关产品推荐

