REHL8(CentOS8)からデフォルトインストールされるようになったpodmanでnodeコマンドが使える環境を作ってみます。
環境
- AlmaLinux 8.5
- podman 3.3.1
- Node.js latestコンテナイメージ(21/11/28時点でnode 17.1が同梱)
AlmaLinux8.5はCentOS8.4からマイグレーションしたものです。
$ lsb_release -a
LSB Version: :core-4.1-amd64:core-4.1-noarch
Distributor ID: AlmaLinux
Description: AlmaLinux release 8.5 (Arctic Sphynx)
Release: 8.5
Codename: ArcticSphynx
やること
Node.js環境の無いAlmaLinuxでJavascriptをnodeコマンド実行します。
Node.jsイメージの導入
デフォルトインストール済みのpodmanのバージョンを確認しておきます。
$ which podman
/usr/bin/podman
$ podman --version
podman version 3.3.1
$ podman info
host:
arch: amd64
buildahVersion: 1.22.3
(中略)
podmanコンテナ、コンテナの元になるイメージもまだ無い状態です。
$ podman image ls
REPOSITORY TAG IMAGE ID CREATED SIZE
$ podman ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
docker hubからNode.jsのofficialイメージ名を見つけます。「node」ですね。
最新版バージョン(latest)のnodeコンテナイメージをインストール。インストール元リポジトリはdocker.ioを選びます。
$ podman pull node:latest
✅ Please select an image:
registry.fedoraproject.org/node:latest
registry.access.redhat.com/node:latest
registry.centos.org/node:latest
✅ docker.io/library/node:latest
(*)docker.io以外のリポジトリを選択すると、nodeイメージが存在しないようでエラーになってしまいます。
Trying to pull registry.centos.org/node:latest...
Error: initializing source docker://registry.centos.org/node:latest: reading manifest latest in registry.centos.org/node: manifest unknown: manifest unknown
導入したコンテナイメージがpodmanから見えるようになりました。イメージをロードしてコンテナ起動はしていないので、podman ps(コンテナプロセス一覧表示)はまだ空です。
$ podman image ls
REPOSITORY TAG IMAGE ID CREATED SIZE
docker.io/library/node latest 6dc0a5fbad51 10 days ago 1.02 GB
$ podman ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
b4cdbbb6fea0 docker.io/library/node:latest node 23 hours ago Exited (0) 23 hours ago magical_ardinghelli
$ podman ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
イメージからコンテナを起動、コンテナ内のシェルを使って中身を見てみます。/etcをチラ見してみるとディストリビューションはDebianのようです。インストールされているnode、npmコマンドのバージョンも分かりました。
$ podman run -it --rm --name hoge node:latest /bin/bash
root@a93a63b76fd2:/# cat /etc/debian_version
11.1
root@a93a63b76fd2:/# which node
/usr/local/bin/node
root@a93a63b76fd2:/# node --version
v17.1.0
root@a93a63b76fd2:/# which npm
/usr/local/bin/npm
root@a93a63b76fd2:/# npm --version
8.1.2
-itオプションはコンテナ内の擬似tty標準入力をホスト側シェルでアタッチ、要するにコンテナ側シェルをホスト側で使えるようになります。–rmはコンテナ実行終了時にコンテナを破棄する、の意。
コンテナ内のシェルを使っていてまだ終了していないので、podman psでコンテナプロセスを見ることができます。
$ podman ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
a93a63b76fd2 docker.io/library/node:latest /bin/bash 13 minutes ago Up 13 minutes ago hoge
コンテナ内シェルから抜けると、コンテナプロセスは消え、–rmが効いている為使ったコンテナイメージも削除されて残りません。
root@a93a63b76fd2:/# exit
exit
$ podman ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
コンテナ内のnodeコマンドでホスト側のJSファイルを実行
ホスト側(AlmaLinux側)にあるjavascriptファイルをコンテナ内のnodeコマンドで実行してみます。
適当なディレクトリ(/tmp/js)に適当なJSファイル(hoge.js)を作成。
$ mkdir /tmp/js && cd /tmp/js
$ vi hoge.js
console.log('hogehoge!');
コンテナ内のnodeコマンドで実行。
$ podman run -it --rm --name hoge -v /tmp/js:/root -w /root node:latest node hoge.js
hogehoge!
ホスト側AlmaLinuxにはNode.jsがインストールされていませんが、コンテナ側Debianのnodeコマンドを使ってhoge.jsを実行することが出来ました。
-v(–volume)オプションでホスト側の/tmp/jsディレクトリ内容をコンテナ側の/rootディレクトリにマウント、-wオプションでコンテナ側ユーザのカレントディレクトリを/rootにすることで、コンテナ内のnodeコマンドは./hoge.jsを認識することができます。
留意点
以下のようなエラーでhoge.jsが見つからない場合。
node:internal/modules/cjs/loader:936
throw err;
^
Error: Cannot find module '/root/hoge.js'
at Function.Module._resolveFilename (node:internal/modules/cjs/loader:933:15)
at Function.Module._load (node:internal/modules/cjs/loader:778:27)
at Function.executeUserEntryPoint [as runMain] (node:internal/modules/run_main:81:12)
at node:internal/main/run_main_module:17:47 {
code: 'MODULE_NOT_FOUND',
requireStack: []
}
Node.js v17.1.0
/var/log/messagesを見るとSELinuxがエラーを吐いていました。
Nov 27 20:38:51 kepler setroubleshoot[2229201]: SELinux is preventing /usr/local/bin/node from read access on the file hoge.js. For complete SELinux messages run: sealert -l 4bc41602-02d1-4e98-ab94-45fa22f3e158
$ sealert -l 4bc41602-02d1-4e98-ab94-45fa22f3e158
SELinux により、/usr/local/bin/node による read アクセスが、ファイル hoge.js で拒否されました。
***** プラグイン catchall (100. 信頼性) による示唆 *************************************
node に、 hoge.js file の read アクセスがデフォルトで許可されるべきと考える場合。
(中略)
SELinuxの設定をするのが筋ですが、早く動作確認したい場合はsudo setenforce 0でもしておきましょう。
まとめ
シンプルな用途であればdockerと同じ操作でコンテナを使えることが分かりました。
ただdockerを対象としている他ソフトウェア(docker-composeやgitlab-runnerのコンテナ起動機能など)はpodmanでは動きません。
次回はそれらのソフトウェアが、podmanをdockerだと認識する為の設定を行なっていこうと思います。