Собрать Docker конейтнер с systemd

Рассмотрим как собрать Docker конейтнер с systemd. Будем использовать образ Debian Buster

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

Во всех стандартных сборках с Debian в качестве системы инициализации предполагается init. Любые попытки использовать systemd в готовом конейнере обречены на неудачу даже если установить systemd.

Выход — добавить systemd на этапе подготовки контейнера.

Создаем такой Dockerfile, здесь устанавливается также init (опционально)


FROM debian:buster RUN apt-get update && apt-get install -y init && apt-get clean all RUN apt-get update && apt-get install systemd

Затем в каталоге с Dockerfile запускается сборка

docker build .

На выходе имеем идентификатор образа, указывая его зпускаем контейнер


docker run -itd —privileged 9e9242ac61b9 systemd


Далее можно заходить в него

docker exec -it 47df433941f3bff531f4fdba1319edfb68d98f2f9517210504718669df6c0ff4 bash

Внутри будет привычная система Debian Buster, PID 1 будет иметь процесс systemd, который будет отвечать за запук других служб

Пример unit файла systemd для деплоя ruby приложения можно найти в статье