Рассмотрим как собрать Docker контейнер с systemd. Будем использовать образ Debian Buster.
Берём официальный образ с dockerhub
Docker контейнер с systemd
systemd может понадобиться если в контейнере на основе операционной системы запускается какое-то приложение, которым нужно управлять так же как это делается обычно при размещении на хост машине.
По умолчанию контейнер будет запускаться с init и возможность удобного управления будет отсутствовать.
Во всех стандартных сборках с 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, который будет отвечать за запуск других служб. Docker контейнер с systemd собран.
Теперь внутри контейнера можно запускать сервисы через systemctl и использовать многочисленные возможности systemd, а также журналирования systemd.
Такой подход даст окружение похожее больше на виртуальную машину с определенным дистрибутивом, чем на Docker контейнер, но во многих случаях это может быть удобно.
Пример UNIT файла systemd для деплоя python приложения можно найти в статье