ローファイ日記

出てくるコード片、ぼくが書いたものは断りがない場合 MIT License としています http://udzura.mit-license.org/

DockerのAPIバージョンを推測する

日記...

sizu.me

静かなインターネットを始めてそっちにもたまに書いているが、はてな.....。

今日は小ネタを残してお茶を濁す

DockerのAPIcurlからも叩くことができる。例えば以下は特定のcontainer id(nameも可能)のコンテナにシグナルを送るやつ:

# データは空でいい模様
$ curl -v --unix-socket /var/run/docker.sock -d '{}' http://localhost/v1.43/containers/hoge-app/kill?signal=SIGUSR2

で、このURLを見るとわかるように、Docker APIのパスにはAPIバージョンが必須である。ではどのバージョンのAPIを使えばいいか?

環境によって固定してもまあいいだろうが、以下のURLのレスポンスから推測できる。

$ curl -v --unix-socket /var/run/docker.sock http://localhost/_ping
*   Trying /var/run/docker.sock:0...
* Connected to localhost (/run/docker.sock) port 80 (#0)
> GET /_ping HTTP/1.1
> Host: localhost
> User-Agent: curl/7.87.0
> Accept: */*
> 
* Mark bundle as not supporting multiuse
< HTTP/1.1 200 OK
< Api-Version: 1.41
< Cache-Control: no-cache, no-store, must-revalidate
< Docker-Experimental: false
< Ostype: linux
< Pragma: no-cache
< Server: Docker/20.10.23 (linux)
< Date: Fri, 01 Dec 2023 10:19:59 GMT
< Content-Length: 2
< Content-Type: text/plain; charset=utf-8
< 
* Connection #0 to host localhost left intact
OK

実は、 /_ping のレスポンスではなく、ヘッダ(Api-Version)に情報がある。この値を取得してそのまま通常のAPIリクエストに使えばOK。


この辺は、GoのDocker clientの実装から知った。

pkg.go.dev

docker.WithAPIVersionNegotiation() オプション付きでクライアントを初期化すると、

github.com

cli.NegotiateAPIVersion(ctx) が呼ばれて、そこでは

github.com

Ping が呼ばれて、そのレスポンスに APIVersion が含まれている。