DockerやWindowsのWSLなど使っていると軽量なLinuxを使いたくなります。その代表格となるのはやはりAlpine Linuxではないでしょうか。ただ個人的にはパッケージマネージャーであるapkに慣れていないため使い方が分からなくなります。

今回は以前書いたエントリーでScratchの独自ブロックの開発環境を作成する際にNode.jsのバージョンが最新のLTSであるバージョン18系では動作できず、1つ前のLTSバージョンである16系でしか動かないという現象があり、その設定の時に迷ってしまった特定のバージョンのアプリのインストールについてメモをしておきます。システムによっては固定したバージョン以外では動かないものもありますし、軽量なLinux環境にGitやビルドツールを入れるのが面倒だったり、イメージの肥大化を避けたいこともあるかと思いますのでそんなときに使えるかなと思います。
【参考(Node.jsのバージョンを下げる必要があった例)】
方法論
UbuntuやDebianで使用されているaptではバージョン指定したインストールも可能ですが、apkでも同様なことができます。
しかしながら、単にバージョン指定を行っても、Alpine Linuxのcurrentバージョンのパッケージが選択されるという癖があります。
単純ではありません。例えば、Node.jsのバージョンを16と指定しても、Alpine Linuxのcurrentバージョンのパッケージでは18となっているため、
指定を行ってもバージョン18系がインストールされるということになります。
では、どうするかというと3つの方法があります。
- 過去のアーカイブから
apkパッケージをダウンロードして、ローカルストレージからインストールを行う。 apkが参照するリポジトリ情報(URL)を編集して過去のバージョンのリポジトリを参照可能にする。- コマンドラインからリポジトリ先を指定してインストールを行う。
どちらにしても過去のアーカイブからどのバージョンが含まれているかを調べるといった作業が必要な点が少し面倒です。 リポジトリ先は以下のリンクから探すことになるでしょう。
http://dl-cdn.alpinelinux.org/alpine/

こちらのバージョン以下の階層に(例:/alpine/v3.17/main/x86_64/)各アーキテクチャ用のパッケージがまとまっているので ディレクトリの階層の行ったり来たりする必要はありますが、確実に探せると思います。

では、それぞれを見てみようと思います。
方法1
wgetやcurlを使用して該当するパスからファイルを取得し、ローカル環境に保存。その後、apkコマンドに--allow-untrustedオプションをつけてインストールを行います。
# wget https://dl-cdn.alpinelinux.org/alpine/v3.16/main/x86_64/nodejs-16.19.1-r0.apk #ファイルの取得例、OSのデフォルトではwgetもcurlも無いのでインストール必須 # apk add --no-cache --allow-untrusted nodejs-16.19.1-r0.apk
【参照】 superuser.com
方法2
apkが参照するリポジトリは/etc/apk/repositoriesになります。このファイルを編集することになります。
/etc/apk/repositoriesを編集するしてからインストールを行います。
# cat /etc/apk/repositories # http://dl-cdn.alpinelinux.org/alpine/v3.4/main #コメント化 # http://dl-cdn.alpinelinux.org/alpine/v3.4/community #コメント化 http://dl-cdn.alpinelinux.org/alpine/v3.16/main #参照されるように編集 # apk update # apk add --no-cache nodejs~=16
方法3
パッケージファイルのあるURLがわかるのであれば、--repositoryオプションをつけてURL指定すると指定が可能です。
ワンライナーで記載できるため、このやり方が一番スマートかも。
下記の例ではNode.jsはバージョン16でインストールを行っています。
# apk add --no-cache --repository http://dl-cdn.alpinelinux.org/alpine/v3.16/main nodejs~=16
おわりに
あまり馴染みのないAlpine Linuxのパッケージシステムapkですが、基本的には他のパッケージシステムと同様のことはできるようにはなっていると思います。
このメモがなにかの参考になれば。