Как запустить systemctl enable xxx при сборке docker? - PullRequest
0 голосов
/ 08 апреля 2020

Надеюсь, этот вопрос вас всех устраивает.

В настоящее время я пытаюсь создать образ контейнера Docker и столкнулся с проблемой. Моя оригинальная идея для Dockerfile заключалась в следующем:

FROM centos:7
ENV container docker
RUN (cd /lib/systemd/system/sysinit.target.wants/; for i in *; do [ $i == \
systemd-tmpfiles-setup.service ] || rm -f $i; done); \
rm -f /lib/systemd/system/multi-user.target.wants/*;\
rm -f /etc/systemd/system/*.wants/*;\
rm -f /lib/systemd/system/local-fs.target.wants/*; \
rm -f /lib/systemd/system/sockets.target.wants/*udev*; \
rm -f /lib/systemd/system/sockets.target.wants/*initctl*; \
rm -f /lib/systemd/system/basic.target.wants/*;\
rm -f /lib/systemd/system/anaconda.target.wants/*;
VOLUME [ "/sys/fs/cgroup" ]
CMD ["/usr/sbin/init"]

И сохранение этого как базового изображения с использованием docker build -t baseimage .. Пока все хорошо.

Установщик приложения - это .run, который, помимо прочего, выполняет что-то вроде systemctl start xxx.service (я не могу это изменить, и установка завершится неудачей, если эта часть завершится неудачей).

Я уже пробовал некоторые вещи для второго Dockerfile, такие как:

FROM baseimage
...
COPY xxx.run xxx.run
RUN ./xxx.run # This return an error like "Failed to get D-Bus connection: Operation not permitted"
...

и изменение исходного CMD для запуска этого скрипта:

#! /bin/bash
/usr/sbin/init # With and without & after this one
./xxx.run

Есть идеи?

Ответы [ 2 ]

0 голосов
/ 09 апреля 2020

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

0 голосов
/ 08 апреля 2020

Ваша сборка пытается выполнить привилегированную операцию. Проблема в том, что флаг --privileged недоступен во время сборки. Вот вопрос, который делает интересное чтение: https://github.com/moby/moby/issues/1916

TL; DR, кажется, есть две возможности с самим docker

Другим решением вне docker было бы использование buildah, но это гораздо более длинный выстрел. Но интересный, особенно если вы работаете в экосистеме RedHat, поскольку они хотят избавиться от Docker в пользу Buildah / Podman. Вот начало . Хотя мне неясно, как она решит вашу проблему, она была отмечена как способная решать подобные проблемы.

...