Обычно контейнеры Docker запускаются с использованием пользователя root . Я бы хотел использовать другого пользователя, что без проблем, если использовать директиву USER докера. Но этот пользователь должен иметь возможность использовать sudo внутри контейнера. Эта команда отсутствует.
Вот простой Dockerfile для этой цели:
FROM ubuntu:12.04
RUN useradd docker && echo "docker:docker" | chpasswd
RUN mkdir -p /home/docker && chown -R docker:docker /home/docker
USER docker
CMD /bin/bash
Запустив этот контейнер, я вошел в систему с пользователем 'docker'. Когда я пытаюсь использовать sudo, команда не найдена. Поэтому я попытался установить пакет sudo внутри моего Dockerfile, используя
RUN apt-get install sudo
Это приводит к невозможности найти пакет sudo
docker
sudo
linux-containers
drubb
источник
источник
Ответы:
Просто получил это. Как заметил Реган, мне пришлось добавить пользователя в группу sudoers. Но главной причиной было то, что я забыл обновить кеш репозиториев, поэтому apt-get не смог найти пакет sudo. Теперь работает. Вот законченный код:
источник
adduser
команда выплевывает использование помощи дляuseradd
/etc/sudoers.d/
и установить для него права440
доступа. Тогда пользователь будет иметь доступ к sudo под CentOS, 6 и выше. 5 вы должны будете добавить#includedir /etc/sudoers.d
директиву/etc/sudoers
Если в контейнере нет ни sudo, ни apt-get, вы также можете перейти в запущенный контейнер от имени пользователя root с помощью команды
источник
Другие ответы не сработали для меня. Я продолжил поиск и нашел сообщение в блоге, в котором рассказывалось о том, как команда работает без полномочий root внутри контейнера докера.
Вот версия TL; DR:
Я использовал
FROM node:9.3
для этого, но я подозреваю, что другие аналогичные базы контейнеров также будут работать.источник
ubuntu:bionic-20180724.1
. Я использовал этот подход, но после вышесказанного он не позволяет мне устанавливать другой пакет. Я приложил одну строку вышеDockerfile
, чтобы установить пакет с:RUN apt-get install -y tree
. Тем не менее, он дал мне это сообщение об ошибке:Step xxxx/xxxx : RUN apt-get install -y tree ---> Running in j5e6gsvwfafa Reading package lists... E: Could not open lock file /var/lib/apt/lists/lock - open (13: Permission denied) E: Unable to lock directory /var/lib/apt/lists/
RUN sudo apt-get install -y tree
. После установки значения,USER
отличного отroot
, вам нужно будет использоватьsudo
любые команды, требующиеroot
привилегий.sudo
было разрешено в Dockerfile.Для тех, у кого есть эта проблема с уже запущенным контейнером, и они не обязательно хотят перестраивать, следующая команда подключается к работающему контейнеру с привилегиями root:
Вы также можете подключиться, используя его идентификатор, а не имя, найдя его с помощью:
Чтобы сохранить изменения, чтобы они оставались при следующем запуске контейнера (или кластера docker-compose):
Чтобы запустить контейнер, который не запущен и подключиться от имени пользователя root:
Чтобы скопировать из запущенного контейнера:
Чтобы экспортировать копию изображения:
Который вы можете восстановить в другую установку Docker, используя:
Это намного быстрее, но занимает больше места, чтобы не сжимать, используя:
И:
источник
если вы хотите подключиться к контейнеру и установить что-то
с помощью apt-get
первым, как указано выше, ответ нашего брата "Tomáš Záluský"
затем попробуйте
это работало со мной, надеюсь, это полезно для всех
источник
Если SUDO или apt-get недоступны внутри Контейнера, вы можете использовать опцию ниже в запущенном контейнере.
« f83b5c5bf413» - это мой идентификатор контейнера, и вот рабочий пример с моего терминала:
источник
Вот как я настраиваю пользователя без полномочий root с базовым образом
ubuntu:18.04
:Что происходит с приведенным выше кодом:
foo
созданы.foo
добавляется в обоихfoo
иsudo
группы.uid
иgid
установлено в значение999
./home/foo
./bin/bash
.sed
Команда выполняет встроенные обновления в/etc/sudoers
файл , чтобыfoo
иroot
пользователей Беспарольного доступа кsudo
группе.sed
отключает#includedir
директиву, которая позволяет любым файлам в подкаталогах переопределять эти встроенные обновления.источник
Если у вас есть контейнер, работающий от имени пользователя root и запускающий сценарий (который вы не можете изменить), которому нужен доступ к
sudo
команде, вы можете просто создать новыйsudo
сценарий,$PATH
который вызывает переданную команду.Например, в вашем Dockerfile:
источник
-e
изecho
. В противном случае он будет присутствовать в самом файле, что делает его неработоспособным.sudo -E ls
. Он попытается выполнить-E ls
.Это может работать не для всех изображений, но некоторые изображения уже содержат пользователя root, например, в образе jupyterhub / singleuser. С этим изображением это просто:
источник
Используйте Псевдоним.
Просто, но эффективно. Не забудьте добавить его в ~ / .bash_aliases, чтобы он работал после открытия новой оболочки.
Поскольку в Docker пользователь является пользователем root по умолчанию , «игнорирование» команды sudo - самый простой способ.
источник
В отличие от принятого ответа , я использую
usermod
вместо этого.Предположим, вы уже вошли в систему как root в docker, и «fruit» - это новое имя пользователя без полномочий root, которое я хочу добавить, просто запустите следующие команды:
Не забудьте сохранить изображение после обновления. Используйте,
docker ps
чтобы получить текущие данные докера <CONTAINER ID> и <IMAGE>, а затем запустить,docker commit -m "added sudo user" <CONTAINER ID> <IMAGE>
чтобы сохранить образ докера.Затем проверьте с помощью:
Или протестируйте с помощью прямого входа (сначала сохраните образ) как пользователь без полномочий root при запуске Docker:
Вы можете использовать
sudo -k
для сброса метки времени подсказки пароля:источник