Red Hat Universal Base ImageでRed Hat Developer Programのサブスクリプションを使う
概要
Red Hat Universal Base Image (UBI) というコンテナイメージがRed Hatから配布されています。
どういうものなの?というのは以下などを読むと良いかもしれません。
UBIを起動するだけだとサブスクリプションが必要な一部のコマンドが動きません。実はRed Hat Developer Programに参加すると、開発用途ということで無料のRed Hat Enterprise Linux (RHEL) サブスクリプションを取得することができるようです。
- 1年間有効な"Red Hat Developer Suite" のサブスクリプションが付与されます。
- 1ユーザ(共用不可)、1台のみ、ソフトウェア開発用途のみに利用できます。
- 個人の趣味であっても会社の業務であっても問題ありません
- 共用できないのでチームで共有するCIサーバなどには使えません
- ソフトウェアの開発ではないシステム構築などには利用できません
- 1年経つと失効しますが、失効したあと再度条件(Terms and Conditions)に同意することで継続できます。
実際に使えるようにするまでのやり方をメモしておきます。
追記:RHEL以外でUBIを実行することを前提としています。自分の場合はmacOSでDockerを使ってRHELの挙動をテストしたいという場合に使っています。
RHEL上でPodmanやOpenShiftを使う場合はこの記事のようにコンテナを登録する必要はないようです。(Moriwakaさんコメントありがとうございます!)
RHEL付属のPodmanやOpenShiftを使う場合、ホスト側のサブスクリプション情報を共用する仕組みが含まれているのでコンテナ毎の登録は不要です(仕組みだけでなく契約上もコンテナ数は数えないので不要です)。仕組みを以前blogで紹介していますのでよければどうぞ。
手順
アカウント作成
以下の記事に従って
- Red Hat Developer Program に登録する
- Red Hat Enterprise Linux Server の ISO イメージをダウンロードする
を済ませておきます。
サブスクリプションの確認
ログインした状態で以下にアクセスすると"アクティブなサブスクリプション"のところが1になっているかと思います。
そこをクリックしてサブスクリプション名が"Red Hat Developer Subscription"なことを確認します。
これで準備は完了です。
UBIを起動する
-u root
で起動しないとdefaultユーザになるのですが後述のsubscription-managerコマンドではroot権限必須でrootのパスワードも分からなくて詰みました。なので -u root
していますが、何か他に方法はある気がします。
今回はModulartityの確認がしたかったのでnodejs-12にしてますが、何でも良いです。
$ docker run --rm -it -u root registry.access.redhat.com/ubi8/nodejs-12 bash
以下にイメージ詳細があります。
registry.redhat.ioからpullすると認証必須でregistry.access.redhat.ioからpullすると不要のようです。
ちなみに上のページの"Security"タブで脆弱性の数などが見られるのですが、以前普通に間違っていたので報告して直してもらいました。自分の作っているTrivyというツールでは脆弱性が検知されてRed Hatが0と言っていたので確かにRed Hatを信じたくなりますが、実際にはあちらのミスということも多いです。
dnfを使ってみる
まだRed Hat Subscription Managementに登録してないためコマンドは実行できません。試してみます。
bash-4.4# dnf check-update nodejs-nodemon
Updating Subscription Management repositories.
Unable to read consumer identity
This system is not registered to Red Hat Subscription Management. You can use subscription-manager to register.
Last metadata expiration check: 0:00:14 ago on Tue Dec 22 13:40:01 2020.
確かにエラーが出ました。
サブスクリプション登録する
既にRed Hat Developer Subscriptionの登録は終わっているので、あとはusernameとpasswordを指定してsubscription-managerで登録するだけ!と思って以下のコマンドを打ったら401で弾かれました。
bash-4.4# subscription-manager register --username=knqyf263 --password=[YOUR_PASSWORD] --autosubscribe
Registering to: subscription.rhsm.redhat.com:443/subscription
HTTP error (401 - Unauthorized): Service not available, please try again later
エラーで調べるとメールアドレスじゃなくてユーザー名使ってね、と書いてありましたが既にユーザ名を使っていたので詰みました。
ただ --password
はCLI経由で渡さずにインタラクティブに渡していたので、絶対関係ないだろうなと思いつつダメ元でやったら何故か通りました。自分の環境がおかしいだけなのかもしれませんが、上のエラーでこの記事にたどり着いた人は試してみてください。
bash-4.4# subscription-manager register --username=knqyf263 --auto-attach
Registering to: subscription.rhsm.redhat.com:443/subscription
Password:
The system has been registered with ID: xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxx
The registered system name is: xxxxxxxxxxx
Installed Product Current Status:
Product Name: Red Hat Enterprise Linux for x86_64
Status: Subscribed
正しくsubscribeされていることを確認
以下のコマンドで Status
が Subscribed
になっていればOK
bash-4.4# subscription-manager list
+-------------------------------------------+
Installed Product Status
+-------------------------------------------+
Product Name: Red Hat Enterprise Linux for x86_64
Product ID: 479
Version: 8.3
Arch: x86_64
Status: Subscribed
Status Details:
Starts: 12/22/20
Ends: 12/22/21
手動でサブスクリプションをsubscribeする
上で register
する時に --auto-attach
オプションを付与しておけばこの手順は不要のはずですが、何かのエラーでうまく動かなかった場合を考えて一応書いておきます。
https://hacknote.jp/archives/5614/](https://hacknote.jp/archives/5614/
bash-4.4# subscription-manager list --available | grep Pool
Pool ID: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
bash-4.4# subscription-manager subscribe --pool=xxxxxxxxxxxxxxxxxxxxxxxxxxxxx
Successfully attached a subscription for: Red Hat Developer Subscription
SuccessfullyになればOK
再度dnfを使ってみる
今度は問題なく使えます。
bash-4.4# dnf check-update nodejs-nodemon
Updating Subscription Management repositories.
Red Hat Enterprise Linux 8 for x86_64 - BaseOS (RPMs) 6.5 MB/s | 26 MB 00:04
Red Hat Enterprise Linux 8 for x86_64 - AppStream (RPMs) 6.6 MB/s | 25 MB 00:03
台数制限について
どうやら16台までのようです。
コンテナでやってるとあっという間に上限に達するはずなので、そうなった時に古い方から消えるのかは試してないので不明です。
ただ仮に消えない場合でも"システム"のタブに行って"このサブスクリプションにアタッチされたシステム"から選択して"システムの削除"で消せば良さそうです。
まとめ
RHELを試したい時にいちいちAWSでRHELのEC2インスタンス立ち上げて〜とかやっていて無限に時間を取られていたのでUBIを使ってコンテナで気軽に試せるのはとても助かります。
Discussion
Dockerを使われているのだろうと思いますが、RHEL付属のPodmanやOpenShiftを使う場合、ホスト側のサブスクリプション情報を共用する仕組みが含まれているのでコンテナ毎の登録は不要です(仕組みだけでなく契約上もコンテナ数は数えないので不要です)。仕組みを以前blogで紹介していますのでよければどうぞ。
というのを投稿したあと、ホストOSがRHELではない可能性に思い至りました。他OSだとあまり役に立たない話ですね……
自分の場合はコンテナの脆弱性スキャナーを開発している関係で、macOS上などで簡単にRHELのコンテナイメージの挙動をテストしたいという用途だったので、コンテナ毎に登録しないとダメかなと思いました。とはいえその前提を書いておいたほうが良さそうなので追記させていただきます。ありがとうございます!