Определение
Эта опция позволяет запустить в контейнере небольшую систему инициализации в контейнере с целью избавления от зомби-процессов Напомню, что в контейнере по умолчанию родительским процессом выступает не systemd/init, а значение из ENTRYPOINT/CMD
Где использовать? Например, в Ansible Execution-Environment — контейнер для запуска плейбука или таски в AWX, при запуске этого контейнера есть немалая вероятность того, что в ходе выполнения плейбука появится куча зомби процессов и в итоге может появиться ошибка fork error
с остановкой плейбука/таски (см. пикрил)
- https://github.com/ansible/ansible/issues/49270
- https://github.com/operator-framework/operator-sdk/issues/1551
Docker
В Docker используется tini:
sudo apt install tini
docker run -it --init busybox sh
/ # ps
PID USER TIME COMMAND
1 root 0:00 /sbin/docker-init -- sh
7 root 0:00 sh
9 root 0:00 ps
/ # exit
Podman
В Podman используется catatonit, но также есть опция --init-path
, для указания пути к другой системе инициализации:
sudo apt install catatonit
podman run -it --init busybox sh
/ # ps
PID USER TIME COMMAND
1 root 0:00 /run/podman-init -- sh
7 root 0:00 sh
8 root 0:00 ps
/ # exit
# Можно запустить с tini вместо catatonit
podman run -it --init --init-path /usr/bin/tini busybox sh
Entrypoint
На самом деле --init
просто подставляет бинарь системы инициализации в инструкцию ENTRYPOINT (в самое начало), для добавления в образ через Dockerfile
/Containerfile
:
FROM busybox:latest
ENTRYPOINT ["/usr/bin/tini"]