はじめに
Alpine LinuxのAPKパッケージのソースコードを手に入れる必要がありましたが、他の一般的なソースコードと違うところがあり、面白いと思ったので記録として残すことにしました。
ゴール
Alpine LinuxのAPKパッケージのソースコードをパッケージ単位で取得することを目的とします。実現にはDockerを利用します。
前置き
Alpine Linux
Alpine Linuxとは、一般的には軽量で小さなイメージのLinuxとして知られています。表に出てくることは少ないですが、軽量であることを生かし、Dockerコンテナのベースイメージとしてよく使われているという認識です。
基本のパッケージ管理システムとして、APKが利用されているのも特徴です。パッケージは、公式サイトにて検索が可能です。
困った点
APKパッケージのソースコードを取得するにあたり、ソースコードのアーカイブを探し出すことができませんでした。公式リポジトリを見てみると、一見ソースコードが置いてあるように見えますが、パッケージを作成するためのビルドファイルとパッチなどのみで、ソースコード本体については格納されていませんでした。
Webを検索してみると、どうやらリポジトリをgit cloneして、ソースコードのfetchを行う必要があるとのこと。他に方法があるかもしれませんが、調査に時間をかけても仕方ないので、この方法を効率よく実行するかを考えることにしました。
実現方法
ソースコードを取得するにあたり、最初のハードルはAlpine Linux環境を用意することになります。今回は、Dockerを利用することにしました。
Dockerではrunするコマンドを tail -f /dev/null にすると、終了しないコンテナが作成できます。このコンテナにホスト側からコマンドを実行してみることにします。
何回も実行するのであればDockerfileを書いてみても良いでしょう。
コンテナの作成
単純にAlpine Linuxのイメージからコンテナをデーモン起動します。ソースコードをコンテナからコピーするのは大変なので、ソースコードの格納先としてホスト側の ./sources に割り当てます。
バージョンやコンテナ名は何回も参照されるため、変数化しておきます。
$ ALPINE_VERSION="3.21.4"
$ CONTAINER_NAME="alpine_${ALPINE_VERSION}_env"
$ docker run -d -v ./sources:/sources --name $CONTAINER_NAME alpine:$ALPINE_VERSION tail -f /dev/null
e5849596568cd7010695aca70947d6517b6d3b68ffaa4a5d4c7a6a154ed459de
APKパッケージの追加
必要なパッケージを追加します。リポジトリ取得、ソースコード圧縮、APKパッケージのビルドを行う必要があるので、git zip alpine-sdkを追加します。
$ docker exec $CONTAINER_NAME sh -c "apk update && apk add --no-cache git zip alpine-sdk"
fetch https://dl-cdn.alpinelinux.org/alpine/v3.21/main/x86_64/APKINDEX.tar.gz
fetch https://dl-cdn.alpinelinux.org/alpine/v3.21/community/x86_64/APKINDEX.tar.gz
v3.21.5-4-gcf681c931f0 [https://dl-cdn.alpinelinux.org/alpine/v3.21/main]
v3.21.5-4-gcf681c931f0 [https://dl-cdn.alpinelinux.org/alpine/v3.21/community]
OK: 25404 distinct packages available
fetch https://dl-cdn.alpinelinux.org/alpine/v3.21/main/x86_64/APKINDEX.tar.gz
fetch https://dl-cdn.alpinelinux.org/alpine/v3.21/community/x86_64/APKINDEX.tar.gz
(1/47) Upgrading libcrypto3 (3.3.4-r0 -> 3.3.5-r0)
~省略~
(45/47) Installing alpine-sdk (1.1-r0)
(46/47) Installing unzip (6.0-r15)
(47/47) Installing zip (3.0-r13)
Executing busybox-1.37.0-r12.trigger
OK: 257 MiB in 60 packages
リポジトリのクローン
APKリポジトリのクローンを行います。基本的なパッケージの情報は aports/main に、パッケージ単位で格納されています。
$ docker exec -it $CONTAINER_NAME sh -c "git clone --depth 1 --branch v$ALPINE_VERSION git://git.alpinelinux.org/aports"
Cloning into 'aports'...
remote: Enumerating objects: 33073, done.
remote: Counting objects: 100% (33073/33073), done.
~省略~
Updating files: 100% (21731/21731), done.
ソースコードの取得
ソースコードを取得するにはAPKのビルドコマンド abuild にて fetch する必要があります。xargsコマンドを使って aports/main/* のディレクトリ毎にソースコード取得 → zip圧縮を行います。
$ docker exec -it $CONTAINER_NAME sh -c "ls -1 /aports/main | xargs -I {} sh -c '\
abuild -C /aports/main/{} -F fetch verify && \
zip -r /sources/{}_src.zip /aports/main/{}/src'"
>>> 7zip: Fetching https://7-zip.org/a/7z2408-src.tar.xz
Connecting to 7-zip.org (49.12.202.237:443)
saving to '/var/cache/distfiles/7z2408-src.tar.xz.part'
7z2408-src.tar.xz.pa 100% |********************************************************************************************************************************| 1458k 0:00:00 ETA
'/var/cache/distfiles/7z2408-src.tar.xz.part' saved
>>> 7zip: Fetching https://7-zip.org/a/7z2408-src.tar.xz
>>> 7zip: Checking sha512sums...
7z2408-src.tar.xz: OK
7-zip-flags.patch: OK
7-zip-musl.patch: OK
adding: aports/main/7zip/src/ (stored 0%)
adding: aports/main/7zip/src/7z2408-src.tar.xz (deflated 0%)
adding: aports/main/7zip/src/7-zip-musl.patch (deflated 63%)
adding: aports/main/7zip/src/7-zip-flags.patch (deflated 60%)
>>> aaudit: Checking sha512sums...
aaudit-common.lua: OK
aaudit-server.lua: OK
aaudit: OK
aaudit-shell: OK
aaudit-update-keys: OK
aaudit-repo: OK
aaudit.json: OK
aaudit-server.json: OK
adding: aports/main/aaudit/src/ (stored 0%)
adding: aports/main/aaudit/src/aaudit-update-keys (deflated 41%)
~以下省略~
実行すると、ホスト側のディレクトリ ./sources に aports/main/<パッケージ名>_src.zip という名前でソースファイルを作成するようにしています。ファイルオーナーがrootであることに注意してください。
$ ls -l ./sources/
total 51116
-rw-r--r-- 1 root root 1495652 Oct 13 21:06 7zip_src.zip
-rw-r--r-- 1 root root 8513 Oct 13 21:06 aaudit_src.zip
-rw-r--r-- 1 root root 229207 Oct 13 21:06 abi-compliance-checker_src.zip
~以下省略~
確認
ソースコードが取得できたか確認します。
最初に、リポジトリ内のファイルは次のようになっています。
ビルドファイルとパッチファイルが存在しますが、ソースコードは見当たりません。
$ docker exec -it $CONTAINER_NAME sh -c "ls -l /aports/main/7zip"
total 16
-rw-r--r-- 1 root root 1441 Oct 13 12:00 7-zip-flags.patch
-rw-r--r-- 1 root root 914 Oct 13 12:00 7-zip-musl.patch
-rw-r--r-- 1 root root 1875 Oct 13 12:00 APKBUILD
取得したソースコードを解凍してみます。
ソースコード 7z2408-src.tar.xz が入っていることが確認できます。逆にビルドファイルは見当たりません。
$ unzip sources/7zip_src.zip
Archive: sources/7zip_src.zip
creating: aports/main/7zip/src/
inflating: aports/main/7zip/src/7z2408-src.tar.xz
inflating: aports/main/7zip/src/7-zip-musl.patch
inflating: aports/main/7zip/src/7-zip-flags.patch
最後に
Alpine LinuxのAPKパッケージのソースコードをDockerコンテナを利用して取得しました。他のパッケージ管理システムでは、ソースコードも1パッケージとして頒布しているものもあるため、ちょっと手間がかかるという印象でした。
なお、全パッケージを対象にするとそれなりの時間がかかるため、必要なパッケージに絞って実行してみてください。また、パッケージに格納されているソフトウェアのバージョンについては、 https://pkgs.alpinelinux.org/packages にて確認してください。