选中内容(绿色)时除了会搜索文章名,还会搜索文章内容
点击结果中的文章名进入文章界面后可以按Ctrl+F在页面内搜索
  • 版权:CC BY-SA 4.0
  • 创建:2020-05-15
  • 更新:2020-06-10
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

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

参考

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

/wallpaper/wallhaven-lmdvjy.jpg