Предварительно
Сначала предварительный. При запуске док-контейнера с томом, сопоставленным с какой-либо частью хоста, пользователь внутри док-контейнера обычно является пользователем root, поэтому для файлов, созданных контейнером, хост не может редактировать, изменять или удалять их. Чтобы решить эту проблему, некоторые люди (включая того, кто создал образ, который я использую) рекомендуют использовать -u
Ситуация
У меня есть образ Docker (созданный другим человеком на другой машине)
Этот образ Docker предполагает, что пользователь будет пользователем с идентификатором 1000.
Проблема
Когда человек, который является единственным пользователем хост-компьютера (и чей идентификатор пользователя равен 1000), запускает образ, проблем не возникает. Однако в моем случае я второй пользователь этого хоста, поэтому мой идентификатор пользователя равен 1001. Итак, у меня есть следующее:
На хосте я делаю cat /etc/passwd
и получаю несколько пользователей, в том числе:
firstuser:x:1000:1000:firstluser,,,:/home/firstuser:/bin/bash
myself:x:1001:1001:My Name,,,:/home/myself:/bin/bash
Затем :
СЛУЧАЙ 1 Я запускаю контейнер с
docker run -it --rm -u 1001:1001 -v /a/path:/another/path image /bin/bash
потому что выполнение id -u
и id -g
дает мне 1001. (в конце концов, я второй пользователь)
Это приводит к тому, что
groups:cannot find name for group ID 1001
тогда мой пользователь становится "I have no name!"
и когда я делаю cat/etc/passwd
я получаю
originaluser:x:1000:1000::/home/originaluser:bin/bash
‹---- здесь нет ,,,
поэтому очевидно, что мой пользователь (1001) не существует, что вызывает много проблем.
Чтобы решить эту проблему, я попытался
CASE2 Я запускаю контейнер с
docker run -it --rm -u 1000:1000 -v /a/path:/another/path image /bin/bash
что не вызывает предыдущую ошибку, и теперь, хотя я myself
, но запускаю образ Docker как firstuser
, в контейнере я originaluser
(так как оба 1000)
Делая cat /etc/passwd
я вижу
originaluser:x:1000:1000::/home/sensetime:bin/bash
и, как и предполагалось, мой пользователь originaluser
.
Я должен быть счастлив, но это также вызывает проблемы!
Позже программа внутри контейнера пытается создать файл (с пользователем 1000), но поскольку он сопоставлен, а владельцем пользователя является 1001, это создание не удается.
Каков хороший способ предотвратить все эти проблемы и иметь возможность синхронизировать пользователя на хосте с пользователем в контейнере?