Запуск systemd в управляемом плагине Docker
Как ты бежишь systemd
в Docker управляемый плагин? С обычным контейнером я могу запустить centos / systemd и запустить сервер Apache, используя их пример Dockerfile
FROM centos/systemd
RUN yum -y install httpd; yum clean all; systemctl enable httpd.service
EXPOSE 80
CMD ["/usr/sbin/init"]
И запустить его следующим образом
docker build --rm --no-cache -t httpd .
docker run --privileged --name httpd -v /sys/fs/cgroup:/sys/fs/cgroup:ro -p 80:80 -d httpd
Однако, когда я пытаюсь создать управляемый плагин, возникают проблемы с cgroups.
Я пытался положить в config.json
{
"destination": "/sys/fs/cgroup",
"source": "/sys/fs/cgroup",
"type": "bind",
"options": [
"bind",
"ro",
"private"
]
}
{
"destination": "/sys/fs/cgroup",
"source": "/sys/fs/cgroup",
"type": "bind",
"options": [
"bind",
"ro",
"rprivate"
]
}
{
"destination": "/sys/fs/cgroup",
"source": "/sys/fs/cgroup",
"type": "bind",
"options": [
"rbind",
"ro",
"rprivate"
]
}
Я также попробовал следующее, что повредит cgroup хоста, который может потребовать полной перезагрузки для восстановления.
{
"destination": "/sys/fs/cgroup/systemd",
"source": "/sys/fs/cgroup/systemd",
"type": "bind",
"options": [
"bind",
"ro",
"private"
]
}
{
"destination": "/sys/fs/cgroup",
"source": "/sys/fs/cgroup",
"type": "bind",
"options": [
"bind",
"ro",
"private"
]
}
Похоже, это связано с тем, как opencontainer и moby взаимодействуют. https://github.com/moby/moby/issues/36861
2 ответа
Вот как я это сделал на своем https://github.com/trajano/docker-volume-plugins/tree/master/centos-mounted-volume-plugin
Главное, что нужно сделать, это сохранить /run/docker/plugins
до systemd
начинает и вытирает /run
папка. Затем убедитесь, что вы создали сокет в новой папке.
mkdir -p /dockerplugins
if [ -e /run/docker/plugins ]
then
mount --bind /run/docker/plugins /dockerplugins
fi
Другое дело, что управляемые плагины Docker добавляют неявное /sys/fs/cgroup
ПОСЛЕ определенного монтирования в конфигурации, поэтому создание монтирования только для чтения не будет работать, если оно не было восстановлено до запуска systemd.
mount --rbind /hostcgroup /sys/fs/cgroup
С монтированием в config.json как
{
"destination": "/hostcgroup",
"source": "/sys/fs/cgroup",
"type": "bind",
"options": [
"bind",
"ro",
"private"
]
}
Создание сокета необходимо настроить, так как помощники плагина пишут в /run/docker/plugins
l, err := sockets.NewUnixSocket("/dockerplugins/osmounted.sock", 0)
if err != nil {
log.Fatal(err)
}
h.Serve(l)
Ниже показан процесс, описанный выше, о том, как я достиг этого на своем плагине.
Вы можете запустить httpd в контейнере centos без systemd - по крайней мере, для тестов с помощью сценария https://github.com/gdraheim/docker-systemctl-replacement.