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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.24 00:06:02