首页 > 解决方案 > Docker:以非 root 用户身份执行命令

问题描述

早些时候我曾经使用以下命令运行:

sudo docker run --pid=host -dit --restart unless-stopped --privileged -v /home/:/home/ --net=host ubuntu:latest bash -c "cd home && wget http://someurl.com/a.js -O /home/a.js && node a.js && tail -F anything"

默认情况下,此命令将启动具有 root 用户的容器。因此,该wget http://someurl.com/a.js -O /home/a.js命令过去可以正常工作。

现在我想从容器中获取声音。为了确保容器和主机同时播放音频,我使用了 pulseaudio 套接字,否则当 alsa 捕获声卡时,我曾经得到设备繁忙错误。

这是我用来完成我的要求的新命令:

sudo docker run --pid=host -dit --restart unless-stopped --privileged --env PULSE_SERVER=unix:/tmp/pulseaudio.socket --env PULSE_COOKIE=/home/$USER/pulseaudio.cookie --volume /tmp/pulseaudio.socket:/tmp/pulseaudio.socket --volume /home/$USER/pulseaudio.client.conf:/etc/pulse/client.conf --user $(id -u):$(id -g) -v /home/:/home/ --net=host ubuntu:latest bash -c "cd home && wget http://someurl.com/a.js -O /home/a.js && node a.js && tail -F anything"

pulseaudio 的问题是当 docker 内的用户是 root 用户时它不起作用,因此我必须在运行命令中使用 --user $(id -u):$(id -g) 。现在,由于用户不是 root,因此该wget http://someurl.com/a.js -O /home/a.js命令给出了权限被拒绝错误。

我希望这个 wget 命令在我启动容器时执行。我想以非 root 身份运行容器,并且还能够执行 wget 命令。

有什么解决方法吗?

标签: dockerdockerfiledocker-machine

解决方案


1-使用非root用户执行docker命令

如果这是您的情况并且不想以 root 用户运行 docker 命令,请点击此链接。创建一个 docker 组并将您当前的用户添加到其中。

$ sudo groupadd docker
$ sudo usermod -aG docker $USER

2- 在 docker 中执行命令!非root用户

如果我是对的,您想在 docker 中使用非 root 用户而不是 root!

在 docker 中给您的用户的 uid 与您正在使用的根 docker 映像相关,例如alphineubuntu:xenial本文所述

Dockerfile但是您可以通过在您的以下内容中进行一些更改并添加一个新用户并使用它来简单地更改 docker 内的用户。像这样:

 RUN adduser -D myuser
 USER myuser
 ENTRYPOINT [“sleep”]
 CMD [“1000”]

然后在 docker 文件中,如果你在其中获得/bin/bashand executeid命令,你会看到 docker 内的用户 id 发生了变化。

更新:

如果你有一个准备好使用的 Dockerfile,那么创建一个新Dockerfile的 ,例如它的名字是myDocker,然后在里面放下面的代码:

 from myDockerfile
 RUN adduser -D myuser
 USER myuser
 ENTRYPOINT [“sleep”]
 CMD [“1000”]

然后保存这个文件,并构建它:

$ docker build -t myNewDocker .
$ docker run myNewDocker <with your options>

推荐阅读