之前我曾经使用以下命令运行:
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用户时它不起作用,因此我必须在run命令中使用--user $(id -u):$(id -g)。现在,由于用户不是root用户,因此wget http://someurl.com/a.js -O /home/a.js
命令会给出权限被拒绝错误。
每当我启动容器时,我都希望执行此wget命令。我想以非root身份运行容器,并且还能够执行wget命令。
这有什么解决方法吗?
如果这是您的情况并且不想与root用户一起运行docker命令,请遵循此link。创建一个docker组并将当前用户添加到其中。
$ sudo groupadd docker
$ sudo usermod -aG docker $USER
如果我是对的,你想在docker中使用非root用户而不是root用户!
在docker中为您的用户提供的uid与您正在使用的root 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>
我通过使用简单的chmod 777命令解决了这个问题。
首先我执行了docker run命令而没有-c标志或wget命令等
sudo docker run --pid = host -dit --restart除非--privileged -v / home /:/ home / --net = host ubuntu:latest 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:latest bash -c“cd home && wget http://someurl.com/a.js -O / home / a.js && node a.js && tail -F anything“
现在wget在非root模式下完美运行