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

如何将本地服务器用户添加到Docker容器中且不挂载/etc目录

将宿主机用户同步到Docker容器的实现方案

核心逻辑

要实现权限和宿主机完全匹配,核心是保证容器内对应用户的UID(用户ID)、GID(用户组ID)和宿主机完全一致,不需要挂载任何/etc目录下的配置文件,手动创建即可。

步骤1:获取宿主机用户的UID/GID信息

在RHEL宿主机执行以下命令,获取三个用户的ID信息:

id admin
id bob
id joe

示例输出参考:

uid=1000(admin) gid=1000(admin) groups=1000(admin),10(wheel)
uid=1001(bob) gid=1001(bob) groups=1001(bob)
uid=1002(joe) gid=1002(joe) groups=1002(joe)

记录下三个用户对应的uid、gid值,后续容器内创建用户需要和这些值完全对齐。

方案A:构建镜像时内置用户(适合用户固定的场景)

直接在Ubuntu镜像的Dockerfile中添加用户创建逻辑,一次性构建后即可长期使用:

# 基于Ubuntu基础镜像
FROM ubuntu:22.04

# 预装sudo工具
RUN apt update && apt install -y sudo && rm -rf /var/lib/apt/lists/*

# 1. 创建admin用户(对应宿主机uid=1000、gid=1000,有root权限)
RUN groupadd -g 1000 admin && \
    useradd -u 1000 -g 1000 -m -d /home/admin -s /bin/bash admin && \
    # 设置密码,可自行修改为你需要的密码
    echo "admin:自定义admin密码" | chpasswd && \
    # 授予sudo全权限,不需要免密可删除NOPASSWD:配置
    echo "admin ALL=(ALL) NOPASSWD:ALL" > /etc/sudoers.d/admin && \
    chmod 0440 /etc/sudoers.d/admin

# 2. 创建bob用户(对应宿主机uid=1001、gid=1001,无sudo权限)
RUN groupadd -g 1001 bob && \
    useradd -u 1001 -g 1001 -m -d /home/bob -s /bin/bash bob && \
    echo "bob:自定义bob密码" | chpasswd

# 3. 创建joe用户(对应宿主机uid=1002、gid=1002,无sudo权限)
RUN groupadd -g 1002 joe && \
    useradd -u 1002 -g 1002 -m -d /home/joe -s /bin/bash joe && \
    echo "joe:自定义joe密码" | chpasswd

构建镜像后启动的所有容器都会自动包含这三个对应权限的用户。

方案B:容器启动时动态创建用户(适合用户频繁变动的场景)

如果用户需要经常调整,不想每次重新构建镜像,可以通过entrypoint脚本在容器启动时动态创建用户:

  1. 首先编写entrypoint脚本entrypoint.sh:
#!/bin/bash
set -e

# 创建admin用户
groupadd -g 1000 admin
useradd -u 1000 -g 1000 -m -d /home/admin -s /bin/bash admin
echo "admin:自定义admin密码" | chpasswd
echo "admin ALL=(ALL) NOPASSWD:ALL" > /etc/sudoers.d/admin
chmod 0440 /etc/sudoers.d/admin

# 创建bob用户
groupadd -g 1001 bob
useradd -u 1001 -g 1001 -m -d /home/bob -s /bin/bash bob
echo "bob:自定义bob密码" | chpasswd

# 创建joe用户
groupadd -g 1002 joe
useradd -u 1002 -g 1002 -m -d /home/joe -s /bin/bash joe
echo "joe:自定义joe密码" | chpasswd

# 执行容器原有启动命令
exec "$@"
  1. 对应Dockerfile配置:
FROM ubuntu:22.04
RUN apt update && apt install -y sudo && rm -rf /var/lib/apt/lists/*
COPY entrypoint.sh /entrypoint.sh
RUN chmod +x /entrypoint.sh
ENTRYPOINT ["/entrypoint.sh"]
CMD ["/bin/bash"]

启动容器时会自动完成用户创建,不需要修改镜像内容。

注意事项

  • UID/GID对齐是权限匹配的核心,只要容器内用户的UID/GID和宿主机一致,访问共享目录等场景的权限就会和宿主机完全匹配
  • 无需挂载宿主机/etc下的passwd、shadow、group等文件,避免双向越权的安全风险
  • 若不需要用户密码和宿主机一致,可自行设置容器内用户的密码,不影响权限匹配

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.27 20:15:05