dockerを使ってchrootを構築する方法は?

dockerを使ってchrootを構築する方法は?

現在開発中のコンピュータでUbuntu 18.04 32ビットchrootを構築できます。 Dockerコンテナ内でプロセスを実行できるかどうかを知りたいです。

私が使用するプロセス:

  • Ubuntuの基本画像を解凍する(ubuntu-base-18.04.3-base-i386.tar.gz
  • resolve.confホストから解凍されたファイルシステムにファイルをコピーする
  • インストールと/sys/proc/dev
  • chroot /location/of/filesystem /bin/bashchrootで実行し、追加設定を実行してください。
  • 完了したら、すべてを削除します/location/of/filesystem

Dockerコンテナ内でも同じ方法を実行できますか?

Dockerコンテナ内でファイルをマウント/マウント解除する方法については何も表示されません。

答え1

最初に遭遇した問題は、chrootを生成するためにdockerコンテナで実行されるスクリプトを書く方法にあったようです。

Dockerコンテナから32ビットchrootを作成できます。特権コンテナーを実行する必要があります。そうしないと、必要なディレクトリ/ファイルシステム(たとえば/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マウントしたりchrootする必要はありません/sys。 (修正には、ディレクトリ/ファイル/symlinkの削除といくつかのapt-get install依存関係の指定が含まれます。これらの操作だけをマウントする必要がありますが/proc、他の作業を実行する場合は、別のディレクトリをマウントする必要があるかもしれません。)
  • スクリプトはアーカイブを抽出してホストから抽出されたファイルシステムにコピーし、インストール<CHROOT_DIR_LOCATION>resolve.conf必要なディレクトリも作成します。
  • その後、chrootに移動して必要な設定を実行するheredocがあります。 chroot "$CHROOT_DIR_LOCATION" /bin/bash <<'EOF' ... EOF
  • 設定が完了すると、tarchrootファイルシステムを起動し、workdirを削除し、<CHROOT_DIR_LOCATION>スクリプトを終了し、dockerコンテナを削除しました。

ボリュームマウントのために新しく作成されたchrootを含むtarアーカイブは、dockerコマンドを実行しているホストにまだ存在します。

答え2

私はdockerを使用してUbuntuインストーラLive CDを変更します。これには環境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元のファイルシステムとその中のファイルが含まれます。これで、コンテナのファイルシステムをtarとして保存runできます。export

# 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

...しかし、要件は異なる場合があります。

関連情報