Docker продолжает создавать папки с правами суперпользователя

#docker

Вопрос:

У меня есть следующий док-файл для zookeeper

 FROM zookeeper:3.7.0

ARG appuser
RUN useradd -ms /bin/bash $appuser
RUN chown -R $appuser/conf /data /logs /datalog
USER $appuser
 

где я указываю своего собственного пользователя с помощью docker build -t my/zookeeper:3.7.0 --build-arg appuser=myuser .

Однако, когда я запускаю его с помощью команды

docker run -u myuser -v /Products/zookeeper:/data my/zookeeper:3.7.0

это не удается, /docker-entrypoint.sh: line 47: /data/myid: Permission denied и я вижу, что он, вероятно, пытается создавать папки как root :

drwxr-xr-x 2 root root 6 Jun 21 17:25 zookeeper

myuser существует на хосте и имеет необходимые разрешения. Почему не используется то, что я предоставил, и выходит из строя из-за разрешений?

Комментарии:

1. Похоже, что изображение, которое вы используете, уже поддерживает —пользователь запускает arg изначально, судя по его точке входа. Он использует gosu, чтобы установить пользователю zookeper заданный uid, который указан, и соответствующим образом настраивает владельца указанных выше каталогов при запуске контейнера. Что объяснило бы вашу проблему. Источник

2. если я поступлю так, я получу сообщение об ошибке: докер: Ответ на ошибку от демона: не удается найти пользователя myuser: в файле passwd нет соответствующих записей.

3. аргумент user позволяет вам задать только имя пользователя, которое на самом деле является частью изображения. Но вы также можете установить его на любой идентификатор пользователя, который вам нравится. Если вы хотите запустить его, например, с вашим текущим пользователем, вы можете использовать: --user $(id -u):$(id -g)

4. Да, но я определяю своего пользователя внутри контейнера и чауна, поэтому я все еще не понимаю, почему в исходном случае я не получаю ошибку разрешения

5. @pat на самом деле использование $(id-u):$(id-g) вместо имени пользователя работает отлично, так что в этом и была проблема, я не ожидал, что я думал, что они одинаковые

Ответ №1:

В заключение: образ zookeper уже способен применять правильные разрешения к каталогам, которые он создает, используя собственный аргумент —user в docker run.

Важно знать, что если вы укажете имя пользователя, пользователь уже должен присутствовать на изображении. Указание идентификатора пользователя и/или идентификатора группы, однако, работает по назначению.

Zookeper использует gosu для настройки владельца каталога в точке входа.

Вот пример того, как запустить образ (в linux), предоставив текущему пользователю право собственности на каталоги, которые он создает:

docker run --user $(id -u):$(id -g) -v /Products/zookeeper:/data my/zookeeper:3.7.0