動かざることバグの如し

近づきたいよ 君の理想に

Ubuntuで最新版curlを使いたいときはDockerが便利

環境

  • 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-TypeAccept を毎回手で付けなくてよい。ところがこのオプションは curl 7.82.0 で追加された機能なので、それより古い環境では使えない。

curl.se curl.se

手元のサーバーでバージョンを確認するとこうだった。

$ 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 として公開されている。

github.com

公式リポジトリの説明を見ると、安定版の配布先として docker.io/curlimages/curlquay.io/curl/curl があり、ghcr.io/curl/curl-container/curl:master は master ブランチ追従の開発用イメージという扱いである。 つまり全部が同じ用途というわけではない。

自分の用途が「新しい curl を安定して使いたい」であれば、素直に docker.io/curlimages/curl:latestquay.io/curl/curl:latest を使うのがよい。 少なくとも、よく分からない個人ビルドを引くよりはだいぶ安心して使える。