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 图像相关,例如 alphine
或 ubuntu: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 模式下完美运行
之前我曾经 运行 使用以下命令:
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 图像相关,例如 alphine
或 ubuntu: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 模式下完美运行