daemon.json には DNS、ストレージ、ログの設定がすでに含まれている場合があります。プロキシを変更するときは、それらのキーを残す必要があります。

Mike Farah の yq v4 で各項目を個別に代入し、別の候補ファイルを書き出します。

http_proxy='http://proxy.example:8080' \
https_proxy='http://proxy.example:8080' \
no_proxy='localhost,127.0.0.1,.internal.example' \
yq -o=json '
  .proxies."http-proxy" = strenv(http_proxy) |
  .proxies."https-proxy" = strenv(https_proxy) |
  .proxies."no-proxy" = strenv(no_proxy)
' /etc/docker/daemon.json > daemon.proxy-candidate.json

HTTP プロキシ一覧は、公開 registry への通信が公開の中継サーバーを使う可能性がある場合に、2 つの HTTP URL 値の候補を提供します。内部向けの除外設定はそのまま残してください。strenv は各値を文字列として読み取ります。env は YAML 値として解釈するため、この URL と除外の項目には不要です。strenv の内側の環境変数名にドル記号の接頭辞は付きません。

3 つの項目を代入すれば、proxies の他のメンバーや無関係な最上位設定も保持されます。-o=json オプションは Docker が期待する形式のまま出力します。yq という名前の別プログラムでは式言語が異なる場合があります。

マシンの通常の設定手順で有効なファイルを置き換える前に、候補を確認してください。シェルのリダイレクトで入力ファイルへ直接書き戻すと、yq が読む前に切り詰められることがあります。

これらのハイフン付きの項目名は Docker Engine の daemon を設定します。Docker Desktop は独自のプロキシ設定を使い、CLI のコンテナ環境向けプロキシオブジェクトは別のスキーマを持ちます。

関連記事