![Как определить готовность контейнерной системы LXC?](https://rvso.com/image/1451564/%D0%9A%D0%B0%D0%BA%20%D0%BE%D0%BF%D1%80%D0%B5%D0%B4%D0%B5%D0%BB%D0%B8%D1%82%D1%8C%20%D0%B3%D0%BE%D1%82%D0%BE%D0%B2%D0%BD%D0%BE%D1%81%D1%82%D1%8C%20%D0%BA%D0%BE%D0%BD%D1%82%D0%B5%D0%B9%D0%BD%D0%B5%D1%80%D0%BD%D0%BE%D0%B9%20%D1%81%D0%B8%D1%81%D1%82%D0%B5%D0%BC%D1%8B%20LXC%3F.png)
Я пытаюсь запустить контейнер 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 удален каким-то скриптом инициализации.
Как дождаться полной загрузки системы внутри контейнера? И как это сделать извне контейнера?
решение1
Для контейнера, работающего на systemd, похоже, это работает хорошо:
lxc-attach -n [CONTAINER NAME] -- systemctl isolate multi-user.target
Вероятно, вы могли бы применить ту же логику для контейнера на основе sysvinit
или upstart
(запустить команду, которая блокирует выполнение до тех пор, пока не будет достигнут уровень выполнения), но я не могу сходу сказать, какие команды могут это сделать.
решение2
В моем случае я считаю контейнер LXC «готовым», когда у него есть сетевое подключение (например, чтобы команды, такие как , apt update
работали в скрипте настройки контейнера LXC).
На Debian 11 bullseye в качестве хоста lxc с контейнером Debian 11 bullseye lxc мне удалось успешно использовать следующую схему:
lxc-unpriv-start -n "$LXC_CONTAINER"
lxc-wait -n "$LXC_CONTAINER" -s RUNNING
# the lxc-wait RUNNING state is not that useful;
# a container is already considered RUNNING even though the network is not yet up
# the following command blocks until the container's network is up
lxc-unpriv-attach -n "$LXC_CONTAINER" -- systemctl start systemd-networkd-wait-online.service
# when the script reaches this part, the lxc container's network probably is completely up and running
lxc-unpriv-attach -n "$LXC_CONTAINER" -- apt update
# ...
Соответствующая systemctl start systemd-networkd-wait-online.service
часть:
systemd-networkd-wait-online.service
— это готовая к использованию служба systemd, для которой требуется толькоnetwork-online.target
(по крайней мере, я так понимаю).
Поэтому выполнение systemctl start systemd-networkd-wait-online.service
блоков происходит до тех пор, пока сеть не будет запущена.