早些时候,我曾经使用以下命令运行:
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 命令。
有什么解决方法吗?
最佳答案
1-使用非root用户执行docker命令
如果这是您的情况并且不想以 root 用户运行 docker 命令,请遵循此 link .
创建一个 docker 组并将您当前的用户添加到其中。
$ sudo groupadd docker
$ sudo usermod -aG docker $USER
2- 在 docker 中执行命令!非root用户如果我是对的,您想在 docker 中使用非 root 用户而不是 root 用户!
在 docker 中提供给您的用户的 uid 与您正在使用的根 docker 镜像相关,例如
alphine
或 ubuntu:xenial
如前所述 in this article但是您可以通过在您的
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>
关于 docker : execute commands as a non-root user,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54996027/