进入docker内,以非root用户
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"
评论已关闭