2

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

# Do privileged stuff
su myuser -c "myapplicationcommand $@"

Тем не менее, когда эти контейнеры развернуты, я, очевидно, работаю в неинтерактивной оболочке, потому что я получаю эту ошибку:

su: must be run from a terminal

Очевидно, что команда "su" требует запуска в интерактивной оболочке. Итак, мой вопрос: как я могу удалить привилегии из неинтерактивной оболочки, чтобы мое приложение могло запускаться от имени пользователя без полномочий root внутри моего контейнера Docker?

3 ответа3

1

Старый вопрос, но я не вижу много хороших ответов, поэтому добавляю это обновление в надежде, что оно поможет другим:

Вы можете использовать опции docker run -t и docker exec -it для выделения pty в вашем сеансе docker exec. Есть хороший вопрос и ответ на этот вопрос здесь:https://github.com/docker/docker/issues/8631

Это проще: вам не нужно менять способ создания или запуска контейнера. С помощью docker exec вы можете просто использовать опцию -u, чтобы войти в контейнер от имени разных пользователей и избежать использования su. например

$ docker exec -u root -it small_hypatia bash

$ docker exec -u someone-else -it small_hypatia bash

Также см. Более общий ответ на вопрос «su: должен быть запущен из терминала» здесь. В частности, полезно знать, как можно использовать ssh -t и ssh -tt. Питон pty allocate cute hack также может быть использован, чтобы заставить su работать на кого-то с такой же проблемой. https://stackoverflow.com/questions/36944634/su-command-in-docker-returns-must-be-run-from-terminal/41872292#41872292

0

Обычно su не будет зависеть от tty. Однако, если что-то мешает использовать su, возможно, вы могли бы сделать то же самое с sudo.

0

Ты можешь использовать

RUN adduser myuser
USER myuser
RUN foo
CMD bar

И foo (во время сборки), и bar (во время выполнения) будут работать как myuser.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .