Разрешение изменено на 1000 на локальном хосте после создания контейнера Docker с томом

#docker #weblogic12c #docker-container

#docker #weblogic12c #docker-контейнер

Вопрос:

После создания моего контейнера с внешним томом разрешение становится 1000.

drwxr-x— 7 1000 1000 4096 02 марта 01:13 my_domain

Каждый раз, когда мне нужно изменить его, мой пользователь. ПОСКОЛЬКУ docker устанавливается пользователем root. Как я могу избежать этой ситуации? Кто-нибудь, пожалуйста, может что-нибудь написать?

Ответ №1:

Не меняйте его на пользователя с другим UID . Разрешение может быть изменено самим контейнером при его запуске. возможно, вам потребуется просмотреть образ docker, который вы используете в этом случае.

Итак, давайте возьмем, к примеру, mysql-docker. при его запуске разрешения будут изменены даже для подключенного тома, чтобы работать должным образом, в противном случае вы столкнетесь с проблемой разрешений, потому что mysql пользователь не сможет записать какие-либо данные.

Основываясь на weblogic12c теге в вашем вопросе, я заметил следующее в Dockerfile weblogic:

 RUN  chown oracle:oracle -R /u01
  

Если ваши данные сохранены внутри контейнера в том же каталоге, то, вероятно, они 1000 представляют oracle пользователя внутри контейнера, вы также можете проверить /etc/passwd внутри контейнера.

Таким образом, UID и GID , которое 1000 в вашем случае представляет пользователя внутри контейнера, используемого процессом контейнера, и поскольку у вас нет пользователя, соответствующего этому, UID оно будет отображаться в числовом виде, как вы его видите. Вы можете создать пользователя с тем же UID на хосте, если хотите. Итак, чтобы указать 1000 имя пользователя и название группы, вам нужно выполнить следующее:

 useradd -U -u 1000 oracle
  

Приведенная выше команда создаст пользователя с именем oracle и группу с таким же именем из-за использования -U , а UID / GID будет 1000 из-за использования -u

   -u, --uid UID                 user ID of the new account
  -U, --user-group              create a group with the same name as the user
  

Далее, если вы выполните следующую команду на хосте, вы получите результат с указанием группы пользователей и uid / gid:

 id oracle
uid=1000(oracle) gid=1000(oracle) groups=1000(oracle)
  

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

1. Спасибо, Хусейн, за ваш ответ.

2. Означает, что мне нужно создать пользователя 1000 на моем хосте?

3. Это не пользователь называется 1000, ее обычного пользователя звонил oracle с группой по имени oracle и UID и GID равен 1000, а если вам нужно создать их можно делать записи -У-У 1000 Oracle на хост-сервере

4. Хорошо, Хусейн. Но каково решение для этого. Это должен быть пользователь моего приложения для пути монтирования тома.

5. Этого не должно быть, сам контейнер docker использует orcale user, если только вы не хотите изменить само изображение своими собственными изменениями или вы можете изменить uid текущего пользователя на хосте с помощью: usermod -u 1000 foo где foo находится ваш текущий пользователь приложения

Ответ №2:

С томами хоста docker вы увидите UID пользователя внутри контейнера, используемого для чтения и записи файлов на хост, перевод UID / GID между контейнером и хостом отсутствует (это не особенность linux bind mounts). Для этого существуют различные обходные пути, в том числе:

  • Просто разрешаю контейнеру записывать файлы как другой uid / gid. Это может предоставить доступ случайным пользователям на хосте к данным контейнера и может привести к ошибкам записи, если каталог хоста не имеет доступа на запись для пользователя контейнера.
  • Измените uid пользователя, созданного внутри образа. Это приводит к созданию другого образа для каждого хоста, на котором вы хотите работать с монтированием хоста.
  • Измените uid во время выполнения на что-то вроде -u флага на docker run . Это может привести к недоступности файлов внутри образа, а uid внутри контейнера не соответствует файлу /etc /passwd внутри контейнера.

Мое личное решение этой проблемы заключается в динамическом изменении пользователя внутри контейнера с помощью точки входа, которая запускается как root и сравнивает uid пользователя контейнера с uid монтирования тома. Когда они отличаются, я изменяю uid пользователя в контейнере и рекурсивно исправляю все файлы, все еще принадлежащие старому uid из образа. Ключевой частью этой процедуры является скрипт для исправления в моем базовом репозитории изображений. Вы можете увидеть это вместе с примером того, как изменить существующие изображения для его использования здесь: https://github.com/sudo-bmitch/docker-base / (fix-perms находится в bin/fix-perms).

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

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

1. Итак, в рабочей среде вы используете сами тома docker или используете другой метод? мой второй вопрос относительно docker-base я думаю, это больше подходит для пользовательских изображений, верно? итак, что-то вроде mysql, вы измените его или развернете как есть и создадите для него пользователя на хосте?

2. В рабочей среде я либо называю тома пользователем, либо вообще не использую тома (например, когда тома используются разработчиками для динамического обновления разрабатываемого кода), либо пользователь изображения предварительно выделяется для соответствия пользователю на рабочем хосте. Я редко запускаю неизмененные изображения в рабочей среде, и пример docker-base показывает, как можно расширить существующий образ.