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

问题描述 投票:2回答:2

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

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命令。

这有什么解决方法吗?

docker dockerfile docker-machine
2个回答
1
投票

1- Execute docker command with non-root user

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

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

2- Execute commands inside docker! with non-root user

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

在docker中为您的用户提供的uid与您正在使用的root docker图像有关,例如alphineubuntu:xenial,如in this article所述

但是你可以通过在Dockerfile中更改一点点来简单地更改docker中的用户并添加一个新用户并使用它。像这样:

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

然后在docker文件中,如果你获得了/bin/bash并在其中执行id命令,你会看到docker中的用户id被更改了。

Update:

如果您准备好使用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
投票

我通过使用简单的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模式下完美运行

© www.soinside.com 2019 - 2024. All rights reserved.