Docker用户切换

Docker用户切换

Docker镜像多数仅包含root用户,且设置容器以root身份启动。如果想要以其他用户身份启动容器,需要保证镜像中含有其他用户,并在容器启动时指定用户。

镜像构建

  • 方法一:使用Dockerfile重新构建包含其他用户的镜像。
  • 方法二:在目标容器中添加其他用户后,再打包成镜像。以由root用户添加ubuntu用户为例。
    useradd -d  "/home/ubuntu" -m -s "/bin/bash" ubuntu -u 1002
    echo 'ubuntu:12345678' | chpasswd
    

指定用户启动

使用docker-compose启动

version: '3.5'
services:
	dgl_cluster:
		container_name: dgl_cluster
        image: dgl_single:v1.0
        user: "dgl"
        stdin_open: true
        tty: true
        command: /bin/bash

用户切换

当容器以非root用户身份启动时,若需要运行某些需要root权限的命令,则需要先切换成root用户,并在命令执行后切换回来。以启动sshd为例。

  • 使用expect命令编写/home/dgl/.ssh/sshd.sh脚本
    #!/bin/bash	
    expect <<-EOF
    set timeout -1
    spawn su root
    expect "Password:"
    send "12345678\r"
    expect "#"
    send "chown pbg:pbg -R /home/pbg/MyWorkspace\r"
    expect "#"
    send "/usr/sbin/sshd\r"
    expect "#"
    send "exit\r"
    expect eof
    EOF
    

    使用apt install expect进行安装

  • 在容器启动时启动脚本
    version: '3.5'
    services:
    	dgl_cluster:
    		container_name: dgl_cluster
      		image: dgl_single:v1.0
      		user: "dgl"
            stdin_open: true
            tty: true
            command: /bin/bash -c "/bin/bash /home/dgl/.ssh/sshd.sh && /bin/bash"
    
### Docker 容器内切换用户的实现方法 在 Docker 容器中切换用户是一个常见的需求,尤其是在需要管理不同权限级别的情况下。以下是几种常见的方式以及可能遇到的问题解决办法。 #### 方法一:通过 `sudo` 设置 Root 密码并切换 当新创建的 Docker 容器默认用户不是 root 并且未设置 root 密码时,可以利用 `sudo` 来赋予临时的超级用户权限,并设置 root 的密码。具体操作如下: 1. 进入容器内部。 2. 执行以下命令以设置 root 用户的密码: ```bash sudo passwd root ``` 3. 切换至 root 用户: ```bash su - root ``` 此方法适用于容器初始化阶段尚未配置 root 密码的情况[^4]。 #### 方法二:直接使用 `su` 命令切换用户 如果尝试使用 `su` 命令切换到其他用户却失败,并提示错误消息如 `su: cannot set groups`,可能是由于目标用户缺少必要的组权限或环境变量配置不当所致。这种情况下,建议先确认目标用户的完整权限结构是否存在,例如其所属的用户组是否已正确定义。 对于某些特定场景下的问题解决方案,比如上述提到的无法正常切换到 root 用户的情形,通常是因为容器启动过程中并未加载完整的用户和组映射关系表。因此,在进入容器前可通过调整启动参数来规避此类冲突[^1]。 #### 方法三:重新构建镜像定义初始用户 另一种更为彻底的方法是从源头解决问题——即定制化自己的 Dockerfile,在其中显式声明希望作为默认身份运行的应用程序主体及其关联属性(包括但不限于 UID/GID)。例如: ```Dockerfile RUN useradd -m myuser && echo "myuser:password" | chpasswd USER myuser ``` 这样做的好处在于能够有效减少后期维护成本的同时提高安全性水平[^2]。 此外需要注意的是,尽管可以通过多种途径达成目的,但在实际生产环境中应谨慎对待任何涉及敏感信息的操作行为,确保遵循最小特权原则实施访问控制策略。 --- ### 示例代码展示 假设我们需要在一个基于 Ubuntu 的自定义镜像里添加一个新的普通用户 testuser 同时允许他执行管理员级别的任务,则可以在 Dockerfile 中加入如下片段完成相应设定: ```Dockerfile FROM ubuntu:latest # 创建新用户testuser,分配家目录并将该账户加入sudoers列表 RUN apt-get update && \ apt-get install -y sudo && \ useradd -ms /bin/bash testuser && \ echo 'testuser:testpass' | chpasswd && \ adduser testuser sudo # 更改工作路径为新增加用户的主文件夹位置 WORKDIR /home/testuser # 设定默认启动的身份为刚才建立起来的那个账号而非root USER testuser CMD ["bash"] ``` 以上脚本不仅实现了基本功能还额外包含了安装软件包的过程以便于后续测试验证效果。 --- 相关问题
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值