CentOS nodejs 開発インフラ

podmanとNode.js公式コンテナイメージでnodeコマンドを使う

投稿日:2021年11月28日

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」ですね。

https://hub.docker.com/_/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はコンテナ実行終了時にコンテナを破棄する、の意。

オプション詳細はdocker公式ドキュメントを参照

コンテナ内のシェルを使っていてまだ終了していないので、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だと認識する為の設定を行なっていこうと思います。

-CentOS, nodejs, 開発インフラ
-, ,

執筆者:

関連記事

podmanをdockerとして使う

docker代替としてRHEL系OSにデフォルト搭載されたpodmanは当初、dockerを期待している他周辺ソフトウェア(docker-componseやgitlab-runnerなど)と素直に通信 …

http-serverコマンドでHTTPS、CORSサーバをたてる

「フロントエンドをHTTPS化してHTTP公開しているREST APIに接続したい、でも自分のPCにApacheやNginxを入れてHTTPS化するのは面倒くさい」 開発中ってこういうニーズと悩みが結 …

Typescript3.0以下の環境で発生する「Cannot find name ‘unknown’」に対処する

目次1 事象2 原因3 対処4 まとめ 事象 Typescript2.3.4を使っている息の長いWebシステムでnpm installをし直し、tscビルドし直したらトランスパイルエラーが発生。「un …

ngrokで手軽にHTTPS検証環境を構築

目次1 はじめに2 手順2.1 ngrokのアカウントを作成2.2 zipファイルをダウンロードして解凍2.3 認証トークンをPCに登録する2.4 HTTPサーバを起動する2.5 起動した8080ポー …

CentOS8にPostgreSQL12をインストールする手順

以前CentOS7にPostgreSQL11をインストールしてSQL実行しました。 One IT Thing  1 Pocket開発用PostgreSQLをCentOSにインストールしてSQ …

 

shingo.nakanishi
 

東京在勤、1977年生まれ、IT職歴2n年、生涯技術者として楽しく生きることを目指しています。デスマに負けず健康第一。