Команды runc и ctr не показывают образы и контейнеры Docker
У меня есть несколько образов Docker и контейнеров, работающих на виртуальной машине. Но такие команды, как "runc list", не перечисляют ничего из этого.
Как я могу сделать runc/containerd осведомленным о моих существующих образах докеров?
1 ответ
Время выполнения (runc
) использует так называемый корневой каталог времени выполнения для хранения и получения информации о контейнерах. В этом корневом каталоге runc
размещает подкаталоги (по одному на контейнер), и каждый из них содержит state.json
файл, в котором находится описание состояния контейнера.
Расположение по умолчанию для корневого каталога времени выполнения: /run/runc
(для контейнеров без корней) или $XDG_RUNTIME_DIR/runc
(для контейнеров без корней) - последний также обычно указывает где-то под /run
(например /run/user/$UID/runc
).
Когда запускается контейнерный двигатель runc
, он может переопределить корневой каталог по умолчанию во время выполнения и указать пользовательский (--root
вариант runc
). Docker использует эту возможность, например, на моей коробке, он указывает /run/docker/runtime-runc/moby
как корень времени выполнения.
Тем не менее, чтобы сделать runc list
чтобы увидеть ваши контейнеры Docker, вы должны указать его на корневой каталог среды выполнения Docker, указав --root
вариант. Кроме того, учитывая, что контейнеры Docker по умолчанию не являются корневыми, вам потребуются соответствующие привилегии для доступа к корневому каталогу среды выполнения (например, с sudo
).
Итак, вот как это должно работать:
$ docker run -d alpine sleep 1000
4acd4af5ba8da324b7a902618aeb3fd0b8fce39db5285546e1f80169f157fc69
$ sudo runc --root /run/docker/runtime-runc/moby/ list
ID PID STATUS BUNDLE CREATED OWNER
4acd4af5ba8da324b7a902618aeb3fd0b8fce39db5285546e1f80169f157fc69 18372 running /run/docker/containerd/daemon/io.containerd.runtime.v1.linux/moby/4acd4af5ba8da324b7a902618aeb3fd0b8fce39db5285546e1f80169f157fc69 2019-07-12T17:33:23.401746168Z root
Что касается изображений, вы не можете сделать runc
увидеть их, так как он вообще не имеет представления об изображении - вместо этого он работает на связках. Создание пакета (например, на основе изображения) является обязанностью вызывающей стороны (в вашем случае - containerd).