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

Docker : execute commands as a non-root user

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

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 用户时它不起作用,因此我必须在 运行 命令。 现在由于用户不是 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 图像相关,例如 alphineubuntu:xenial in this article

但是您可以简单地更改 docker 中的用户,方法是在您的 Dockerfile 中稍作更改,然后添加一个新用户并使用它。像这样:

 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 运行 命令,没有 -c 标志或 wget 命令等

sudo docker 运行 --pid=host -dit --restart unless-stopped --privileged -v /home/:/home/ --net=主机 ubuntu:latest bash

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

sudo docker exec -it --user="root" bash

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

然后我提交了一个具有上述更改的新图像。

运行 使用 wget 命令的新图像

sudo docker 运行 --pid=host -dit --restart unless-stopped --privileged -v /home/:/home/ --net=主机ubuntunew:latestbash-c"cd home && wget http://someurl.com/a.js -O /home/a.js && node a.js && tail -F anything"

现在 wget 在非 root 模式下完美运行