はじめに
Dockerfile
で宣言するFROM centos:7
などのベースイメージは公式で配布するもの使用するのが一般的ですが、こういったベースイメージは実は自前の物を使う事もできます1。今回は自分が使用しているシステムをそのままDockerイメージ化する方法をまとめて置きます。
Dockerイメージの作り方
Linuxでベースイメージを作るにはそのままで稼働できるファイルの群れ、すなわちルートファイルシステム2が必要です。今回は使用中のLinuxシステムをそのままイメージ化することが目的なのでシステム自体を圧縮してファイル化します。
1. 全体のシステムをコピーする
rsync
を使ってシステムのスナップショットを作ります。その時、/dev
, /proc/
, /sys/
, /run
, /mnt
は現在のマシーンに依存するディレクトリーなので除外します。
下記の例では/mnt/copy
にシステムをコピーします。
rsync -avz /* /mnt/copy/ --exclude '/dev' --exclude '/proc' --exclude '/sys' --exclude '/run' --exclude '/mnt'
2. 除外したディレクトリーを生成する
除外したディレクトリーもまたシステムに必要なものなので空のディレクトリーを生成します。
mkdir /mnt/copy/sys /mnt/copy/dev /mnt/copy/proc /mnt/copy/run /mnt/copy/mnt
3. tar.gz
に圧縮する
軽量化のためにtar.gz
を使います。また、この時、ルートが/
になるようにすることが重要です。今回は /mnt
の中で-C
オプションを使いました。
cd /mnt
tar -czvf my-linux.tar.gz -C copy .
4. Tarballを使ってイメージを作る
Tarball
をそのままimport
する方法3とDockerfile1を使う方法があります。
Tarballをそのまま取り入れる
docker import my-linux.tar.gz
Dockerfileでイメージをビルドする
FROM scratch
ADD my-linux.tar.gz /
CMD ["/bin/bash"]
docker build --tag my-linux:lastet .
-
Create a base image, https://docs.docker.com/develop/develop-images/baseimages/ ↩ ↩2
-
root ファイルシステム, https://www.ibm.com/docs/ja/aix/7.2?topic=tree-root-file-system ↩
-
docker import, https://docs.docker.com/engine/reference/commandline/import/ ↩