環境
- Ubuntu 22.04
やりたいこと
Ubuntu上で curl --json を使おうとしたら、手元の環境では普通に怒られた。
$ curl https://httpbin.org/post --json '{"name": "コナン", "age": 8}' curl: option --json: is unknown curl: try 'curl --help' or 'curl --manual' for more information
--json は便利で、JSONを投げるだけなら Content-Type や Accept を毎回手で付けなくてよい。ところがこのオプションは curl 7.82.0 で追加された機能なので、それより古い環境では使えない。
手元のサーバーでバージョンを確認するとこうだった。
$ curl -V curl 7.81.0 (x86_64-pc-linux-gnu)
惜しい。0.1足りない。
Ubuntuではディストリビューション側のパッケージに乗るバージョンに引っ張られるので、「ちょっと新しい機能を使いたい」みたいなケースだと地味に詰まる。今回はまさにそれだった。
対策
apt で入る curl では足りなかったが、このためだけにソースからビルドするのも面倒である。そこで公式のコンテナイメージ curlimages/curl を使うことにした。
$ docker run --rm curlimages/curl:latest https://httpbin.org/post --json '{"name":"コナン","age":8}'
これならホスト側の curl を汚さずに、新しい curl だけをその場で使える。Dockerさえ入っていればよいので、検証用サーバーや一時的な作業でも雑に扱えて楽である。
手元のファイルを入力にしたい場合は、普通のコンテナと同じくボリュームマウントすればよい。
$ docker run --rm -v "./:/app" -w /work curlimages/curl:latest https://httpbin.org/post --json @payload.json
「curl本体の更新はしたくないが、新しめのオプションだけ使いたい」という用途にはかなりちょうどよい。
curlimages/curlって安全なの?
Dockerイメージは基本的に野良ビルドを避けたい。特に curl みたいなネットワーク境界に立つツールは、どこの誰が作ったものか分からないイメージを気軽に使う気にはなれない。
その点 curlimages/curl は curl プロジェクトが公開している公式イメージで、配布用のリポジトリも curl/curl-container として公開されている。
公式リポジトリの説明を見ると、安定版の配布先として docker.io/curlimages/curl と quay.io/curl/curl があり、ghcr.io/curl/curl-container/curl:master は master ブランチ追従の開発用イメージという扱いである。
つまり全部が同じ用途というわけではない。
自分の用途が「新しい curl を安定して使いたい」であれば、素直に docker.io/curlimages/curl:latest か quay.io/curl/curl:latest を使うのがよい。
少なくとも、よく分からない個人ビルドを引くよりはだいぶ安心して使える。