当前位置: 首页 > news >正文

Dockerfile 中的用户权限管理

在 Docker 容器中运行应用程序时,安全性是首要考虑的问题之一。默认情况下,容器以 root 用户身份运行,这在某些情况下可能带来安全风险。今天,我们将探讨如何在 Dockerfile 中添加非 root 用户,并确保容器以该用户身份运行,同时解决可能遇到的权限问题。

初识问题

假设我们有一个简单的 Java 应用程序,它的 Dockerfile 如下:

FROM something/openjdk-17:1.13-1 WORKDIR /opt/app COPY ./build/libs/*.jar app.jar CMD java ${JAVA_OPTS:- -Xmx1G} -jar app.jar

这是一个标准的 Dockerfile,但是它会以 root 用户运行。这里我们尝试修改它,使容器以非 root 用户身份运行:

FROM something/openjdk-17:1.13-1 RUN adduser -D myuser && chown -R myuser /opt/app WORKDIR /opt/app COPY ./build/libs/*.jar app.jar USER myuser CMD java ${JAVA_OPTS:- -Xmx1G} -jar app.jar

然而,在执行构建时,我们遇到了问题:

The command '/bin/sh -c adduser -D myuser && chown -R myuser /opt/app' returned a non-zero code: 2
问题分析
  1. 目录不存在: 在执行chown命令之前,/opt/app目录并不存在。WORKDIR命令不会创建目录。

  2. 用户创建命令:adduser命令在某些 Linux 发行版中可能不适用,更通用的命令是useradd

  3. 用户名混淆: 在示例中提到的用户名不一致(trmonbsvsmyuser)。

解决方案

以下是修正后的 Dockerfile:

FROM openjdk:11 WORKDIR /opt/app RUN useradd -r myuser && chown -R myuser /opt/app COPY *.jar app.jar USER myuser CMD java ${JAVA_OPTS:- -Xmx1G} -jar app.jar

解释:

  • 首先,我们使用useradd -r创建一个系统用户myuser-r选项表示创建一个系统用户。
  • 然后,我们使用chown -R命令递归地将/opt/app目录的所有权更改为myuser
  • WORKDIR命令在RUN之后执行,确保目录存在。
  • 最后,我们使用USER命令切换到myuser用户运行应用程序。
权限问题

如果仍然遇到权限问题,可以尝试以下方法:

RUN useradd -r -g root myuser && chown -R myuser:root /opt/app

这里我们将myuser添加到 root 组,并将/opt/app的所有权设置为myuser:root,这赋予了myuser更高的权限。

结论

通过上述步骤,我们可以成功地在 Dockerfile 中创建一个非 root 用户,并确保应用程序以该用户身份运行。这样不仅提升了容器的安全性,也避免了由于权限问题导致的运行错误。记住,Docker 的学习和实践需要不断的尝试和调整,以找到最适合自己项目的配置。

http://www.jsqmd.com/news/664301/

相关文章:

  • Phi-4-mini-reasoning快速上手:10分钟完成本地部署与第一个AI应用
  • CANape项目配置详解:如何为你的ECU(如TC27x)生成正确的Flash组并设置自动重连
  • Java八股之String、类加载器和双亲委派机制
  • 2026年质量好的消防提升门/工业提升门优质厂家推荐榜 - 行业平台推荐
  • Git Pull时总报‘无法快进’?试试配置pull.rebase true,一劳永逸
  • 【限时解密】SITS2026闭门演讲精华:AI告警生成不是替代人工,而是重构DevSecOps流水线的6个关键跃迁点
  • LumiPixel Canvas Quest 新手必看:如何用咒语卷轴生成理想人像
  • 实用指南:如何使用applera1n工具高效绕过iOS 15-16激活锁限制
  • 2026年评价高的无菌实验室净化工程/广东无菌实验室净化工程/深圳无菌实验室净化工程实力工厂推荐 - 行业平台推荐
  • Java八股之GC 垃圾回收机制和OOM
  • 丹青识画部署案例:中小企业低成本搭建文化AI交互终端
  • PowerShell脚本转EXE终极指南:告别命令行,拥抱图形化编译体验
  • 为什么92%的CI/CD流水线漏报关键影响?SITS2026标准解读:3类语义漂移场景+2种跨语言调用链追踪方案
  • 幻境·流金1024高清图生成:8K显示器直出无压缩效果实拍展示
  • 代码生成后必须做的4项成本校验:否则每千行将埋下$1,840/年的隐形负债(Gartner认证方法论)
  • 2026年靠谱的不锈钢卧式水箱/西安水箱/承压水箱推荐厂家精选 - 行业平台推荐
  • 别再傻傻编译整个论文了!用TexStudio实现LaTeX分章节独立调试(附完整代码)
  • Linux逆向实战:用readelf和objdump亲手分析一个.o文件的.rela.text节
  • 智能生成代码=自动埋雷?紧急预警:这4种AST语义漂移将绕过所有静态扫描器——附实时回滚决策树(已落地金融级生产环境)
  • 快手大模型二面:假如说要设计一个多轮对话Agent,你会怎么设计?
  • 降AI率工具排行榜前10名对比,最后发现只有3款靠谱
  • nli-distilroberta-base实操手册:企业级NLI服务部署与多场景API集成指南
  • 如何让ROS2编译完后自动source环境变量
  • 2026年3月撕碎机刀片直销厂家推荐,撕碎机/刀片撕碎机/轮胎圈口抽丝机/塑料破碎机,撕碎机刀片源头厂家哪家可靠 - 品牌推荐师
  • 2026年质量好的物流门封/月台门封/东台冷库门封优质厂家推荐榜 - 行业平台推荐
  • 全球仅存5份的AGI发展风险对齐时间轴(NSF/DoD/中科院机密评估版节选),2024Q3更新后3处重大修订预警
  • golang如何读写YAML配置文件_golang YAML配置文件读写解析
  • ARM AHB总线传输机制与优化策略详解
  • 为什么82%的团队停用Copilot?——代码熵值暴涨背后的度量盲区(含实时熵监控看板+生成策略调优SOP)
  • 跨平台流媒体下载终极指南:如何用N_m3u8DL-RE轻松获取加密视频内容