Как создать chroot с помощью докера?

Существует разница между логическими и физическими путями к каталогам, с которыми вы столкнулись.

cd /home/me/opencv/build

Это поместит вас в логический каталог /home/me/opencv/build, но физически вы на самом деле в /media/me/pendrive/opencv/buildблагодаря символической ссылке.

ls..покажет вам содержимое физического родительского каталога /media/me/pendrive/opencv.

Путь к физическому каталогу — это путь к логическому каталогу со всеми разрешенными символическими ссылками. Они одинаковы, если путь к логическому каталогу не содержит только символические ссылки.

См. также разницу между pwd -Lи pwd -P, находясь в каталоге сборки (и прочитав pwdруководство ).

cdтакже имеет флаги -Lи -P-Lпо умолчанию ).

0
30.10.2019, 20:32
2 ответа

Первоначально я думал, что проблема связана с тем, как я запрограммировал сценарий, запускаемый контейнером Docker, для создания chroot.

В док-контейнере можно создать 32-битный -chroot. Мне пришлось запустить привилегированный контейнер , иначе я не смог бы смонтировать необходимые каталоги/файловые системы (Ex:/proc)в chroot (И получил бы ошибки ).

Мне пришлось немного изменить шаги, которые я использовал:

  • Команда docker, которую я использовал, была :docker run -t --rm --name "chrootTest" -v $(pwd):/root/<CHROOT_SCRIPT_DIR> --privileged --workdir /root/<CHROOT_SCRIPT_DIR> <IMAGE>:<TAG>./build-chroot.sh <CHROOT_DIR_LOCATION>
  • Мне не нужно монтировать /devили /sysдля модификаций chroot, которые я делаю.(Изменения заключаются в удалении каталогов/файлов/символических ссылок иapt-get install-добавлении некоторых зависимостей. Мне нужно было смонтировать только /procдля этих действий, но если вы делаете что-то другое, вам может понадобиться смонтировать другие каталоги.)
  • Сценарий распаковывает архив в <CHROOT_DIR_LOCATION>и копирует resolve.confс хоста в незаархивированную файловую систему, а также создает все необходимые каталоги для монтирования.
  • Затем у меня есть документ, который переходит в chroot и выполняет необходимые настройки.chroot "$CHROOT_DIR_LOCATION" /bin/bash <<'EOF'... EOF
  • После установки я tarзапускаю файловую систему chroot и удаляю рабочий каталог <CHROOT_DIR_LOCATION>, сценарий завершается, а контейнер докеров удаляется.

Из-за монтирования тома tar-архив с вновь созданным chroot все еще существует на хосте, выполняющем команду docker.

1
28.01.2020, 03:10

Я использую docker для внесения изменений в Live CD установщика Ubuntu. Он содержит среду casper/filesystem.squashfs, похожую на среду chroot; т. е. это полная корневая файловая система, которая записывается в целевую файловую систему во время установки. Я вношу изменения в filesystem.squashfsвот так:

# extract installer iso
$ osirrox -indev ubuntu-18.04.4-desktop-amd64.iso -extract././ubuntu-18.04.4-desktop-amd64.d

# extract filesystem squashfs
$ unsquashfs ubuntu-18.04.4-desktop-amd64.d/casper/filesystem.squashfs

# create filesystem tarball
$ tar -cf squashfs-root.tar -C squashfs-root.

# create docker image 
$ docker image import squashfs-root.tar squashfs-root:latest

# create docker container, make changes inside
$ docker run --name squashfs-mine squashfs-root sh -c 'touch /etc/my.conf'

К этому моменту теперь -остановленный контейнер squashfs-mineсодержит исходную файловую систему вместе со всеми изменениями, выполненными во время ее run. Теперь вы можете exportиспользовать файловую систему контейнера как tar-архив:

# extract filesystem tarball
$ docker export -o squashfs-mine.tar squashfs-mine

В моем случае я хотел бы сгенерировать новый filesystem.squashfsв исходное содержимое *.isoи повторно -упаковать*.iso:

# populate filesystem directory
$ tar -xf squashfs-mine.tar --one-top-level

# create filesystem squashfs
$ mksquashfs squashfs-mine ubuntu-18.04.4-desktop-amd64.d/casper/filesystem.squashfs

# re-pack iso
$ xorriso -as mkisofs... -o ubuntu-18.04.4-desktop-amd64.iso ubuntu-18.04.4-desktop-amd64.d

...но ваши потребности, вероятно, другие.

0
28.07.2020, 20:18

Теги

Похожие вопросы