默认情况下,使用 docker run --privileged=true 命令以特权方式创建的容器,容器里的用户名是 root,具有完整的 root 权限;使用 docker run 命令以非特权方式创建的容器,容器里的用户名也是 root,但此 root 用户实际相当于主机上执行 docker run 命令的用户(例如普通用户 frank),容器中名为 root 的用户并不具备 root 权限,但是容器中新创建的文件属主却为 root,这样主机中的非 root 用户访问这些文件时常常权限不足,造成不便。
为解决此问题,需要将主机上的当前普通用户映射进容器中,且使容器中的普通用户同样具有执行 sudo 的权限,创建容器的命令如下:
docker run --user $(id -u ${USER}):$(id -g ${USER}) \ -v /etc/sudoers.centos8.2:/etc/sudoers:ro \ -v /etc/passwd:/etc/passwd:ro \ -v /etc/group:/etc/group:ro \ -v /etc/shadow:/etc/shadow:ro \ -v ${HOME}:${HOME} -w ${HOME} \ -it --name=ffmpeg-centos8.2-0.2-frank -h DK-FFMPEG-02-FRANK ffmpeg-centos8.2:0.2 bash不同操作系统 sudoers 文件内容会有差别,例如主机系统为 openSUSE Leap 15.2,容器系统为 CentOS 8.2,那么是不能将主机系统中的 sudoers 文件映射进容器里的,起码会有警告,所以从 CentOS 8.2 系统里拷贝默认的 sudoers 文件放到主机中,重命名为 /etc/sudoers.centos8.2,此文件映射进 ffmpeg-centos8.2-0.2-frank 容器,即用此文件来设置此容器中用户的 sudo 权限。
4.2 清理磁盘空间 docker system prune待补充
4.3 多阶段构建利用 BuildKit 组件使用 docker 多阶段构建特性,要求 docker 版本不低于 v18.06
DOCKER_BUILDKIT=1 docker build --no-cache -f dockerfiles/dockerfile-ffmpeg-centos-multi -t ffmpeg:0.4 .待补充
5. 修改记录2020-07-09 初稿
2020-11-05 增加 4.1 节