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


Рассмотрим как собрать 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 приложения можно найти в статье

Сказать спасибо