Что такое.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
Другие люди задавали подобные вопросы, но я не могу найти ответы:
- .dockerinit /.dockerenv (12.09.2015)
Я спрашиваю, потому что я работаю над ошибкой в моем инструменте для запуска 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