Docker非root用户无法写入匿名卷,该如何解决?
匿名卷无法写入的解决方案
问题原因
Docker在创建匿名卷时,默认会以root权限初始化卷的权限,这会覆盖你在构建阶段通过chown设置的/app/log目录权限,导致nonrootuser没有写入权限。
方法1:启动容器时指定卷权限
启动容器时通过--mount参数显式指定匿名卷的所有者UID和GID,命令示例:
docker run -d \ --mount type=volume,dst=/app/log,volume-opt=o=uid=1000,volume-opt=o=gid=1000 \ 你的镜像名
注:
1000是adduser -D创建用户的默认UID/GID,如果你的nonrootuserUID不同,可在构建阶段执行RUN id -u nonrootuser查看具体值。
方法2:通过入口脚本自动修正权限
这种方法无需修改启动命令,在镜像中添加入口脚本,启动时自动调整目录权限:
- 创建
entrypoint.sh脚本:
#!/bin/sh # 修正/app/log目录的所有者权限 chown nonrootuser:nonrootuser /app/log # 切换到nonrootuser运行应用 exec su - nonrootuser -c "java -jar /app/app.jar"
- 更新Dockerfile:
... RUN adduser -D nonrootuser RUN mkdir -p /app/log && chown nonrootuser /app/log # 添加并配置入口脚本 COPY entrypoint.sh /app/entrypoint.sh RUN chmod +x /app/entrypoint.sh VOLUME /app/log WORKDIR /app COPY --from=build a/app.jar app.jar EXPOSE 8080 ENTRYPOINT ["/app/entrypoint.sh"]
这里不再提前切换USER nonrootuser,脚本会以root身份完成权限修正后,自动切换到普通用户启动应用。
内容的提问来源于stack exchange,提问作者Krzysztof
相关产品推荐
相关产品推荐

