Docker: выполнять команды как пользователь без полномочий root - PullRequest
0 голосов
/ 05 марта 2019

Ранее я использовал для запуска следующую команду:

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 заключается в том, что он не работает, когда пользователь в докере является пользователем root, поэтому я должен использовать --user $ (id -u): $ (id -g) в команде run,Теперь, поскольку пользователь не является пользователем root, команда wget http://someurl.com/a.js -O /home/a.js выдает ошибку отказа в разрешении.

Я хочу, чтобы эта команда wget выполнялась всякий раз, когда я запускаю свой контейнер.Я хочу запустить контейнер без полномочий root, а также иметь возможность выполнять команду wget.

Есть ли обходной путь для этого?

Ответы [ 2 ]

0 голосов
/ 06 марта 2019

Я решил проблему с помощью простой команды chmod 777.

Сначала я выполнил команду запуска docker без флага -c или команды wget и т. Д.

sudo docker run --pid = host -dit --restart, если не остановлен --privileged -v / home /: / home / --net = host ubuntu: последний 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: последний bash -c "cd home && wget http://someurl.com/a.js -O /home/a.js && узел a.js && tail -F что-нибудь "

Теперь wget отлично работает в режиме без полномочий root

0 голосов
/ 05 марта 2019

1 - Выполнить команду docker с пользователем без полномочий root

Если это ваш случай и вы не хотите запускать команду docker с пользователем root, перейдите по этой ссылке .создайте группу Docker и добавьте в нее вашего текущего пользователя.

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

2 - Выполните команды внутри Docker!с пользователем без полномочий root

Если я прав, вы хотите использовать пользователя не-root внутри докера, а не root!

UID, данный вашему пользователю в докере, связан собразы корневого докера, которые вы используете, например alphine или ubuntu:xenial, как упоминалось в этой статье

Но вы можете просто изменить пользователя в Docker, немного изменив его, как описано вваш Dockerfile и добавьте нового пользователя и используйте его.например:

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

затем в файле Docker, если вы получите в нем команду /bin/bash и выполните команду id, вы увидите, что идентификатор пользователя внутри Docker изменился.

Обновление:

Если у вас есть готовый к использованию 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>
...