Linuxディストリビューションにおいて、標準のサポート終了にともない、関連するリソースが これまでと同様には利用できなくなってしまうことがあります。
例えばUbuntu 20.04 (Focal)は、5年間のLTSサポートを終了し、 Expanded Security Maintenanceとよばれる、延長サポートに移行しています。
これにともない、GitHub ActionsではUbuntu 20.04のランナーは利用できなくなりましたし、 LXC/Incusから利用できるイメージサーバーからも削除されました。
本記事では、EOLにともないイメージサーバーから削除されてしまったコンテナの代替手段を確保する方法について説明します。
代替手段については、次の前提条件をもとに検討しました。
- 従来Ubuntu 20.04のIncusコンテナを利用してGitHub Actionsでテストしていたので、そのしくみを使い続けたい
- 新規にIncus専用のイメージサーバーを構築したくはない
上記の条件を満たす方法としては、コンテナイメージを静的ファイルとしてWebサーバー経由で配信するという方法があります。
具体的には次のような手順でそれを実現します。
- コンテナイメージをビルドする
- コンテナイメージを配信できる形式にする
- コンテナイメージを配信する
- リモートサーバーとしてイメージを参照する
コンテナイメージをビルドする
Ubuntu 20.04のコンテナイメージをビルドするには、distrobuilderを利用しました。
distrobuilderでどんなことができるかは「Ubuntu Weekly Recipe 第678回distrobuilderでLXD/LXC用のカスタムイメージを作成する 」という記事があるので、そちらを参照されるとよいでしょう。
Debianでも、trixie以降であれば、apt経由でdistrobuilderをインストールできます。
distrobuilderにはテンプレートが付属しているので、ubuntu.yamlをコピーして編集するとよいでしょう。
$ sudo apt install -y distrobuilder
$ cp /usr/share/doc/distrobuilder/examples/ubuntu.yaml focal.yaml
カスタマイズ項目はいろいろありますが、最低限必要なのは、image:配下のパラメータをUbuntu 20.04にあわせることです。
image:
name: ubuntu-focal-x86_64
distribution: ubuntu
release: focal
description: |-
Ubuntu
architecture: amd64
あとは次のようにdistrobuilderを実行すればイメージが作成できます。
$ sudo distrobuilder build-incus focal.yaml
incus.tar.xzとrootfs.squashfsが作成されているはずです。
コンテナイメージを配信できる形式にする
イメージをビルドできましたが、これはそのまま配信できる形式ではありません。 Web経由で静的ファイルとして配信できるようにするには、simple streams formatを採用するのが簡単です。
$ incus-simplestreams generate-metadata ./incus.tar.xz
$ incus-simplestreams add --alias ubuntu/20.04 --alias ubuntu/focal incus.tar.xz rootfs.squashfs
上記を実行すると、streamsとimagesディレクトリが作成されます。
--alias ubuntu/20.04 --alias ubuntu/focalを指定しているのは、(リモートサーバー名):ubuntu/20.04として参照しやすくするためです。
コンテナイメージを配信する
コンテナイメージを配信できる形式に変換できたので、Webサーバーの任意の場所に配置します。 静的ファイルとして参照できればよいので、配置先はAWS S3やCloudflare R2でもかまいません。
リモートサーバーのイメージを参照する
イメージを利用する準備が整ったので、GitHub Actionsのワークフローから、次のようにしてリモートサーバーを登録します。
$ sudo incus remote add fluent https://fluentd.cdn.cncf.io/test/incus-images --protocol=simplestreams
(test/incus-images配下にstreamsとimagesディレクトリがアップロードされているものとします。)
これで、fluent:ubuntu/20.04などとしてコンテナメイメージを参照できるようになりました。
おわりに
今回は、EOLにともないイメージサーバーから削除されてしまったコンテナの代替手段として、
distrobuilderとincus-simplestreamsを利用して静的ファイルとしてイメージを配信し、
GitHub Actionsでこれまで同様にCIから利用するやりかたを紹介しました。
なんらかの制約等により、あえて古いコンテナを利用したい場合には参考にしてみてください。