Что такое .dockerenv и .dockerinit?

6

Какие файлы .dockerenvи находятся .dockerinitв корне файловой системы моего контейнера? Как они используются? Есть ли документация по этим файлам?

root@18ceee4f9041:/# ls -al /
total 72
drwxr-xr-x.  21 root root 4096 Jan  4 20:45 .
drwxr-xr-x.  21 root root 4096 Jan  4 20:45 ..
-rwxr-xr-x.   1 root root    0 Jan  4 20:45 .dockerenv
-rwxr-xr-x.   1 root root    0 Jan  4 20:45 .dockerinit

Другие люди задавали подобные вопросы, но я не могу найти ответы:

Я спрашиваю, потому что я работаю над ошибкой в ​​моем инструменте для запуска docker, называемом scuba . Вы можете перейти --userк, docker runчтобы установить UID процесса в контейнере, но у него нет записи в / etc / passwd, поэтому я изучал варианты создания пользователя во время запуска контейнера.

(Перекрестная публикация в переполнении стека , где она может быть закрыта.)

Джонатон Рейнхарт
источник

Ответы:

6

AFAIK нет официальной документации о них.

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

Это .dockerinitбыл своего рода процесс инициализации . Это был двоичный файл, запускаемый lxc-attachкомандой, вызываемой при запуске контейнера. Он отвечал за настройку среды, пользователя и рабочего каталога, а затем запустил вашу точку входа / cmd.

.dockerenvСодержали переменные среды , определенные внутри контейнера. Они использовались для правильной настройки переменных среды после lxc-attach. Этот файл был прочитан .dockerinitпроцессом .

Новый драйвер libcontainer / runc ( драйвер включен по умолчанию ) не использует эти файлы. Вы найдете их пустыми в ваших контейнерах. Фактически, поддержка LXC была недавно удалена из ветки разработки докеров .

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

Zuazo
источник
1
Небольшая неточность: согласно исходному коду, это точки монтирования, указанные в ядре Docker, а не специфичные для драйвера LXC.
Даниэль Б
1
Да ты прав. Эти файлы являются частью списка точек монтирования, созданных как пустые файлы в ядре Docker при создании корневой FS. Но эти два конкретных файла / точки монтирования используются только LXC.
zuazo
Спасибо тебе за это. Не могли бы вы посмотреть мои изменения в отношении "подводного"? Кроме того, не могли бы вы рассказать о том, «Кто был ответственным за установку ... пользователя» ? Это относится к моей проблеме.
Джонатон Рейнхарт
Он устанавливает имя пользователя, передаваемое -uаргументу. Вы можете прочитать реализацию здесь .
zuazo
Что касается проблемы с вашим проектом подводного плавания, посмотрите некоторые решения проблемы с идентификатором пользователя здесь: github.com/docker/docker/issues/7198
zuazo
1

Чтобы выяснить, выполняется ли их код в среде докера, было популярно проверять наличие файла /.dockerinitили /.dockerenv.

Поскольку файл dockerinit был удален в более новых версиях, лучше всего теперь проверить наличие файла dockerenv.

  • Цитирую другой источник :

    Я не уверен, насколько официальный /.dockerenv- это в значительной степени недокументировано, но докер / libnetwork # 815, кажется, подразумевает, что это будет дольше

Пример реализации такой проверки из нашего кода:

if ! [ -f /.dockerenv ] ; then
  echo "Not running inside docker, exiting to avoid data damage." >&2
  exit 1
fi
user2291758
источник