1、背景

    如果没有指定参数,则进入docker内,默认的为root用户,因为docker容器内的系统用户未知,所以默认为root用户,root用户在Linux系统为根权限用户。


2、进入docker内,以非root用户

   通过参数:  docker run --user=myuser  ,--user为进入docker后的用户

  参数用法: 

         --user=[ user | user:group | uid | uid:gid | user:gid | uid:group ]

  --user可以指定用户进入docker容器,但是还有一个问题,这里的user怎么填?随意填,如果docker内的容器不存在这个用户,则会提示报错。



3、解决方法

    最好的解决方法就是将宿主机的用户名传递进入docker容器内,具体步骤为:

    (1): 获取当前宿主机的用户名: --user=$(id -u):$(id -g)

    (2): 将宿主机的用户文件以只读方式挂载到docker容器内: -v /etc/passwd:/etc/passwd:ro

     这样就完美解决了进入docker容器内以非root用户运行!
     (3): -v $HOME:$HOME:ro  将当前用户目录只读的挂载到容器内,这样进入容器后,目录、文件等可以彩色显示,否则没有颜色.


完整的例子如下:

docker run -it --net=host --user=$(id -u):$(id -g) --rm -e DISPLAY=$DISPLAY -v /tmp/.X11-unix:/tmp/.X11-unix -v "$MOUNT_HOST_DIR":$MOUNT_DOCKER_DIR -v /etc/localtime:/etc/localtime:ro  -v /etc/passwd:/etc/passwd:ro -v $HOME:$HOME:ro  --name $MOUNT_DOCKER_NAME $DOCKER_IMAGE_NAME:$DOCKER_IMAGE_TAG_NAME  /bin/bash  -c "cd $MOUNT_DOCKER_DIR && exec /bin/bash"














#--------------------------------------------------------------------------------------------------------------------------------------------------------


#!/bin/sh


# change the mount dir by yourself
#MOUNT_HOST_DIR="$PWD/Eagleye_dataset"
#MOUNT_HOST_DIR="$PWD/robot_localization/"
MOUNT_HOST_DIR="$PWD/"

MOUNT_DOCKER_NAME="xi"    #给容器指定一个名字
MOUNT_DOCKER_DIR="/home/$MOUNT_DOCKER_NAME"

# change the dock image info by yourself
DOCKER_IMAGE_NAME="ubuntu22_cross"
DOCKER_IMAGE_TAG_NAME="latest"


#DOCKER_IMAGE_NAME="registry.cn-shenzhen.aliyuncs.com/citibot/jiujun"
#DOCKER_IMAGE_TAG_NAME="dev-ubuntu20-mdc610-20240416"


if [ -e "$MOUNT_HOST_DIR" ] && [ -d "$MOUNT_HOST_DIR" ]; then
    echo "文件夹存在"
else
    echo "文件夹:$MOUNT_HOST_DIR 不存在!"
    exit
fi

echo "Enter docker!"

xhost +

#docker run -it --net=host --rm --privileged -e DISPLAY=$DISPLAY -v /tmp/.X11-unix:/tmp/.X11-unix -v "$MOUNT_HOST_DIR":$MOUNT_DOCKER_DIR -v /etc/localtime:/etc/localtime:ro --name $MOUNT_DOCKER_NAME $DOCKER_IMAGE_NAME:$DOCKER_IMAGE_TAG_NAME  /bin/bash  -c "cd $MOUNT_DOCKER_DIR && exec /bin/bash"

#docker run -it --net=host --user=$(id -u):$(id -g) --rm -e DISPLAY=$DISPLAY -v /tmp/.X11-unix:/tmp/.X11-unix -v "$MOUNT_HOST_DIR":$MOUNT_DOCKER_DIR -v /etc/localtime:/etc/localtime:ro  -v /etc/passwd:/etc/passwd:ro --name $MOUNT_DOCKER_NAME $DOCKER_IMAGE_NAME:$DOCKER_IMAGE_TAG_NAME  /bin/bash  -c "cd $MOUNT_DOCKER_DIR && exec /bin/bash"


docker run -it --net=host --user=$(id -u) --rm -e DISPLAY=$DISPLAY -v /tmp/.X11-unix:/tmp/.X11-unix -v "$MOUNT_HOST_DIR":$MOUNT_DOCKER_DIR -v /etc/localtime:/etc/localtime:ro  -v /etc/passwd:/etc/passwd:ro -v $HOME:$HOME:ro --name $MOUNT_DOCKER_NAME $DOCKER_IMAGE_NAME:$DOCKER_IMAGE_TAG_NAME  /bin/bash  -c "cd $MOUNT_DOCKER_DIR && exec /bin/bash"


















































标签: none

评论已关闭