我的用例是,macOS 上的 docker 不需要 sudo 或 root 访问权限,因为它使用受保护的安全模型和一些 HyperVisor 系统(此处的详细信息与主题无关),而在具有真正的 Linux 内核和 cgroup 的基于 Linux 的系统上,docker 需要sudo
或以其他方式root
访问运行容器和命令。
我想写一个相当可移植脚本,可以正确检测环境,并在sudo
需要时运行所有 docker 命令,或者在不需要时不运行所有 docker 命令。
实现这一目标的最佳方法是什么?
我想一种解决方案是直接docker
在脚本中使用,Linux 用户需要运行sudo ./script.sh
,而 macOS 用户可以只运行./script.sh
,但所有包含的命令都将在 root 下运行——例如 mkdir、创建文件等这似乎不是最干净的方式。
我正在寻找的示例:
$sudo_or_not docker run -d nginx
$sudo_or_not docker ps | grep nginx
或者可能
run_docker_command("docker run -d nginx")
run_docker_command("docker ps | grep nginx")
但我不知道如何让类似的东西在 bash 中工作。假设我已经有一个变量,例如$IS_MAC_OS
或0
,1
因此检测操作系统在这里并不重要。
答案1
在 Linux 系统上,对 Docker 的访问通常是在一个docker
组后面进行的,该组对 Docker 套接字具有写访问权限:
% stat /var/run/docker.sock
File: /var/run/docker.sock
Size: 0 Blocks: 0 IO Block: 4096 socket
Device: 17h/23d Inode: 831 Links: 1
Access: (0660/srw-rw----) Uid: ( 0/ root) Gid: ( 999/ docker)
Access: 2019-12-03 15:41:42.633241981 +0900
Modify: 2019-11-28 15:49:03.877925150 +0900
Change: 2019-11-28 15:49:03.877925150 +0900
Birth: -
该组成员的用户不需要sudo
运行docker
命令。
但是,您可以使用包装函数,如下所示:
if [[ $IS_MAC_OS = 1 ]]
then
sudo_or_not () {
"$@" # just run the arguments
}
else
sudo_or_not () {
sudo "$@" # run the arguments with sudo
}
fi
sudo_or_not docker run foo/bar
或者只是包装docker
自己:
if [[ $IS_MAC_OS = 1 ]]
then
docker () {
command docker "$@" # just run the actual docker command with arguments
}
else
docker () {
sudo docker "$@" # run docker with sudo
}
fi
docker run foo/bar