init для контейнеров Тини - самый простой init о котором вы могли бы подумать.
Все, что Tini делает, это порождает одного ребенка (Tini предназначен для запуска в контейнере) и подождать, пока он выйдет все время, когда пожинает зомби и выполняет передачу сигналов.
Использование TINI имеет несколько преимуществ:
SIGTERM правильно завершает ваш процесс, даже если вы явно не установили для него обработчик сигнала.Если вам нужны подробности о том, почему это полезно, просмотрите этот вопрос о обсуждении: какое преимущество Tini?.
Примечание. Если вы используете Docker 1.13 или более, Tini включен в сам Docker. Это включает в себя все версии Docker CE. Чтобы включить Tini, просто передайте флаг --init , чтобы docker run .
Примечание. Для Tini доступны предварительно созданные изображения Docker. Если вы в настоящее время используете изображение Ubuntu или Centos в качестве базы, вы можете использовать один из них в качестве замены.
Примечание: есть пакеты TINI для Alpine Linux и Nixos. Смотрите ниже инструкции по установке.
Добавьте Tini в свой контейнер и сделайте его исполняемым. Затем просто примените Tini и передайте свою программу и ее аргументы в качестве аргументов с Тини.
В Docker вы захотите использовать входную точку, чтобы вам не нужно было помнить, чтобы вручную вызовать TINI:
# Add Tini
ENV TINI_VERSION v0.19.0
ADD https://github.com/krallin/tini/releases/download/${TINI_VERSION}/tini /tini
RUN chmod +x /tini
ENTRYPOINT ["/tini", "--"]
# Run your program under Tini
CMD ["/your/program", "-and", "-its", "arguments"]
# or docker run your-image /your/program ...
Обратите внимание, что вы можете пропустить -- при определенных условиях, но вы также можете всегда включать его, чтобы быть в безопасности. Если вы видите сообщение об ошибке, которое выглядит как tini: invalid option -- 'c' , то вам нужно добавить -- .
Аргументы для самого Тини должны передаваться как -v в следующем примере: /tini -v -- /your/program .
Примечание. Бинарная ссылка выше представляет собой 64-битный динамически связанный двоичный файл.
tini и tini-static двоичные файлы подписаны с использованием ключа 595E85A6B1B4779EA4DAAEC70B588DFF0527A9B7 .
Вы можете проверить их подписи, используя gpg (который вы можете установить, используя диспетчер пакетов):
ENV TINI_VERSION v0.19.0
ADD https://github.com/krallin/tini/releases/download/${TINI_VERSION}/tini /tini
ADD https://github.com/krallin/tini/releases/download/${TINI_VERSION}/tini.asc /tini.asc
RUN gpg --batch --keyserver hkp://keyserver.ubuntu.com:80 --recv-keys 595E85A6B1B4779EA4DAAEC70B588DFF0527A9B7
&& gpg --batch --verify /tini.asc /tini
RUN chmod +x /tini
tini и tini-static двоичные файлы сгенерировали контрольные кости ( SHA1 и SHA256 ).
Вы можете проверить их контрольные суммы с помощью sha1sum и sha256sum (которые вы можете установить с помощью диспетчера пакетов):
ENV TINI_VERSION v0.19.0
RUN wget --no-check-certificate --no-cookies --quiet https://github.com/krallin/tini/releases/download/${TINI_VERSION}/tini-amd64
&& wget --no-check-certificate --no-cookies --quiet https://github.com/krallin/tini/releases/download/${TINI_VERSION}/tini-amd64.sha256sum
&& echo "$(cat tini-amd64.sha256sum)" | sha256sum -c
На Alpine Linux вы можете использовать следующую команду для установки TINI:
RUN apk add --no-cache tini
# Tini is now available at /sbin/tini
ENTRYPOINT ["/sbin/tini", "--"]
Используя NIX, вы можете использовать следующую команду для установки TINI:
nix-env --install tini
На Debian (Buster или Newer) вы можете использовать следующую команду для установки TINI:
apt-get install tini
Обратите внимание, что это устанавливает /usr/bin/tini (и /usr/bin/tini-static ), а не /tini .
На Arch Linux есть пакет, доступный на AUR. Установите, используя официальные инструкции или используйте помощника AUR:
pacaur -S tini
ARM и 32-битные двоичные файлы доступны! Вы можете найти полный список доступных двоичных файлов под вкладкой релизов.
Аргумент -v может использоваться для дополнительного словесного вывода (вы можете передать его до 3 раза, например, -vvv ).
По умолчанию Tini должен работать как PID 1, чтобы он мог воспользоваться зомби (бегая как PID 1, зомби повторно парируют в TINI).
Если по какой -то причине вы не можете запустить TINI в качестве PID 1, вы должны зарегистрировать TINI как процесс подсознания (только в Linux> = 3.4), либо: либо:
-s tini ( tini -s -- ... )TINI_SUBREAPER (например, export TINI_SUBREAPER= ).Это гарантирует, что зомби переурождаются в Тини, несмотря на то, что Тини не работает как PID 1.
Примечание: Tini выпустит предупреждение, если он обнаружит, что он не работает как PID 1, и не зарегистрирован как подрост. Если вы не видите предупреждения, все в порядке.
Тини повторно использует код выхода ребенка при выходе, но иногда это может быть не именно то, что вы хотите (например, если ваш ребенок выходит из 143 после получения сигмита). Примечательно, что это может быть проблемой с приложениями Java.
В этом случае вы можете использовать флаг -e , чтобы перебрать произвольный код выхода в 0. Вы можете пропустить флаг несколько раз, если это необходимо.
Например:
tini -e 143 -- ...
По умолчанию Tini только убивает свой непосредственный дочерний процесс. Это может быть неудобным, если отправка сигнала на этот процесс не имеет желаемого эффекта. Например, если вы это сделаете
docker run krallin/ubuntu-tini sh -c 'sleep 10'
И ctrl-c это ничего не происходит: Sigint отправляется в процесс «SH», но эта оболочка не будет реагировать на него, пока она ждет «сна», чтобы закончить.
С опцией -g Тини убивает группу детей, так что каждый процесс в группе получает сигнал. Это более близко соответствует тому, что происходит, когда вы делаете Ctrl-C и т. Д. В терминале: сигнал отправляется в группу процесса переднего плана.
Tini может установить свой родительский сигнал смерти, который является сигналом, который Tini должен получить, когда его родитель выходит. Чтобы установить родительский сигнал смерти, используйте флаг -p с именем сигнала Tini должен получить, когда его родитель выходит:
tini -p SIGTERM -- ...
ПРИМЕЧАНИЕ. См. Это PR -обсуждение, чтобы узнать больше о сигнале смерти родителей и вариантов использования.
Tini также можно использовать с существующей точкой записи в вашем контейнере!
Предполагая, что ваша точка входа была /docker-entrypoint.sh , тогда вы будете использовать:
ENTRYPOINT ["/tini", "--", "/docker-entrypoint.sh"]
У Тини очень мало зависимостей (это зависит только от LIBC), но если ваш контейнер не может запустить, вы можете вместо этого рассмотреть вопрос о использовании статической версии:
ADD https://github.com/krallin/tini/releases/download/${TINI_VERSION}/tini-static /tini
Tini - очень маленький файл (в диапазоне 10 КБ), поэтому он не добавляет большого веса в ваш контейнер.
Статически связанная версия больше, но все же <1M.
Если вы не хотите загрузить двоичный файл, вы можете построить Tini, используя cmake . && make .
Прежде чем строить, вы, вероятно, также хотите запустить:
export CFLAGS="-DPR_SET_CHILD_SUBREAPER=36 -DPR_GET_CHILD_SUBREAPER=37"
Это гарантирует, что даже если вы наращиваете систему, в которой есть старые заголовки ядра Linux (<3.4), Tini будет построен с поддержкой ребенка подростков. Обычно это то, что вы хотите, если собираетесь использовать Tini с Docker (если ваше ядро хоста поддерживает Docker, оно также должно поддерживать детские субребер).
После того, как он нерестится ваш процесс, Tini будет ждать сигналов и перенаправить их в процесс ребенка и периодически воспользоваться процессами зомби, которые могут быть созданы в вашем контейнере.
Когда «первый» дочерний процесс выходит ( /your/program в примерах выше), Tini также выходит, с кодом выхода дочернего процесса (так что вы можете проверить код выхода вашего контейнера, чтобы узнать, успешно ли ребенок вышел).
Если что -то не работает так, как вы ожидаете, подумайте о повышении уровня условности (до 3):
tini -v -- bash -c 'exit 1'
tini -vv -- true
tini -vvv -- pwd
Содействие:
Участники:
Особая благодарность: