docker systemctl проблема с автоматическим выполнением сценария оболочки для добавления нового сервиса - PullRequest
0 голосов
/ 28 апреля 2020

использовал jrei / systemd-ubuntu docker образ, я сделал контейнер. ref: 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. пересобрать dockerfile на основе 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.

Даже у меня было проверить это 3 раза, я не смог найти никакой возможности.

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

любая идея или совет приветствуются.

1 Ответ

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

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

...