在Ubuntu自动化Shell脚本中添加用户到docker组后无需登出即可立即生效的解决方法
在Ubuntu自动化Shell脚本中添加用户到docker组后无需登出即可立即生效的解决方法
我完全懂你这种想让脚本全程自动化、不被登出打断的需求——毕竟好不容易写了一键部署脚本,卡在组权限这里太闹心了。下面给你几个靠谱的方案,包括你说的“有点hacky”的办法,都能让你在脚本里立刻用上docker组的权限:
临时切换组执行单个命令
如果你只是需要执行一两个docker命令,不用改整个脚本的环境,可以直接用sg命令临时以docker组身份运行命令,比如:# 先把用户加入docker组 sudo usermod -aG docker ${USER} # 直接用sg执行docker命令,不用登出 sg docker -c "docker exec blah blah"sg会切换到指定组执行后面的命令,执行完就回到原来的shell环境,完全不影响脚本后续的其他步骤。重启脚本到docker组环境(彻底解决后续所有命令)
要是后续有一堆docker命令要执行,一个个加sg太麻烦,可以让脚本自己重启一次,在docker组的环境里运行。不过要加个判断避免无限循环,比如:# 检查当前用户是否已经在docker组里 if ! id -nG "${USER}" | grep -qw "docker"; then # 先把用户加入组 sudo usermod -aG docker "${USER}" # 重启脚本,以docker组身份运行 exec sg docker "$0" "$@" fi # 下面的所有命令都能直接用docker权限了 docker exec blah blah docker run ...这个方法会在第一次执行时把用户加组,然后重启脚本,第二次执行时因为已经在docker组里,就跳过加组步骤,直接执行后续的docker命令,全程不用手动登出。
超级hacky的方法:直接更新当前shell的组环境变量
如果你不怕小风险,可以直接修改当前shell的组环境变量,让系统认为你已经在docker组里。不过这个方法不是所有系统都通用,但在Ubuntu上大概率能用:sudo usermod -aG docker ${USER} # 获取docker组的GID DOCKER_GID=$(getent group docker | cut -d: -f3) # 把docker组的GID加到当前shell的组列表里 export GROUPS="${GROUPS} ${DOCKER_GID}" # 触发组信息刷新(开个临时子shell立刻退出) newgrp docker <<END exit END这里用
newgrp开个临时子shell然后立刻退出,会让父shell的组信息刷新,之后你就能直接执行docker命令了。
备注:内容来源于stack exchange,提问作者Terminologist
相关产品推荐
相关产品推荐

