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

基于SLES15的Docker镜像:如何让任意用户运行zypper安装依赖包

解决方案:动态用户映射 + 受限sudo配置

要解决SLES15容器中任意主机UID用户执行zypper安装依赖的问题,核心需要解决两个关键点:

  1. 让未预创建的UID用户通过sudo身份验证(解决“you do not exist in the passwd database”错误)
  2. 安全地允许用户仅以root权限执行zypper操作

步骤1:编写容器入口脚本(entrypoint)

创建entrypoint.sh脚本,在容器启动时动态将当前运行的UID/GID添加到/etc/passwd和/etc/group中,确保sudo能识别用户身份:

#!/bin/bash
# 检查当前用户是否存在于passwd数据库
if ! id -u > /dev/null 2>&1; then
    # 动态添加用户条目,home目录设为当前工作目录(与容器启动时的-w参数一致)
    echo "dynamic-user:x:$(id -u):$(id -g):Dynamic Host User:${PWD}:/bin/bash" >> /etc/passwd
    # 动态添加用户组条目
    echo "dynamic-group:x:$(id -g):" >> /etc/group
fi

# 执行容器启动时传入的命令(如pytest)
exec "$@"

步骤2:构建SLES15镜像的Dockerfile

基于SLES15基础镜像,安装必要工具,配置sudo免密执行zypper,并设置入口脚本:

FROM sles15:latest

# 安装Python测试工具、sudo及zypper依赖
RUN zypper -n install python3-pytest python3-coverage sudo && \
    # 清理zypper缓存减小镜像体积
    zypper clean --all

# 配置sudo:允许所有用户免密执行zypper命令
RUN echo 'ALL ALL=(ALL) NOPASSWD: /usr/bin/zypper' >> /etc/sudoers.d/zypper-nopasswd && \
    # 设置sudo配置文件的正确权限(必须为0440)
    chmod 0440 /etc/sudoers.d/zypper-nopasswd

# 复制入口脚本到容器并赋予执行权限
COPY entrypoint.sh /usr/local/bin/entrypoint.sh
RUN chmod +x /usr/local/bin/entrypoint.sh

# 设置容器入口脚本
ENTRYPOINT ["entrypoint.sh"]
# 默认启动命令为pytest
CMD ["pytest"]

步骤3:使用容器

保持你原来的启动命令不变:

docker run --rm -e PYTHONPATH=${VENVPATH} -v ${PWD}:${PWD} -w ${PWD} --user $(id -u):$(id -g) pythoncoverage pytest

此时容器内的用户可以执行以下命令安装系统依赖:

sudo zypper install pango

为什么之前的方法失败?

  1. SUID位设置无效:zypper安装包时会调用rpm及各类脚本,这些后续操作的权限无法通过仅给zypper设置SUID位来覆盖,导致rpm脚本执行时出现权限拒绝错误。
  2. 直接配置sudo全局免密无效:未预创建的UID用户不在/etc/passwd中,sudo无法识别用户身份,因此抛出“you do not exist in the passwd database”错误。

内容的提问来源于stack exchange,提问作者handras

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.31 08:59:13