Docker Buildx build で「1 つの引数が必要です」エラーを解決する方法

DockerBeginner
オンラインで実践に進む

はじめに

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(ビルドコンテキスト)を含むディレクトリへのパスです。

このエラーが発生する一般的なシナリオには、以下が含まれます。

  1. ビルドコンテキストの指定を忘れた場合
  2. 不正なコマンド構文を使用した場合
  3. オプションの順序が間違っている場合

エラーの修正

ビルドコンテキストを追加して、コマンドを修正しましょう。最も簡単な方法は、現在のディレクトリを示すために . を使用することです。

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 での追加のオプションをいくつか見てみましょう。

  1. イメージをビルドし、Docker のローカルイメージストアにロードする。
docker buildx build --load -t nginx-test:local .
  1. ビルドキャッシュを使用せずにビルドする(強制的に新規ビルドを行う)。
docker buildx build --no-cache -t nginx-test:nocache .
  1. 最終的なイメージ 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」エラーのトラブルシューティング方法を学びました。達成した内容は次のとおりです。

  1. Docker Buildx を設定し、ビルダーインスタンスを作成しました
  2. テスト用の基本的な Dockerfile を作成しました
  3. 「requires exactly 1 argument」エラーに遭遇し、理解し、解決しました
  4. さまざまなオプションと構成で Docker イメージをビルドしました
  5. マルチアーキテクチャイメージのビルドの基本を学びました

これらのスキルは、アプリケーションが多様なハードウェアプラットフォームで実行される必要がある、最新の開発環境で Docker を使用するための強固な基盤を提供します。これで、Docker Buildx を自信を持って使用し、一般的なエラーを回避しながら、効率的でプラットフォーム固有のコンテナイメージを作成できます。

Docker の旅を続ける中で、より高度な Buildx 機能の探求、CI/CD パイプラインへの統合、そしてどこでも実行できる真にポータブルなアプリケーションの構築を検討してください。