Запуск 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.

Другие вопросы по тегам