проблема docker systemctl об автоматическом выполнении сценария оболочки для добавления новой службы

использовал образ докера jrei / systemd-ubuntu, я сделал контейнер. ссылка: https://hub.docker.com/r/jrei/systemd-ubuntu/dockerfile

Моя конечная цель - добавить новую службу с помощью systemctl и запустить ее при загрузке контейнера.

Итак, я провел 3 следующих теста.

  1. excute / lib / systemd / systemd в файле sh

    !/bin/bash
    
    while true do
    
    /lib/systemd/systemd
    
    result=$(ps -ax|grep -v grep|grep systemd-journald)
    
    if [ "${#result}" -ne 0 ]
    
        then
    
            systemctl daemon-reload
    
            systemctl start gunicorn
    
            systemctl enable gunicorn
    
            break
    
        else
    
            echo "${#result}"
    
        fi 
    done
    

    результат: произошла ошибка

    msg: попытка запуска от имени пользователя, но система не была загружена с помощью systemd.

  2. добавить команду в docker-compose.yml

    command:
            - /bin/bash/
             - /root/test.sh
    

    результат: произошла ошибка

    msg: попытка запуска от имени пользователя, но система не была загружена с помощью systemd.

  3. перестроить файл докеров на основе jrei / systemd-ubuntu

    FROM jrei/systemd-ubuntu
    
    COPY service/* /etc/systemd/system/
    
    COPY test.sh /root/test.sh
    
    RUN chmod +x /root/systemctl_cmd.sh
    
    VOLUME [ "/sys/fs/cgroup" ]
    
    ENTRYPOINT ["/root/systemctl_cmd.sh"]
    

    результат: произошла ошибка

    msg: попытка запуска от имени пользователя, но система не была загружена с помощью systemd.

Даже трижды тестировал, никак не мог найти.

Итак, я надеюсь получить представление, как я могу запускать вышеуказанные команды. И я хочу знать, как я получаю информацию о состоянии загрузки системы. Я думаю, что если я запускаю команду systemctl после завершения загрузки, она может работать.

любая идея или совет полезны.


person bluebamus    schedule 28.04.2020    source источник
comment
Контейнеры не загружаются; они запускают только один процесс (и все остальное, что процесс хочет запустить). Я бы посоветовал по возможности избегать использования systemd в контейнере. Типичная практика Docker - просто запустить CMD ["gunicorn"] в вашем Dockerfile и сделать это единственным процессом в контейнере.   -  person David Maze    schedule 28.04.2020
comment
Я согласен с Дэвидом. Находясь в Риме, используйте лучшие практики докеров. Избегайте проблемы вместо того, чтобы пытаться ее исправить - один контейнер, один процесс и объедините группу контейнеров с помощью docker-compose или вашего любимого инструмента оркестровки докеров.   -  person DannyB    schedule 28.04.2020
comment
Я знаю, что если служба является зомби-процессом, контейнер не определяет статус процесса, поэтому не может перезагрузиться. Итак, я рассматриваю услугу systemctl. Я тоже знаю супервайзера. но systemctl лучше. по моему мнению. у вас есть идеи по этой проблеме?   -  person bluebamus    schedule 29.04.2020


Ответы (1)


  1. вам не нужно «запускать единорога», если вы просто хотите его включить. Просто используйте "systemctl enable --global foo.service". Если вы хотите, чтобы служба запускалась, тогда syy "systemctl enable --now foo.service".
  2. на самом деле вам не нужно включать службу, когда она должна запускаться в контейнере и останавливать ее в конце. Просто запустите демон systemd и используйте "systemctl", чтобы попросить демон запустить службу.
  3. Поскольку "systemd" - это демон, вам нужно перевести его в фоновый режим, чтобы systemctl мог найти свой коммуникационный сокет. Для правильного завершения работы вам необходимо убедиться, что ваш сценарий оболочки создает «ловушку» для SIGINIT, которая исходит от «docker stop».

В конце концов: в Интернете есть лучшие примеры того, как вы можете использовать контейнер как виртуальную машину с systemd. Это также будет включать проект docker-systemctl-replacement, где вы также можете посмотреть в примеры docker-systemctl-images.

person Guido U. Draheim    schedule 01.05.2020