ベース イメージの作成¶
ほとんどの Dockerfile は
親イメージ はイメージの土台(ベース)となるイメージです。 Dockerfile の
FROM
命令で内容を指定します。 Dockerfile で以降に続く命令では、この親イメージに対して変更を加えます。ほとんどの Dockerfile はベース イメージではなく、何らかの親イメージからスタートします。しかし、これらの用語は同じ意味で使用されることもあります。ベース イメージ は Dockerfile の中で
FROM scratch
の指定があります。
このトピックではベース イメージの作成方法をいくつか紹介します。特定の手順では、パッケージが必要となるため特定の Linux ディストリビューションに強く依存します。以下でいくつかの例を示しますが、新しい例を pull request を通して貢献いただくことも歓迎します。
tar を使ってイメージ全体を作成¶
一般的に、親イメージとしてパッケージしたいディストリビューションが動作しているマシンから始めます。しかし、この作業は Debian の Debootstrap のようなツールを用いる場合は不要であり、Ubuntu イメージの構築にあたっても同様です。
この Ubuntu 親イメージの作成は、シンプルにできます。
$ sudo debootstrap focal focal > /dev/null
$ sudo tar -C focal -c . | docker import - focal
sha256:81ec9a55a92a5618161f68ae691d092bf14d700129093158297b3d01593f4ee3
$ docker run focal cat /etc/lsb-release
DISTRIB_ID=Ubuntu
DISTRIB_RELEASE=20.04
DISTRIB_CODENAME=focal
DISTRIB_DESCRIPTION="Ubuntu 20.04 LTS"
Docker Github リポジトリ には、親イメージを作成するためのサンプルスクリプトがあります。
scratch を使ってシンプルな親イメージを作成¶
コンテナ構築用のスタート地点ととして、Docker で確保している最小イメージ、 scratch
を利用できます。 scratch
「イメージ」を使うと、構築プロセスは Dockerfile
の次の命令から始まることとなり、これがイメージの1番目のファイルシステム・レイヤーになります。
Docker Hub の Docker リポジトリに scratch
命令が出てきても、 scratch
という名前でイメージの取得・送信・実行・タグ付けはできません。そのかわり、 Dockerfile
の中から参照できるものです。たとえば、最も小さなコンテナを scratch
を使って作成するには、次のようになります。
# syntax=docker/dockerfile:1
FROM scratch
ADD hello /
CMD ["/hello"]
https://github.com/docker-library/hello-world/ にある命令を使って、「hello」を実行する例を考えましょう。この時、 -static
フラグを付けてコンパイルしているとします。これを使って Docker イメージを構築する docker build
は、次のようになります。
docker build --tag hello .
最後に .
記号を付けるのを忘れないでください。これは、現在のディレクトリを
注釈
Docker Desktop for Mac と Docker Desktop for Windows は Linux 仮想マシンを使いますので、Linux バイナリが必要です。Mac や Windows に対応したバイナリではありません。Docker コンテナを使って、次のようにして構築できます。
$ docker run --rm -it -v $PWD:/build ubuntu:20.04
container# apt-get update && apt-get install build-essential
container# cd /build
container# gcc -o hello -static -nostartfiles hello.c
新しいイメージを実行するには、 docker run
コマンドを実行します。
docker run --rm hello
この例ではチュートリアルにある hello-world イメージから作成したものです。自分自身で検証したい場合は、 イメージのリポジトリ をクローンできます。
更なる情報¶
Dockerfile
を書くのに役立つ沢山の情報があります。
Dockerfile
のリファレンス・セクションでは、 全ての命令に対する完全なガイド があります。明確で読みやすくメンテナンスのしやすい
Dockerfile
を書くには、こちらにある ベストプラクティス・ガイド が役立つでしょう。あなたの目標が何らかの新しい公式イメージの作成であれば、 Docker の 公式イメージ にある記述をご覧ください。
参考
- Create a base image