Dockerfile已授权仍出现/app目录PermissionError 13权限拒绝问题
问题原因
你遇到的权限报错核心是Dockerfile中命令执行顺序错误:
你先执行了RUN chown -R daemon:daemon /app给目录授权,后续才执行COPY . /app将本地代码复制到镜像内。COPY操作默认使用当前执行用户(此时为root)的权限写入文件,会覆盖之前的授权配置,最终/app目录下的代码、文件权限都归属root,运行时使用的daemon用户没有写入权限。
另外如果你的本地代码目录中已经存在application.log文件,该文件会被复制到镜像内,权限归属root,即使/app目录有写入权限,daemon用户也无法修改已存在的root权限文件。
修复方案
下面三种方案任选其一即可,优先推荐方案1或方案3:
- 方案1:调整Dockerfile命令顺序,复制完成所有文件后再统一授权
修改对应片段为:
# 先复制所有文件 COPY ./requirements.txt /app/requirements.txt COPY . /app # 复制完成后再统一给/app目录授权 RUN chown -R daemon:daemon /app WORKDIR /app RUN pip3 install --upgrade pip && pip3 install -r requirements.txt USER daemon
同时建议将application.log加入.dockerignore文件,避免本地日志文件被意外复制进镜像。
- 方案2:COPY时直接指定文件所有者
Docker 17.09及以上版本支持COPY命令的--chown参数,可以在复制时直接设置权限,无需额外执行chown:
COPY --chown=daemon:daemon ./requirements.txt /app/requirements.txt COPY --chown=daemon:daemon . /app
- 方案3:将日志路径修改为已授权的目录
你之前已经给/opt/docker/logs目录配置了daemon用户的写入权限,且该目录是为kubernetes日志采集sidecar预留的,直接修改Flask配置中的app.LOG_FILE为/opt/docker/logs/application.log即可,无需修改Dockerfile权限配置,同时更符合容器日志采集规范。
问题排查
如果修改后仍有问题,可以执行以下命令进入容器手动验证权限:
docker run --rm --entrypoint sh 你的镜像名称 # 进入容器后执行以下命令验证 ls -la /app touch /app/test.log
如果ls输出显示/app目录所有者为daemon、且touch命令无报错,则权限配置正常。
内容的提问来源于stack exchange,提问作者Saturnian
相关产品推荐
相关产品推荐

