現在開発中のコンピュータで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/bash
chrootで実行し、追加設定を実行してください。- 完了したら、すべてを削除します
/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
- 設定が完了すると、
tar
chrootファイルシステムを起動し、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
...しかし、要件は異なる場合があります。