はじめに
Docker Buildx は、標準の Docker build コマンドを拡張し、マルチアーキテクチャイメージを作成するための高度な機能を提供します。しかし、このツールを使用する際、ユーザーはしばしば「docker buildx build requires exactly 1 argument」エラーに遭遇します。この包括的なチュートリアルでは、Docker Buildx の理解、この一般的なエラーの診断、および効果的な解決策の実装について説明します。
この実験(Lab)の終わりには、Docker Buildx のセットアップ、Docker イメージの作成、「requires exactly 1 argument」エラーのトラブルシューティング、および複数のアーキテクチャに対応したイメージのビルドに関する実践的な経験が得られます。これらのスキルは、最新のコンテナ化されたアプリケーションの開発とデプロイに不可欠です。
Docker Buildx のセットアップ
Docker Buildx は Docker にプリインストールされていますが、使用する前に適切にセットアップする必要があります。このステップでは、Docker がインストールされていることを確認し、Docker Buildx を有効にし、最初のビルダーインスタンスを作成します。
Docker インストールの確認
まず、Docker がシステムにインストールされ、実行されていることを確認しましょう。
docker --version
次のような出力が表示されるはずです。
Docker version 20.10.21, build baeda1f
これにより、Docker がインストールされ、使用できる状態であることが確認されます。
Docker Buildx の理解
Docker Buildx は、BuildKit を使用して Docker の機能を拡張する CLI プラグインです。これにより、以下が可能になります。
- 複数のプラットフォーム(AMD64、ARM64 など)のイメージを同時にビルド
- より効率的なレイヤーキャッシング
- ビルドパフォーマンスの向上
- 高度なビルド機能
Docker Buildx ビルダーの作成
新しい Docker Buildx ビルダーを作成して使用してみましょう。
docker buildx create --name mybuilder --use
出力は次のようになります。
mybuilder
次に、ビルダーが作成され、デフォルトとして設定されていることを確認しましょう。
docker buildx ls
次のような出力が表示されるはずです。
NAME/NODE DRIVER/ENDPOINT STATUS PLATFORMS
mybuilder * docker-container
mybuilder0 unix:///var/run/docker.sock inactive
default docker
default default running linux/amd64, linux/386
mybuilder の横にあるアスタリスク (*) は、現在アクティブなビルダーであることを示しています。
ビルダーの検査
ビルダーの詳細を調べてみましょう。
docker buildx inspect mybuilder
これにより、サポートされているプラットフォームや現在のステータスなど、ビルダーの設定が表示されます。
これで Docker Buildx のセットアップが正常に完了したので、ビルダーで使用する Dockerfile の作成に進む準備ができました。
テスト用のシンプルな Dockerfile の作成
Docker Buildx を使用してイメージをビルドする前に、シンプルな Dockerfile を作成する必要があります。これは、「requires exactly 1 argument」エラーを理解するためのテストケースとして機能します。
Dockerfile の理解
Dockerfile は、Docker イメージをビルドするための命令を含むテキストドキュメントです。特定の構成でコンテナを作成するプロセスを自動化します。
プロジェクト用のディレクトリを作成しましょう。
mkdir -p ~/project/buildx-test
cd ~/project/buildx-test
基本的な Dockerfile の作成
次に、nano テキストエディタを使用して、シンプルな Dockerfile を作成しましょう。
nano Dockerfile
次の内容を Dockerfile にコピーして貼り付けます。
FROM ubuntu:22.04
RUN apt-get update && apt-get install -y \
curl \
nginx \
&& rm -rf /var/lib/apt/lists/*
EXPOSE 80
CMD ["nginx", "-g", "daemon off;"]
Ctrl+O を押して保存し、Enter を押してから、Ctrl+X を押して nano を終了します。
この Dockerfile を分解してみましょう。
FROM ubuntu:22.04- Ubuntu 22.04 をベースイメージとして使用します。RUN apt-get update...- パッケージリストを更新し、curl と nginx をインストールします。EXPOSE 80- コンテナがポート 80 でリッスンすることを示します。CMD ["nginx", "-g", "daemon off;"]- コンテナが起動したときに nginx をフォアグラウンドで実行します。
.dockerignore ファイルの作成
.dockerignore ファイルは、ビルドコンテキストで不要なファイルやディレクトリを除外するのに役立ち、ビルドをより高速かつ効率的にします。
nano .dockerignore
次の内容を追加します。
.git
.gitignore
*.md
Ctrl+O を押して保存し、Enter を押してから、Ctrl+X を押して nano を終了します。
プロジェクト構造の確認
ファイルが正しく作成されていることを確認しましょう。
ls -la
次のような出力が表示されるはずです。
total 16
drwxrwxr-x 2 labex labex 4096 Jan 1 00:00 .
drwxr-xr-x 3 labex labex 4096 Jan 1 00:00 ..
-rw-rw-r-- 1 labex labex 21 Jan 1 00:00 .dockerignore
-rw-rw-r-- 1 labex labex 159 Jan 1 00:00 Dockerfile
これで基本的な Dockerfile ができたので、次のステップで Docker Buildx をテストし、「requires exactly 1 argument」エラーを調査する準備ができました。
「requires exactly 1 argument」エラーの理解と解決
このステップでは、「requires exactly 1 argument」エラーを意図的に発生させ、その原因を理解し、解決方法を学びます。
エラーの発生
まず、まだそこにいない場合は、プロジェクトディレクトリに移動しましょう。
cd ~/project/buildx-test
次に、ビルドコンテキストを指定せずに Docker Buildx を使用してイメージをビルドしてみましょう。
docker buildx build
次のようなエラーメッセージが表示されるはずです。
"docker buildx build" requires exactly 1 argument.
See 'docker buildx build --help'.
Usage: docker buildx build [OPTIONS] PATH | URL | -
このエラーは、docker buildx build コマンドが、ビルドコンテキスト(Dockerfile を含むディレクトリ)を引数として必要とするために発生します。
エラーの理解
「requires exactly 1 argument」エラーは、Docker Buildx がイメージのビルドに必要なファイルを見つける場所を知る必要があることを意味します。この引数は通常、Dockerfile(ビルドコンテキスト)を含むディレクトリへのパスです。
このエラーが発生する一般的なシナリオには、以下が含まれます。
- ビルドコンテキストの指定を忘れた場合
- 不正なコマンド構文を使用した場合
- オプションの順序が間違っている場合
エラーの修正
ビルドコンテキストを追加して、コマンドを修正しましょう。最も簡単な方法は、現在のディレクトリを示すために . を使用することです。
docker buildx build .
今回は、Docker はビルドプロセスを開始しますが、イメージにタグが付けられていないことに気づき、後で参照するのが難しくなります。
まだ実行中の場合は、Ctrl+C でビルドを停止し、適切なタグを付けてもう一度試してみましょう。
docker buildx build -t nginx-test:latest .
ビルドの進行状況を示す出力が表示されるはずです。
[+] Building 12.8s (7/7) FINISHED
=> [internal] load build definition from Dockerfile 0.0s
=> => transferring dockerfile: 203B 0.0s
=> [internal] load .dockerignore 0.0s
=> => transferring context: 34B 0.0s
=> [internal] load metadata for docker.io/library/ubuntu:22.04 0.5s
=> [1/3] FROM docker.io/library/ubuntu:22.04@sha256:... 0.0s
=> CACHED [2/3] RUN apt-get update && apt-get install -y curl nginx 0.0s
=> CACHED [3/3] EXPOSE 80 0.0s
=> exporting to image 0.0s
=> => exporting layers 0.0s
=> => writing image sha256:... 0.0s
=> => naming to docker.io/library/nginx-test:latest 0.0s
さまざまな Buildx オプションの使用
Docker Buildx での追加のオプションをいくつか見てみましょう。
- イメージをビルドし、Docker のローカルイメージストアにロードする。
docker buildx build --load -t nginx-test:local .
- ビルドキャッシュを使用せずにビルドする(強制的に新規ビルドを行う)。
docker buildx build --no-cache -t nginx-test:nocache .
- 最終的なイメージ ID のみを出力してビルドする。
docker buildx build -q -t nginx-test:quiet .
ビルドされたイメージの確認
ビルドしたイメージを確認しましょう。
docker images | grep nginx-test
次のような出力が表示されるはずです。
nginx-test quiet abcdef123456 5 minutes ago 123MB
nginx-test nocache fedcba654321 5 minutes ago 123MB
nginx-test local 123456abcdef 5 minutes ago 123MB
nginx-test latest abcdef123456 5 minutes ago 123MB
これで、Docker Buildx での一般的な「requires exactly 1 argument」エラーを理解し、さまざまなオプションを使用してイメージを適切にビルドする方法がわかりました。
Docker Buildx を使用したマルチアーキテクチャイメージのビルド
Docker Buildx の最も強力な機能の 1 つは、複数のアーキテクチャのイメージを同時にビルドできることです。このステップでは、マルチアーキテクチャイメージを作成する方法を学びます。
マルチアーキテクチャイメージの理解
マルチアーキテクチャイメージを使用すると、同じイメージ名が異なるプラットフォーム(AMD64、ARM64 など)で動作します。イメージがプルされると、Docker はホストアーキテクチャに適したバージョンを自動的に選択します。
これは、特に以下の場合に役立ちます。
- x86 および ARM ベースのデバイスの両方をサポートする
- アプリケーションがさまざまなクラウドプロバイダーで実行されることを確認する
- さまざまなアーキテクチャを持つ IoT デバイス向けにビルドする
マルチアーキテクチャビルドの設定
Docker Buildx は、マルチアーキテクチャビルド用に設定する必要があります。まず、ビルダーがこの機能をサポートしていることを確認しましょう。
docker buildx inspect --bootstrap mybuilder
ビルダーが利用できないというエラーが表示された場合は、適切な構成で再作成しましょう。
docker buildx rm mybuilder
docker buildx create --name mybuilder --driver docker-container --bootstrap --use
マルチアーキテクチャイメージの作成
次に、複数のアーキテクチャの Nginx イメージをビルドしましょう。
docker buildx build --platform linux/amd64,linux/arm64 -t nginx-test:multi .
次のようなエラーメッセージが表示される場合があります。
error: multiple platforms feature is currently not supported for docker driver. Please switch to a different driver (eg. "docker buildx create --use")
これは、デフォルトの Docker ドライバーがマルチアーキテクチャビルドをサポートしていないために発生します。アプローチを変更しましょう。
デモンストレーションのために、特定のプラットフォーム向けに個別にビルドします。
docker buildx build --platform linux/amd64 -t nginx-test:amd64 --load .
これにより、AMD64 アーキテクチャ専用のイメージがビルドされ、Docker のローカルイメージストアにロードされます。
ビルド引数の使用
Docker Buildx では、ビルド引数を使用してビルドをカスタマイズできます。ビルド引数を使用するように Dockerfile を変更しましょう。
nano Dockerfile
Dockerfile の内容を以下のように更新します。
FROM ubuntu:22.04
ARG PACKAGE=nginx
RUN apt-get update && apt-get install -y \
curl \
${PACKAGE} \
&& rm -rf /var/lib/apt/lists/*
EXPOSE 80
CMD ["nginx", "-g", "daemon off;"]
Ctrl+O を押して保存し、Enter を押してから、Ctrl+X を押して nano を終了します。
これで、カスタムパッケージを使用してイメージをビルドできます。
docker buildx build --build-arg PACKAGE=nginx-extras -t nginx-extras:latest .
レジストリへのプッシュ(オプション)
マルチアーキテクチャイメージを最大限に活用するには、通常、それらをレジストリにプッシュします。これには、Docker Hub の資格情報またはプライベートレジストリが必要です。実際のシナリオでは、コマンドは次のようになります。
## 例のみ - この実験には必要ありません
## docker buildx build --platform linux/amd64,linux/arm64 -t username/nginx-test:multi --push .
イメージの検査
作成したイメージを調べてみましょう。
docker images | grep nginx
次のような出力が表示されるはずです。
nginx-extras latest abcdef123456 1 minute ago 130MB
nginx-test amd64 123456abcdef 2 minutes ago 123MB
nginx-test latest fedcba654321 10 minutes ago 123MB
イメージのテスト
最後に、イメージを使用してコンテナを実行し、動作することを確認しましょう。
docker run -d --name test-nginx -p 8080:80 nginx-test:latest
コンテナが実行されているかどうかを確認します。
docker ps
コンテナが実行されていることを示す出力が表示されるはずです。
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
abcdef123456 nginx-test:latest "nginx -g 'daemon of…" 10 seconds ago Up 10 seconds 0.0.0.0:8080->80/tcp test-nginx
nginx サーバーが応答していることを確認するために、curl を実行しましょう。
curl http://localhost:8080
デフォルトの Nginx ウェルカムページ HTML が表示されるはずです。
完了したら、コンテナをクリーンアップします。
docker stop test-nginx
docker rm test-nginx
おめでとうございます!Docker Buildx を正常に操作し、「requires exactly 1 argument」エラーを理解して解決し、さまざまなアーキテクチャ向けの特殊なビルドを作成する方法を学びました。
まとめ
この実験では、Docker Buildx に関する実践的な経験を積み、一般的な「requires exactly 1 argument」エラーのトラブルシューティング方法を学びました。達成した内容は次のとおりです。
- Docker Buildx を設定し、ビルダーインスタンスを作成しました
- テスト用の基本的な Dockerfile を作成しました
- 「requires exactly 1 argument」エラーに遭遇し、理解し、解決しました
- さまざまなオプションと構成で Docker イメージをビルドしました
- マルチアーキテクチャイメージのビルドの基本を学びました
これらのスキルは、アプリケーションが多様なハードウェアプラットフォームで実行される必要がある、最新の開発環境で Docker を使用するための強固な基盤を提供します。これで、Docker Buildx を自信を持って使用し、一般的なエラーを回避しながら、効率的でプラットフォーム固有のコンテナイメージを作成できます。
Docker の旅を続ける中で、より高度な Buildx 機能の探求、CI/CD パイプラインへの統合、そしてどこでも実行できる真にポータブルなアプリケーションの構築を検討してください。



