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

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

2 ответа2

6

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

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

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

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

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

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

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

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .