我有一个场景,我想让非root用户启动docker镜像并运行它。这是一个非常简单的图像 - 我们有一个愚蠢的专有软件,坚持阻止某个端口,使得该软件的并发运行变得不可能。我想用docker解决这个问题。
问题是普通用户(它是编译过程的一部分)应该能够解决这个问题。我该如何以健全和安全的方式解决这个问题?
如果所需的docker
命令是静态的,请创建一个简单的启动脚本,存储在/usr/local/bin
中并使其可执行。在/etc/sudoers
中输入一个条目,允许所需的用户在没有密码的情况下使用sudo运行此命令。
例如,创建文件/usr/local/bin/alpine.docker
:
#! /bin/sh
docker run --rm -it alpine sh
使其可执行:
chmod +x /usr/local/bin/alpine.docker
使用/etc/sudoers
在visudo
中创建一个条目:
username ALL = (root) NOPASSWD: /usr/local/bin/alpine.docker
现在用户username
可以在没有密码的情况下运行sudo alpine.docker
。
警告:
如果用户不具有root权限,请不要将用户添加到组docker
。
注意:
对于此解决方案,您需要安装sudo
。但用户username
不需要成为组sudo
的成员。
笔记2:
policykit / qazxsw poi可以进行类似的设置。但我不熟悉它。
创建docker组并将您的用户添加到docker组。
pkexec
注销并重新登录,以便重新评估您的组成员身份。
您可以关注docker文档以获取更多详细信息$ sudo groupadd docker
$ sudo usermod -aG docker $USER
我更喜欢manage-docker-as-a-non-root-user解决方案,但另一种方法是使用像docker machine https://stackoverflow.com/a/50876910/348975或dind https://stackoverflow.com/a/50876910/348975这样的东西来创建一个全新的一次性码头。
然后设置环境变量export DOCKER_HOST = tcp:// $ {IP_ADDRESS}:2376并且可以使用没有root的docker。
对于OP案例来说,这可能不是必需的,但如果图像必须以任意特权运行,它会派上用场:
https://hub.docker.com/_/docker/
你能从docker container run --privileged ...
升级到root吗?我不知道你不能。我宁愿假设你可以并且孤立码头。
由于OP有一个简单的静态预定docker命令,OP有信心无法升级,我觉得--privileged
是首选的解决方案。
如果你是偏执狂,你可以同时使用https://stackoverflow.com/a/50876910/348975和我的解决方案。