选中内容(绿色)时除了会搜索文章名,还会搜索文章内容
点击结果中的文章名进入文章界面后可以按Ctrl+F在页面内搜索
  • 版权:CC BY-SA 4.0
  • 创建:2020-05-15
  • 更新:2023-12-19
docker 挂载磁盘到容器, 容器中创建的文件在宿主机中权限属于root ,而不是当前用户的问题解决方法


参考这里的三种方法: Avoiding Permission Issues With Docker-Created Files

但是这三种方法都有缺陷,
第二种简单方便,官方也推荐,但是当运行一些软件就会出现问题,因为没有root权限,在创建文件时就会出错了;
最后一种看起来最好,但是用户需要在 build 的时候指定,而不是在创建容器的时候指定,不是很方便

想要在创建容器的时候指定用户,可以:
传入环境变量 NEW_USER_NAME NEW_USER_ID NEW_GROUP_ID
Dockerfile 给容器添加一个CMD,判断是否有这个用户,没有就创建用户及组,并把用户加到这个组里面

  1. groupadd --gid $NEW_GROUP_ID $NEW_USER_NAME
  2. adduser --disabled-password --gecos "" --uid $NEW_USER_ID --gid $NEW_GROUP_ID $NEW_USER_NAME
  3. su $NEW_USER_NAME

然后切换到新的用户使用容器即可,这样在容器中创建的文件在宿主机中就不是属于 root 组 和 root 用户的了,而是属于宿主机的当前用户

为了让新用户的终端中能显示中文,在~./.bashrc 设置LANG变量

  1. echo "export LC_ALL=C.UTF-8" >> /home/$USER_NAME/.bashrc
  2. echo "export LANG=C.UTF-8" >> /home/$USER_NAME/.bashrc

另外,在使用新的用户启动 jupyterlab 时,遇到了语言环境问题,没法显示中文
使用了

  1. su - $USER_NAME -c "jupyter-lab --ip=0.0.0.0 --port=8889 --no-browser --notebook-dir=${NOTE_ROOT}"

运行时指定环境变量

  1. su - ${USER_NAME} -c "LANG=C.UTF-8 LC_ALL=C.UTF-8 jupyter-lab --ip=0.0.0.0 --port=8889 --no-browser --notebook-dir=${NOTE_ROOT}"

或者这样也行

  1. su - ${USER_NAME} <<EOF
  2. export LANG=C.UTF-8
  3. export LC_ALL=C.UTF-8
  4. jupyter-lab --ip=0.0.0.0 --port=8889 --no-browser --notebook-dir=${NOTE_ROOT}
  5. EOF # 这里必须在行首不能有空格

可以参考我设置的 jupyterlab 的 Dockerfile : https://github.com/Neutree/dockerfiles/tree/master/tensorflow_gpu_py3_jupyterlab

另外,在需要root权限时,可以使用如下命令使用root用户进入容器

  1. docker exec -it 容器名或ID /bin/bash

如果需要用户直接在jupyter里面可以使用root权限,直接使用su root默认是无法使用的,默认没有root密码,可以使用上面的命令进入容器设置一个root密码,或者在dockerfile里面设置一个默认密码;
或者可以将用户加入到root组并且安装sudo工具

  1. apt install sudo
  2. usermod -g root 用户名

编辑/etc/sudoers

  1. %root ALL=(ALL:ALL) ALL

这一步也可以在上面的创建容器的时候做

举例

Dockerfile

  1. FROM ubuntu:18.04
  2. ENV DEBIAN_FRONTEND noninteractive
  3. # RUN dpkg --add-architecture i386 \
  4. # && apt-get -o APT::Retries=3 update -y
  5. # RUN apt-get update \
  6. # && apt-get install build-essential vim \
  7. # git libncurses5-dev zlib1g-dev gawk \
  8. # libssl-dev unzip lib32z1 lib32z1-dev lib32stdc++6 libstdc++6 \
  9. # ca-certificates file g++-multilib libc6:i386 locales \
  10. # python3 python3-pip rsync shellcheck \
  11. # libopencv-dev libopencv-contrib-dev \
  12. # unzip wget sudo -y \
  13. # && apt-get purge -yq \
  14. # && apt-get autoremove -yq --purge \
  15. # && apt-get clean \
  16. # && rm -rf /var/lib/apt/lists/* \
  17. # && rm -rf /tmp/*
  18. # RUN python3 -m pip install maixtool cmake
  19. COPY switch_user.sh /usr/local/bin/switch_user.sh
  20. RUN chmod +x /usr/local/bin/switch_user.sh
  21. ENTRYPOINT ["/usr/local/bin/switch_user.sh"]

switch_user.sh

  1. #!/bin/bash
  2. set -e
  3. UID=${UID:-""}
  4. GID=${GID:-""}
  5. USER=${USER:-""}
  6. if [ -z "$USER" ]; then
  7. echo "USER env is required by --env USER=\$USER"
  8. exit 1
  9. fi
  10. if [ -z "$UID" ]; then
  11. echo "UID env is required by --env UID=\`id -u\`"
  12. exit 1
  13. fi
  14. if [ -z "$GID" ]; then
  15. echo "GID env is required by --env GID=\`id -g\`"
  16. exit 1
  17. fi
  18. # if group $USER not exists, add group
  19. if ! grep -q "^$USER:" /etc/group; then
  20. addgroup --gid "$GID" "$USER"
  21. fi
  22. # if user $UID not exists, add user
  23. if ! grep -q "^$USER:" /etc/passwd; then
  24. adduser --gecos "" --uid "$UID" --gid "$GID" --no-create-home --disabled-password "$USER"
  25. mkdir -p /home/"$USER"
  26. cp -r /etc/skel/. /home/"$USER"
  27. # default password is maixcdk
  28. echo "$USER:maixcdk" | chpasswd
  29. usermod -aG sudo "$USER"
  30. fi
  31. chown "$UID":"$GID" /home/"$USER"
  32. su "$USER"

run:

  1. docker build --network=host -t maixcdk-builder .
  2. docker run -it --name maixcdk-env --env USER=$USER --env UID=`id -u` --env GID=`id -g` -v /home/${USER}/MaixCDK:/MaixCDK maixcdk-builder

参考

文章有误?有想法想讨论?查看或者发起勘误/讨论 主题
(发起评论需要先登录 github)

/wallpaper/wallhaven-j5lk95.jpg