Клиент freeipa в контейнере Ubuntu Docker

Вопрос или проблема

У меня есть приложение в контейнере Docker на Ubuntu, которое аутентифицируется через PAM. Я пытаюсь добавить freeipa-client в контейнер Docker, выполняя

ipa-client-install --mkhomedir --server=ipa.example.internal --domain example.com --realm EXAMPLE.COM --unattended --password=foobar --ssh-trust-dns -N --principal=admin

В результате выполнения команды ipa-client-install появляется сообщение: The ipa-client-install command was successful. Но я вижу несколько сообщений типа

Unable to start ...: CalledProcessError(Command ['/bin/systemctl', 'start', '....service'] returned non-zero exit status 1:     "System has not been booted with systemd as init system (PID 1). Can't operate.\nFailed to connect to bus: Host is down\n")
SSSD service restart was unsuccessful.   

Как мне преодолеть эту проблему?

Редактирование 1: На dockerhub есть несколько очень старых образов (основанных на centos7), которые используют fakesystemd для установки free-ipa клиента. fakesystemd покинут, существуют десятки альтернатив, таких как tini и другие, но из их документации неясно, являются ли они полным заменителем systemd или нет.

Ответ или решение

Теория:

Ваша проблема связана с попыткой запуска службы systemd внутри Docker-контейнера, построенного на основе Ubuntu. Это обусловлено тем, что Docker по умолчанию не используется для запуска systemd, поэтому возникает ошибка "System has not been booted with systemd as init system (PID 1)".

Пример:

Команда ipa-client-install успешно завершает установку, но служба SSSD, необходимая для аутентификации и работы FreeIPA, не может быть перезапущена из-за того, что systemd отсутствует как инициализационная система в контейнере. Это стандартная проблема при использовании docker-контейнеров, которые не были явно настроены для поддержки systemd.

Применение:

Чтобы решить данную проблему, можно воспользоваться следующими подходами:

  1. Использование легковесных заместителей для systemd:
    Поскольку fakesystemd устарел, вы можете использовать процесс-заместитель, такой как tini или dumb-init, для управления запуском процессов внутри контейнера. Они не являются полномасштабной заменой systemd, но помогают управлять процессами и завершением приложений. Тем не менее, они не решат проблему зависимости от systemd для SSSD.

  2. Изменение конфигурации SSSD:
    Попробуйте вручную запустить SSSD без зависимости от systemd. Для этого в Dockerfile можно добавить команды, которые непосредственно запускают демоны SSSD:

    CMD ["sssd", "-f"]
  3. Использование более полного образа, поддерживающего systemd:
    Если для вашего приложения необходимо полное функционирование systemd, один из вариантов – создать Docker-образ, специально настроенный для работы с systemd. Это может быть сложнее и требует более глубокого понимания как Docker, так и systemd.

  4. Запуск программы в хосте:
    Рассмотрите возможность вынесения частей вашего приложения на хост, если это возможно. В этом случае FreeIPA может быть установлен и использовать полный потенциал systemd.

Каждый из предложенных подходов имеет свои плюсы и минусы. Выбор лучшего решения зависит от специфики вашего приложения и инфраструктуры.

Оцените материал
Добавить комментарий

Капча загружается...