nod*_*man 6 docker dockerfile docker-machine
早些时候我曾经使用以下命令运行:
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"
Run Code Online (Sandbox Code Playgroud)
默认情况下,此命令将启动具有 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"
Run Code Online (Sandbox Code Playgroud)
pulseaudio 的问题是,当 docker 内的用户是 root 用户时它不起作用,因此我必须在运行命令中使用 --user $(id -u):$(id -g) 。现在,由于用户不是 root,该wget http://someurl.com/a.js -O /home/a.js命令会给出权限被拒绝的错误。
我希望每当启动容器时都执行此 wget 命令。我想以非 root 身份运行容器,并且也能够执行 wget 命令。
有什么解决方法吗?
Rez*_*adi 11
如果您遇到这种情况并且不想使用 root 用户运行 docker 命令,请点击此链接。\n创建一个 docker 组并将当前用户添加到其中。
\n$ sudo groupadd docker\n$ sudo usermod -aG docker $USER\nRun Code Online (Sandbox Code Playgroud)\n如果我是对的,你想在 docker 中使用非 root 用户而不是 root!
\n在 docker 中为您的用户提供的 uid 与您正在使用的 root docker 镜像相关,例如alphine或ubuntu:xenial如本文中提到的
但是您可以简单地更改 docker 内的用户,方法是按照以下方式进行一些更改Dockerfile,然后添加一个新用户并使用它。像这样:
RUN adduser -D myuser\n USER myuser\n ENTRYPOINT [\xe2\x80\x9csleep\xe2\x80\x9d]\n CMD [\xe2\x80\x9c1000\xe2\x80\x9d]\nRun Code Online (Sandbox Code Playgroud)\n然后在docker文件中,如果你获取/bin/bash并执行id其中的命令,你会看到docker内的用户id发生了变化。
如果您已经准备好使用 Dockerfile,则创建一个新的Dockerfile,例如它的名称是myDocker,并将以下代码放入其中:
from myDockerfile\n RUN adduser -D myuser\n USER myuser\n ENTRYPOINT [\xe2\x80\x9csleep\xe2\x80\x9d]\n CMD [\xe2\x80\x9c1000\xe2\x80\x9d]\nRun Code Online (Sandbox Code Playgroud)\n然后保存这个文件,并构建它:
\n$ docker build -t myNewDocker .\n$ docker run myNewDocker <with your options>\nRun Code Online (Sandbox Code Playgroud)\n
我通过使用简单的 chmod 777 命令解决了这个问题。
首先,我执行了不带 -c 标志或 wget 命令等的 docker run 命令
sudo docker run --pid=host -dit --restart except-stopped --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 except-stopped --privileged -v /home/:/home/ --net=host ubuntunew:latest bash -c "cd home && wget http://someurl. com/a.js -O /home/a.js && 节点 a.js && tail -F 任何内容"
现在wget在非root模式下可以完美工作
| 归档时间: |
|
| 查看次数: |
18574 次 |
| 最近记录: |