alpineのapkで古いpackageを指定してインストールする
(これはメモ的なアレです。内容の正しさなどはアレです)
たまに apk で指定バージョンのパッケージをインストールしたい時がある。 例えば VSCode で Remote Container を使っていて、プラグインを動かす用に python 3.5.x がほしい時(具体的には CodeLLDB )。
apk add specific version package
とかで検索してみると、package-name>1.2.3
や package-name=1.2.3
でインストールできると書いてあるものの、実際に試してみるとパッケージが見つからない。
/ # apk add --no-cache python3=3.5 fetch http://dl-cdn.alpinelinux.org/alpine/v3.11/main/x86_64/APKINDEX.tar.gz fetch http://dl-cdn.alpinelinux.org/alpine/v3.11/community/x86_64/APKINDEX.tar.gz ERROR: unsatisfiable constraints: python3-3.5.6-r0: breaks: world[python3=3.5]
どうも試行錯誤してみた感じでは、--repository
オプションを指定しない場合は v3.11
が使われていて、そもそも v3.11
内に古いパッケージが存在しなそうな挙動だった。
それと =
はだいぶ厳格らしく、package-name=1.2.3
は通らず package-name=1.2.3-r12
まで書かないといけないらしい。
- https://pkgs.alpinelinux.org/packages?name=python3&branch=v3.11
- https://pkgs.alpinelinux.org/packages?name=python3&branch=v3.5
結論、 --repository
で古いパッケージを含むリポジトリを指定すればよい。もしかしてブランチの指定方法があるんじゃないかと思ったけどなさそう。
apk add --no-cache --repository http://dl-cdn.alpinelinux.org/alpine/v3.5/main python3~=3.5
/etc/apk/repositories
に足すのでも動きそうな気はする。
bash-5.0# cat /etc/apk/repositories http://dl-cdn.alpinelinux.org/alpine/v3.11/main http://dl-cdn.alpinelinux.org/alpine/v3.11/community
バージョンの指定方法はいくつかあって、この辺りは動きそう。
- 厳密に書く:
python3=3.5.6-r0
- マイクロバージョンまで書く:
python3~=3.5.6
- マイナーバージョンまで書く:
python3~=3.5
詳しくはこちら github.com