Docker buildx 内での pull 時にプロキシを使う方法

Docker buildx 内での pull 時に、プロキシを使うように設定ファイルから設定方法が知りたいです。

使用中の環境

Docker version 23.0.1

または

Docker version 20.10.21

20系 と 23系 で、 docker build した際に既定で buildx が使われるかどうかの挙動の違いがありますが、後述の例では環境変数の設定で動作の差異がなくなるようにしています。

通常は、 23系にて DOCKER_BUILDKIT 環境変数を設定せず、 BuildKit を使用しています。

発生している問題

プロキシ環境下で Docker を利用する場合、 ~/.docker/config.json の プロキシ設定 や、 Docker デーモン の プロキシ設定 の設定が必要です。
ところが、以下のように docker buildx build での pull 時にだけ、プロキシが利用されずにエラーになります。

shell

1$ DOCKER_BUILDKIT=1 docker build --progress=plain --no-cache - <<'EOF' 2FROM alpine:3.16 3RUN \ 4 printenv 5EOF6 7[...]8 9#3 [internal] load metadata for docker.io/library/alpine:3.1610#3 ERROR: failed to authorize: failed to fetch anonymous token: Get "https://auth.docker.io/token?scope=repository%3Alibrary%2Falpine%3Apull&service=registry.docker.io": read tcp 172.31.111.111:57468->52.1.184.176:443: read: connection reset by peer11------ 12 > [internal] load metadata for docker.io/library/alpine:3.16: 13------ 14Dockerfile:1 15-------------------- 16 1 | >>> FROM alpine:3.16 17 2 | RUN \18 3 | printenv19-------------------- 20ERROR: failed to solve: failed to fetch anonymous token: Get "https://auth.docker.io/token?scope=repository%3Alibrary%2Falpine%3Apull&service=registry.docker.io": read tcp 172.31.111.111:57468->52.1.184.176:443: read: connection reset by peer

52.1.184.176auth.docker.io の IP なので、プロキシが使われずに直接通信してしまっていることがわかります。

なお、以下の通信では期待通りプロキシが有効になっていることを確認しています。

  • docker pull コマンドにて docker デーモン側の pull
  • Legacy Builder 内で pull (例: DOCKER_BUILDKIT=0 docker build -)
  • ビルドステージ内での通信 (例: RUN apk add )
  • コンテナ内での通信 (例: curl http://example.com )

BuildKit を使用しない Legacy Builder は今後使い続けられるものではないため、 BuildKit を使った方法を探しています。

実は、 docker build の呼び出し元で http_proxy, https_proxy 環境変数を設定していると、 docker buildx での pull 時にプロキシが使われることは把握しています。
しかし、サーバーを構成する都合上、呼び出し元の環境変数に依存せたくな事情があります。

docker.json のようにファイルに書き出す形で、 Docker buildx 内での pull 時にプロキシを設定するには、どうしたら良いでしょうか?

コメントを投稿

0 コメント