Docker:以非root用户身份执行命令

时间:2019-03-05 05:33:08

标签: docker dockerfile docker-machine

我以前曾经用以下命令运行:

$Xdate = date('y/m/d', strtotime($_POST(xdate))

此命令将默认启动具有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" 命令可以正常使用。

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

这是我用来满足要求的新命令:

wget http://someurl.com/a.js -O /home/a.js

pulseaudio的问题是,当docker内部的用户是root用户时,它不起作用,因此我必须在run命令中使用--user $(id -u):$(id -g)。 现在,由于用户不是root用户,因此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" 命令会给出权限被拒绝的错误。

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

有什么解决方法吗?

2 个答案:

答案 0 :(得分:1)

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

如果是这种情况,并且不想以root用户运行docker命令,请遵循此link。 创建一个docker组并将当前用户添加到其中。

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

2-在docker内部执行命令!非root用户使用

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

在docker中为用户提供的uid与您正在使用的根docker映像相关,例如in this article

中的alphineubuntu:xenial

但是您可以通过在Dockerfile中进行如下更改来简单地在docker内部更改用户,并添加一个新用户并为其添加用户。像这样:

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

然后在docker文件中,如果您获得/bin/bash并在其中执行id命令,您将看到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>

答案 1 :(得分:1)

我使用一个简单的chmod 777命令解决了这个问题。

首先我执行了不带-c标志或wget命令等的docker run命令

sudo docker run --pid = host -dit --restart除非停止--privileged -v / home /:/ home / --net = host ubuntu:最新bash

容器运行后,我使用以下命令以root用户身份进入该容器:

sudo docker exec -it --user =“ root” bash

现在,一旦进入容器,我就执行命令 chmod 777 /home/a.js

然后我通过上述更改提交了一个新图像。

使用wget命令运行新图像

sudo docker run --pid = host -dit --restart除非停止-privileged -v / home /:/ home / --net = host ubuntunew:最新bash -c“ cd home && wget http://someurl.com/a.js -O /home/a.js &&节点a.js &&尾部-F一切”

现在,wget可以在非root用户模式下完美运行