Простой ответ — «не по умолчанию». Но вы можете настроить GNU make, чтобы разрешить это, используя.ONESHELL:
Обычно каждая строка рецепта выполняется в отдельной оболочке. Что еще хуже, есть способ сделать многострочные команды -в make, используя \
в конце строки для продолжения. К сожалению, это \
также передается в оболочку , что менее проблематично для других команд, но для heredoc это действительно портит синтаксис.
Однако, если вы включите .ONESHELL:
, эта логика изменится, и команды будут выполняться в одной оболочке, что позволит ему работать:
.ONESHELL:
all:
cat << EOF
aaa
bbb
EOF
Имейте в виду, что это повлияет на работу Make. В частности, Make может не заметить сбой одной строки сборки, если за ней следуют другие. Обычно проверяется результат каждой строки, но с .ONESHELL:
make может видеть только результат всех строк.
Если вы хотите использовать юнит 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.