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
ですが、基本的には他のパッケージシステムと同様のことはできるようにはなっていると思います。
このメモがなにかの参考になれば。