Подтвердить что ты не робот

В docker, записывая файл в смонтированную файловую систему как не-root?

У меня есть докер-контейнер с -v/home/dan:/home/dan: rw. Когда контейнер пишет файлы в /home/dan, файлы принадлежат root в файловой системе хоста. Есть ли способ сделать так, чтобы файлы, записанные из контейнера, на смонтированный том принадлежали произвольному пользователю в файловой системе хоста?

4b9b3361

Ответ 1

EDIT: это изменилось с момента моего первоначального ответа, в котором говорилось, что это невозможно. В ответ на Mandark:

Это можно сделать, используя переключатель -u для команды docker run.

Например:

docker run -v /home/dan:/home/dan -u `id -u $USER` IMAGE

Ответ 2

Как отметил Франсуа Занинотто, можно использовать идентификатор пользователя.

Это можно сделать, используя переключатель -u для команды docker run.

Например:

docker run -v /home/dan:/home/dan -u `id -u $USER` IMAGE

Ответ 3

A следует за mandark answer - я бы сказал, что также полезно включать группу пользователей, иначе вы получите материал, принадлежащий user: USER и group: root. Для достижения user:user просто введите идентификатор группы, например:

docker run -v /home/dan:/home/dan -u `id -u $USER`:`id -g $USER` IMAGE

# if it for the current user, then you can omit the $USER env var

docker run -v /home/dan:/home/dan -u `id -u`:`id -g` IMAGE

Ответ 4

Это возможно. Трудно автоматизировать, но это возможно. Вот процесс:

  • в хосте, определите текущий идентификатор пользователя и идентификатор группы
  • в контейнере докера, запустите оболочку script, чтобы:

    • добавить новую группу с идентификатором группы из хоста
    • добавить нового пользователя с тем же идентификатором пользователя с хоста (и принадлежащим только что созданной группе)
    • sudo как этот новый пользователь

Теперь каждый файл, созданный внутри контейнера, будет использовать правильный идентификатор пользователя и идентификатор группы, а хост будет прикреплять их к вашему пользователю.

Я написал инструмент для автоматизации использования make, который называется make-docker-command. Надеюсь, это поможет.