私は基本的に次のことをしたいと思います。というユーティリティを想像してみましょうlayer
。
# sudo layer somefile apt install gcc
layer
aptは一種のコンテナから始まります。 Aptは実際のファイルシステムにgccがインストールされていると思いますが、実際にはファイルシステム全体に引き続きアクセスできますsomefile
。apt
だからドッカーとは異なります。
これにより、次のことができます。
# sudo layer somefile bash
bash# gcc -c foo.c
bash
実際にはシステムにインストールされていませんが、一種のgcc
コンテナ/刑務所ですが、ファイルシステムの残りの部分にアクセスできます。私の目的は、ファイルシステムを汚染することなく仮想開発環境を作成することです。apt
gcc
somefile
これを行う方法はありますか?
答え1
一部のカスタムスクリプトが気に入らない場合は、次のものを使用できます。ファイルシステムの上書き(2014年からLinuxカーネルに含まれる)
OverlayFSは、2つのファイルシステムの場所を互いに重ね合わせて表示します。lower
つまり、マウントポイントの任意の項目によって変更または非表示にされていない限り、マウントポイントの表示のすべての内容が上書きされますupper
。上書きするマウントポイントに対するすべての変更は記録されませupper
んlower
。
また、OverlayFSにはwork
明示的に文書化されていませんが、修正がありますupper
。
これにより、探しているコンテナの種類を作成できます(下記の可能な極端な場合を参照)。
mkdir -p /var/tmp/myoverlay/{upper,work,mount}
mount -t overlay -o lowerdir=/,upperdir=/var/tmp/myoverlay/upper,workdir=/var/tmp/myoverlay/work overlayfs /var/tmp/myoverlay/mount
コンテナを侵入するにはchroot
(「change root」)コマンドを使用して、新しく作成されたコンテナからコマンド(シェルまたはその他)を実行できます/var/tmp/myoverlay/mount
。
chroot /var/tmp/myoverlay/mount
# or
chroot /var/tmp/myoverlay/mount /usr/bin/apt moo # paths are relative to the new root directory
ハードウェアデバイス、擬似端末、プロセス、またはシステム機能にアクセスしようとするプログラムの場合、これは十分ではない可能性があります。これらの機能は、カーネルで特別にインストール可能なファイルシステムとして提供されます。以下の出力を参照してくださいmount
。
proc on /proc type proc
sysfs on /sys type sysfs
udev on /dev type devtmpfs
devpts on /dev/pts type devpts
マウントポイントを上書きするためにインストールできます(入力する前に)。
mount -t proc proc /var/tmp/myoverlay/mount/proc
mount -t sysfs sys /var/tmp/myoverlay/mount/sys
mount -t devtmpfs dev /var/tmp/myoverlay/mount/dev
mount -t devpts devpts /var/tmp/myoverlay/mount/dev/pts
これにより、コンテナが必要なものよりもシステムにさらにアクセスを許可できます。最終的に、オーバーレイファイルシステムが特定のユースケースに対して通常のシステムと十分に分離されていることを確認するには、正しいユースケースを知る必要があります。
ファイルシステムのレイアウトによっては、さらに困難がある可能性があります。ディレクトリは、lower
その下にマウントされた他のファイルシステムを考慮していないまま使用されます。たとえば、/home
別のファイルシステムがある場合、OverlayFSはにある空のマウントポイントのみを表示します/home
。
そのような場合は、マウントポイントごとに別々のオーバーレイを作成し、別のオーバーレイをルートオーバーレイにインストールする必要があります。
この時点では、適切な仮想化がより賢明な選択であることがよくあります。
答え2
overlay
ファイルシステムを使用できます。
modprobe overlay
mkdir -p /path/data /path/work /path/mount
mount -t overlay overlay -o lowerdir=/,upperdir=/path/data,workdir=/path/work /path/mount
これで、ルートディレクトリのすべてのエントリにchroot
アクセスし/path/mount
て表示できますが、変更は記録されます。後で同じオプションを使用して削除して再インストール/path/data
できます。/path/mount