日記...
静かなインターネットを始めてそっちにもたまに書いているが、はてな.....。
今日は小ネタを残してお茶を濁す。
DockerのAPIはcurlからも叩くことができる。例えば以下は特定の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の実装から知った。
docker.WithAPIVersionNegotiation()
オプション付きでクライアントを初期化すると、
cli.NegotiateAPIVersion(ctx)
が呼ばれて、そこでは