Как обнаружить, что контейнерная система LXC готова?

689
anumi

Я пытаюсь запустить контейнер LXC, а затем запустить команду внутри него. Проблема в том, что даже если контейнер находится в состоянии RUNNING, он не завершил всю свою загрузку. Это создает проблемы с / tmp (и, я думаю, с другими инициализациями).

Это можно проиллюстрировать с помощью этой последовательности вызовов, которая создает контейнер, запускает его, ожидает его состояния RUNNING и выполняет некоторые команды; Команды создают файл / tmp / hello, показывают каталог, немного ждут и снова показывают каталог:

lxc-clone -B overlayfs -s -o vm -n c1 ; lxc-start -n c1 ; lxc-wait -n c1 -s RUNNING ; lxc-attach -n c1 -- su -c "touch /tmp/hello; ls -la /tmp; sleep 5; ls -la /tmp" slave ; lxc-stop -n c1 ; lxc-destroy -n c1

чей вывод

Created container c1 as snapshot of vm total 16 drwxrwxrwt 1 root root 4096 May 24 09:37 . drwxr-xr-x 1 root nogroup 4096 May 24 09:37 .. drwxrwxrwt 2 root root 4096 May 22 21:19 .ICE-unix drwxrwxrwt 2 root root 4096 May 22 21:19 .X11-unix -rw-rw-r-- 1 slave slave 0 May 24 09:37 hello total 16 drwxrwxrwt 1 root root 4096 May 24 09:37 . drwxr-xr-x 1 root nogroup 4096 May 24 09:37 .. drwxrwxrwt 2 root root 4096 May 24 09:37 .ICE-unix drwxrwxrwt 2 root root 4096 May 24 09:37 .X11-unix

и показывает, что файл / tmp / hello удален некоторым сценарием инициализации.

Как ждать внутри контейнера, пока система не загрузится полностью? Кроме того, как это сделать снаружи контейнера?

4

1 ответ на вопрос

4
Jarrad

Для контейнера, работающего на systemd, кажется, это работает хорошо:

lxc-attach -n [CONTAINER NAME] -- systemctl isolate multi-user.target 

Возможно, вы могли бы применить ту же логику для контейнера sysvinitили на upstartоснове (запустить команду, которая блокирует, пока не будет достигнут уровень выполнения), но я не мог сказать вам, какие команды могут сделать это из головы.