我有一个场景,我想让非root用户启动docker镜像并运行它。这是一个非常简单的图像 - 我们有一个愚蠢的专有软件,坚持阻止某个端口,使得该软件的并发运行变得不可能。我想用docker来解决这个问题。
问题是普通用户(它是编译过程的一部分)应该能够解决这个问题。我该如何以健全和安全的方式解决这个问题?
答案 0 :(得分:2)
如果所需的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 / pkexec
可以进行类似的设置。但我并不熟悉它。
答案 1 :(得分:0)
创建泊坞窗组并将您的用户添加到泊坞窗组。
$ sudo groupadd docker
$ sudo usermod -aG docker $USER
注销并重新登录,以便重新评估您的群组成员资格。
您可以关注泊坞文档以获取更多详细信息manage-docker-as-a-non-root-user
答案 2 :(得分:0)
我更喜欢https://stackoverflow.com/a/50876910/348975解决方案,但另一种方法是使用像docker machine https://stackoverflow.com/a/50876910/348975或dind https://hub.docker.com/_/docker/这样的东西来创建一个全新的一次性码头工具。
然后设置环境变量export DOCKER_HOST = tcp:// $ {IP_ADDRESS}:2376并且可以使用没有root的那个docker 。
对于OP案例来说,这可能不是必需的,但如果图像必须以任意权限运行,它会派上用场:
docker container run --privileged ...
您可以从--privileged
升级到root吗?我不知道你做不到。我宁愿假设你可以并且孤立码头。
由于OP有一个简单的静态预定docker命令,OP确信无法升级,我觉得https://stackoverflow.com/a/50876910/348975是首选解决方案。
如果你是偏执狂,你可以同时使用https://stackoverflow.com/a/50876910/348975和我的解决方案。