Как выполнить перезагрузку демона systemctl -внутри контейнера Docker?

Простой ответ — «не по умолчанию». Но вы можете настроить GNU make, чтобы разрешить это, используя.ONESHELL:

Обычно каждая строка рецепта выполняется в отдельной оболочке. Что еще хуже, есть способ сделать многострочные команды -в make, используя \в конце строки для продолжения. К сожалению, это \также передается в оболочку , что менее проблематично для других команд, но для heredoc это действительно портит синтаксис.

Однако, если вы включите .ONESHELL:, эта логика изменится, и команды будут выполняться в одной оболочке, что позволит ему работать:

.ONESHELL:

all:
    cat << EOF
    aaa
    bbb
    EOF

Имейте в виду, что это повлияет на работу Make. В частности, Make может не заметить сбой одной строки сборки, если за ней следуют другие. Обычно проверяется результат каждой строки, но с .ONESHELL:make может видеть только результат всех строк.

0
26.04.2021, 03:52
1 ответ

Если вы хотите использовать юнит systemd внутри контейнера, вам нужно установить systemd в контейнере и убедиться, что это первый процесс; например, вот как запустить Apache httpd под управлением systemd:

FROM fedora:33
ENV container docker
RUN dnf -y install httpd; dnf clean all; systemctl enable httpd
STOPSIGNAL SIGRTMIN+3
EXPOSE 80
CMD [ "/sbin/init" ]

Вам также необходимо убедиться в наличии нескольких томов:

docker run -d --tmpfs /tmp --tmpfs /run -v /sys/fs/cgroup:/sys/fs/cgroup:ro httpd

(при условии, что ваш встроенный образ называетсяhttpd).

Подробнее см. Запуск systemd в непривилегированном -контейнере или Как запустить systemd в контейнере для более простого подхода с использованием Podman.

Возможно, вам будет проще переделать контейнер, чтобы он не использовал модуль systemd.

1
28.04.2021, 22:51

Теги

Похожие вопросы