apk add --virtual で同じ名前の仮想パッケージを複数回実行してみる

あまり`apk add --virtual`についての記事が見当らなかったのでメモ書き程度に書いてみる。

#### 2020/06/20 修正
コメントを頂いた通り、apkのバージョンごとに挙動が異なるので追記修正しました。

# alpine:3.10(apk:2.10.4)以降
同じ名前の仮想パッケージが複数回実行された場合、
初めにインストールしていたパッケージ群が **パージ** され、後に指定したパッケージ群がインストールされる。
追加上書きでなく丸々上書いているようだ。

apkのgitの[このあたりの変更で](https://github.com/alpinelinux/apk-tools/commit/b45415b1096e76f40b32326d2798123f81fe5976)この挙動になった模様。
パージする挙動の処理まで追いきれなったため断定できないが、後述する従来の挙動(addで仮想パッケージに追加する挙動)通りでは無い気がするので将来的に修正が入りそうな気がします。

## 挙動確認
* まず仮想パッケージとしてvimを入れる

```
# apk add --virtual .test vim

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
(1/4) Installing xxd (8.2.0-r0)
(2/4) Installing lua5.3-libs (5.3.5-r2)
(3/4) Installing vim (8.2.0-r0)
(4/4) Installing .test (20200514.092303)
```

* 同じ名前でbashを指定

```
# apk add --virtual .test --no-cache bash

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
(1/6) Installing bash (5.0.11-r1)
Executing bash-5.0.11-r1.post-install
(2/6) Upgrading .test (20200514.092303 -> 20200514.092335)
(3/6) Purging vim (8.2.0-r0)
(4/6) Purging xxd (8.2.0-r0)
(5/6) Installing cmake-bash-completion (3.15.5-r0)
(6/6) Purging lua5.3-libs (5.3.5-r2)
Executing busybox-1.31.1-r9.trigger
OK: 522 MiB in 126 packages
```

パッケージ群を管理している仮想パッケージが上書きされたあと、元の関連パッケージは丸々消えることがわかる。

## 所感
このあたりの動作を把握していなかったので、下記のように書いてしまって少しつまずいた。
パッケージが無いよと、スクリプト実行時にエラーが出るので原因究明時に手間取ることに...

```dockerfile:2.10.4以降
RUN apk add --virtual .build --no-cache openblas-dev lapack-dev freetype-dev
# .buildの中身はhdf5-devだけになる
RUN apk add --virtual .build --no-cache -X http://dl-cdn.alpinelinux.org/alpine/edge/community hdf5-dev
```

`testing`などのリポジトリを個別指定して入れる時(`-X`オプション使用時)は別名の仮想パッケージを切るしかないって事か...

# alpine:3.9(apk:2.10.3)
このバージョンだけ同じ名前で追加しようとしても、**追加されずエラーも出ず素通り**という挙動をする。

## 挙動確認

```
/ # apk --version
apk-tools 2.10.3, compiled for x86_64.
/ # apk add --virtual .test --no-cache bash
fetch http://dl-cdn.alpinelinux.org/alpine/v3.9/main/x86_64/APKINDEX.tar.gz
fetch http://dl-cdn.alpinelinux.org/alpine/v3.9/community/x86_64/APKINDEX.tar.gz
(1/6) Installing ncurses-terminfo-base (6.1_p20190105-r0)
(2/6) Installing ncurses-terminfo (6.1_p20190105-r0)
(3/6) Installing ncurses-libs (6.1_p20190105-r0)
(4/6) Installing readline (7.0.003-r1)
(5/6) Installing bash (4.4.19-r1)
Executing bash-4.4.19-r1.post-install
(6/6) Installing .test (0)
Executing busybox-1.29.3-r10.trigger
OK: 14 MiB in 20 packages
/ # apk add --virtual .test --no-cache vim
fetch http://dl-cdn.alpinelinux.org/alpine/v3.9/main/x86_64/APKINDEX.tar.gz
fetch http://dl-cdn.alpinelinux.org/alpine/v3.9/community/x86_64/APKINDEX.tar.gz
OK: 14 MiB in 20 packages
/ # vim
/bin/sh: vim: not found
/ # bash
bash-4.4#
```

## 所感
[2.10.3（alpine:3.9）開発時に取り込まれたバグ](https://github.com/alpinelinux/apk-tools/commit/b06e3b991dbe2cb5f9ca65ed50a443a5ecaaf383)のようで、同名の仮想パッケージが存在している時に`apk add --virtual`をすると無視される。。
エラーが出ないので、原因究明が面倒臭いタイプ

# alpine:3.8(apk:2.10.4)以前
自分が最初に想定していた、**追加上書き**の挙動をしてくれる。

## 挙動確認

```
/ # apk --version
apk-tools 2.10.1, compiled for x86_64.
/ # apk add --virtual .test --no-cache bash
fetch http://dl-cdn.alpinelinux.org/alpine/v3.8/main/x86_64/APKINDEX.tar.gz
fetch http://dl-cdn.alpinelinux.org/alpine/v3.8/community/x86_64/APKINDEX.tar.gz
(1/6) Installing ncurses-terminfo-base (6.1_p20180818-r1)
(2/6) Installing ncurses-terminfo (6.1_p20180818-r1)
(3/6) Installing ncurses-libs (6.1_p20180818-r1)
(4/6) Installing readline (7.0.003-r0)
(5/6) Installing bash (4.4.19-r1)
Executing bash-4.4.19-r1.post-install
(6/6) Installing .test (0)
Executing busybox-1.28.4-r3.trigger
OK: 13 MiB in 19 packages
/ # apk add --virtual .test --no-cache vim
fetch http://dl-cdn.alpinelinux.org/alpine/v3.8/main/x86_64/APKINDEX.tar.gz
fetch http://dl-cdn.alpinelinux.org/alpine/v3.8/community/x86_64/APKINDEX.tar.gz
(1/2) Installing lua5.3-libs (5.3.5-r2)
(2/2) Installing vim (8.1.1365-r0)
Executing busybox-1.28.4-r3.trigger
OK: 40 MiB in 21 packages
/ # vim
/ # bash
bash-4.4# 
```

## 所感
パッケージ数が増えていることも確認できるし、指定したバイナリもきちんと読み込めたことが確認できた。