docker-composeビルド用のパッチ
以前、Raspberry Pi用docker-composeの構築(1.28.0)という記事を書きました。そこでは、「Raspberry Piでビルドする際にはパッチが必要です」と書いていたのですが、その原因がわかリました。
makeを実行してビルドする際に実行されるビルド用のスクリプトから実行されるコマンドとして”docker build”ではなく新しい”docker buildx”を使う必要があります。
この”docker buildx”はDocker 18.09以上でサポートされていて、BuildKitを統合して性能と機能が拡張されたものとなっています。
またMacやWindowsで使用しているDocker Desktopの場合には、この新しい”docker buildx”を使うようにあらかじめ設定されています。
docker buildxの有効化
明示的に”docker buildx build”として実行すればBuildKitを使った新しい形式で構築できるのですが、次のようにして有効化することができます。
環境変数の設定
次のようにDOCKER_BUILDKIT環境変数を設定して、”docker build”を実行することでBuildKitでの構築が有効化されます。
$ export DOCKER_BUILDKIT=1
Dockerサーバー設定
/etc/docker/daemon.jsonファイルに次のエントリーを追加することで BuildKitでの構築を有効化します。MacやWindowsのDocker Desktopでは、あらかじめこの設定が追加されています。
{ "features": { "buildkit": true } }
設定を反映させるために、dockerを再起動するか、システムを再起動しておきます。
docker-composeの構築
まず、docker-composeをGithubからクローンします。
$ git clone https://github.com/docker/compose.git
現在(2021/06/30)の最新版が1.29.2ですから、チェックアウトしておきます。
$ cd compose
$ git checkout 1.29.2
続けて、makeを実行します。
$ make
ところが、この状態では次のようなエラーメッセージが表示されています。
+ ARCH=aarch64
+ mv dist/docker-compose-linux-amd64 dist/docker-compose-Linux-aarch64
mv: 'dist/docker-compose-linux-amd64' を stat できません: そのようなファイルやディレクトリはありません
これは、構築時に実行されているscript/build/linuxの最終行にあるmvコマンドが”docker-compose-linux-amd64″として書かれているためです。ところが、distディレクトリーには”docker-compose-linux-arm64″として実行可能なファイルが作成されているので当面はエラーメッセージを無視しておきましょう。
distディレクトリーに作成されているファイルを実行すると次のように正しく実行出来ています。
$ ./docker-compose-linux-arm64 version
docker-compose version 1.29.2, build 5becea4c
docker-py version: 5.0.0
CPython version: 3.7.10
OpenSSL version: OpenSSL 1.1.0l 10 Sep 2019
そこで、このファイルをコピーしておけば大丈夫です。
$ sudo cp docker-compose-linux-arm64 /usr/local/bin/docker-compose
docker-compose構築後の整理
docker buildxコマンドを使って構築しているために、マルチステージ・ビルドで実行していても途中で作成されたDockerイメージが”<none>”として残っていることはありません。
最後にエラーメッセージが表示されてはいますが、docker-composeのリポジトリーを修正しないでもdocker buildxを使う方式でdocker-composeを構築することができるようになりました。