docker-compose
をインストールするのにバージョン指定が必要なため、最新バージョンを調べるのが面倒。
version='1.24.0'
curl -L "https://github.com/docker/compose/releases/download/${version}/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
version='1.24.0'
docker pull docker/compose:${version}
🐒 2020/04/04 追記: PR #7028 の 2019/11/19 のマージにて、
docker-compose
v1.25.0 以降からはlatest
タグが使えるようになりました。
TL; DR(概要)
API から最新バージョンを取得する
docker-compose
は Docker イメージに限らず、バイナリをダウンロードする場合でもバージョン指定が必須です。(2020/04/04 現在、latest
が指定可能になりました)
そのため、docker-compose
の最新版を使いたい場合、バイナリの場合は GitHub、Docker コンテナ・イメージの場合は DockerHub のリリース情報から最新バージョンを確認する必要があります。
CI 系などで、最新バージョンでテストする必要がある場合は、スクリプトで各々の API から最新バージョンを取得します。
API のエンドポイント
https://api.github.com/repos/docker/compose/releases/latest
https://registry.hub.docker.com/v1/repositories/docker/compose/tags
バージョンの取得例
GitHub(バイナリのバージョン確認)
version=`curl -s https://api.github.com/repos/docker/compose/releases/latest | \
grep tag_name | \
sed -e 's/[^0-9\.]//g'`
echo $version
# 出力結果
# 1.24.0
- オンラインで動作確認する | Ubuntu18.4 @ paiza.IO
DockerHub(コンテナのバージョン確認)
version=`curl -s https://registry.hub.docker.com/v1/repositories/docker/compose/tags | \
sed -e 's/[][]//g' -e 's/"//g' -e 's/ //g' | \
tr '}' '\n' | \
awk -F: '{print $3}' | \
sed '/^$/d' | \
tail -1`
echo $version
# 出力結果
# 1.9.0-rc4
- オンラインで動作確認する | Ubuntu18.4 @ paiza.IO
バージョン確認先情報
-
Git リポジトリ(Docker Compose 公式)
- Docker Compose | by Docker @ GitHub
-
Docker イメージ・レジストリ(Docker Compose 公式)
- Docker Compose のリリース・タグ一覧 @ DockerHub
- Docker Compose | by Docker @ DockerHub
TS; DR(詳細と所感)
- 「But wait, there’s more! | The easy way to set up Docker on a Raspberry Pi」@ Medium
ラズパイで Docker を動かすため☝️この記事を読んだところ、docker-compose
すらも Docker で使いたいと感銘を受け、どうせなら最新バージョンで試そうと思いました。
公式 docker/compose
の pull
一般的に最新バージョンのダウンロード(pull
)は、イメージ名に latest
タグを付けます。また、タグを付けない場合でも、自動的に latest
を付加してレジストリ内を検索してくれます。
しかし、DockerHub の「Docker Pull Command」に記載されている方法でも取得できず、結論から言うとバージョン番号のタグを明記しないとダメでした。
-
docker pull docker/compose
→ NG -
docker pull docker/compose:latest
→ NG -
docker pull docker/compose:1.23.2
→ OK
$ docker pull docker/compose
Using default tag: latest
Error response from daemon: manifest for docker/compose:latest not found
$ docker pull docker/compose:latest
Error response from daemon: manifest for docker/compose:latest not found
$ docker pull docker/compose:1.23.2
1.23.2: Pulling from docker/compose
4fe2ade4980c: Pull complete
658ccff8d4f1: Pull complete
71166c3c8d42: Pull complete
c246ed86dd59: Pull complete
Digest: sha256:f6e4963cd17f709fb57f7cf0842e269ed6ba173c3490055b50c701a257feb860
Status: Downloaded newer image for docker/compose:1.23.2
バージョン指定が必須な理由
どうやら、「Version specific」(特定バージョン)での用途が前提であるためのようです。
Docker Compose の Issue @ GitHub にも「バージョン指定がないとイメージをダウンロードできない」現象の報告があがっており、『Docker Compose には latest
タグはないよ』と、Close されていました。
There is no
latest
tag uploaded for Docker Compose.
(Issue #6006 のコメントより)
しかも、『Manifest に latest
タグを付けてはくれまいか』という要望(Issue #6331)すらも『以前説明した通り、(latest
タグを付ける)予定なんか、ないよ』とのことで、Docker Compose の中の人に却下されていました。
Thanks!
As explained here, that's not something we're currently looking to do.
(Issue #6331 のコメントより)
その「以前の説明」とやらを読むと、どうやら「バージョンを限定しての用途で DockerHub に提供している」ことが理由のようです。
If you're talking about the
docker/compose
image on Hub, it's meant to be exclusively used through therun.sh
script, which is versioned.
We currently have no plans to add a latest tag.
(Issue #5987 | Compose @ GitHub の中の人より)(筆者訳)
Docker Hub のdocker/compose
はrun.sh
などの起動スクリプトで使うことが大前提なので、バージョン管理の観点からも、動的なlatest
タグは導入する予定はありません。
しびあー。
環境依存を減らすのが Docker のいいところでもあるわけで、「Docker Compose 自体が latest
によって挙動が変わる可能性」を考えると、「動作確認のとれたバージョンを使え」ということなのでしょう。
それ以外はユーザーが疲労コンパイルのもやぶさかではない、と。
docker/compose
イメージの最新バージョン・タグ @ DockerHub
これらの Issue から、バージョン指定が必須の理屈もわかりました。しかし、「最新のバージョンを確認したい」というシンプルな要望があります。
手動で確認するなら、リリース・タグの一覧から最新を選べばわかります。
- Docker Compose のリリース・タグ一覧 @ DockerHub
しかし、面倒くさい。CircleCI などで最新版で動作テストしたい場合などにも困ってしまいます。そこで API を使って調べることにしましたとさ。
🐒 2020/04/04 追記:
docker-compose
v1.25.0 からlatest
タグが使えるようになりました。よかったです。
参考文献
- 「docker get list of tags in repository」@ ForDoDone
- 「How to list all tags for a Docker image on a remote registry?」@ StackOverflow