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

Каковы .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, поэтому я изучал варианты создания пользователя во время запуска контейнера.

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

2 ответа

Решение

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

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

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

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

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

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

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

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

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

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

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

if ! [ -f /.dockerenv ] ; then
  echo "Not running inside docker, exiting to avoid data damage." >&2
  exit 1
fi
Другие вопросы по тегам