あまりapk add --virtual
についての記事が見当らなかったのでメモ書き程度に書いてみる。
2020/06/20 修正
コメントを頂いた通り、apkのバージョンごとに挙動が異なるので追記修正しました。
alpine:3.10(apk:2.10.4)以降
同じ名前の仮想パッケージが複数回実行された場合、
初めにインストールしていたパッケージ群が パージ され、後に指定したパッケージ群がインストールされる。
追加上書きでなく丸々上書いているようだ。
apkのgitのこのあたりの変更でこの挙動になった模様。
パージする挙動の処理まで追いきれなったため断定できないが、後述する従来の挙動(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
パッケージ群を管理している仮想パッケージが上書きされたあと、元の関連パッケージは丸々消えることがわかる。
所感
このあたりの動作を把握していなかったので、下記のように書いてしまって少しつまずいた。
パッケージが無いよと、スクリプト実行時にエラーが出るので原因究明時に手間取ることに...
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)開発時に取り込まれたバグのようで、同名の仮想パッケージが存在している時に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#
所感
パッケージ数が増えていることも確認できるし、指定したバイナリもきちんと読み込めたことが確認できた。