---
title: alpineのapkで古いpackageを指定してインストールする
date: "2020-02-11"
---
（これはメモ的なアレです。内容の正しさなどはアレです）
たまに apk で指定バージョンのパッケージをインストールしたい時がある。
例えば VSCode で Remote Container を使っていて、プラグインを動かす用に python 3.5.x がほしい時（具体的には [CodeLLDB](https://marketplace.visualstudio.com/items?itemName=vadimcn.vscode-lldb) ）。
`apk add specific version package` とかで検索してみると、`package-name>1.2.3` や `package-name=1.2.3` でインストールできると書いてあるものの、実際に試してみるとパッケージが見つからない。
```sh
/ # 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` で古いパッケージを含むリポジトリを指定すればよい。もしかしてブランチの指定方法があるんじゃないかと思ったけどなさそう。
```sh
apk add --no-cache --repository http://dl-cdn.alpinelinux.org/alpine/v3.5/main python3~=3.5
```
`/etc/apk/repositories` に足すのでも動きそうな気はする。
```sh
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`
詳しくはこちら
[https://github.com/tamakiii-sandbox/hello-apk-specific-version:embed:cite]