本システムでは、Apptainer(旧Singularity)を用いた、コンテナによるプログラム実行環境を整えることが可能です。本項では、コンテナイメージの準備、およびコンテナのカスタマイズとビルドの方法について説明します。
事前準備
-
Apptainerをwork領域を使用する場合は実行前に必ずnewgrpコマンドを実行してください。
|
1 2 3 |
$ groups ocean G12345 # 所属するグループを表示します。"ocean"や"hpci"は管理用のグループです。 $ newgrp G12345 |
|
1 |
$ export APPTAINER_CACHEDIR=/octfs/work/(グループ名)/(ユーザ名)/(任意のディレクトリ) |
|
1 |
$ apptainer cache clean |
コンテナイメージの準備
-
コンテナイメージの取得方法について説明します。コンテナイメージは、OCTOPUS内のローカルレジストリや、インターネット上の公開レジストリから取得することが可能です。また、ご自身で作成したコンテナイメージをOCTOPUS内にアップロードすることもできます。
ローカルレジストリからの取得
-
ローカルレジストリのApptainerコンテナイメージを取得し、sandboxを作成します。例として、ローカルレジストリ/master_imageに登録したtestというコンテナイメージを取得する場合には、sandboxを作成したいディレクトリに移動し、以下のコマンドを実行します。
|
1 2 3 |
$ apptainer build -f --sandbox --fix-perms <sandbox名> oras://cntm:5000/<コンテナイメージパス>:<tag名> #以下はイメージ"test"を取得する場合のサンプルです。 $ apptainer build -f --sandbox --fix-perms test oras://cntm:5000/master_image/test:1.0 |
コンテナイメージの取得に成功すると、カレントディレクトリにsandbox(上記の例ではtest)が作成されます。
Docker Hubからの取得
-
Docker HubからDockerコンテナイメージを取得し、Apptainerのsandboxを作成します。
例として、Docker Hubより、RockyLinuxのコンテナイメージを取得する場合には、sandboxを作成したいディレクトリに移動し、以下のコマンドを実行します。
|
1 2 3 |
$ apptainer build -f --sandbox --fix-perms <sandbox名> docker://<コンテナイメージパス>:<tag名> #以下はRockyLinuxのイメージを取得する場合のサンプルです。 $ apptainer build -f --sandbox --fix-perms rocky9 docker://rockylinux:9 |
コンテナイメージの取得に成功すると、カレントディレクトリにsandbox(上記の例ではrocky9)が作成されます。
コンテナイメージのカスタマイズ・ビルド
-
コンテナイメージのカスタマイズ、およびビルドの方法について説明します。OCTOPUSでコンテナイメージをビルドするには、sandboxを直接カスタマイズしビルドする方法と、defファイルにカスタマイズ内容を記載しビルド時にカスタマイズする方法の二種類があります。
sandboxを直接カスタマイズする方法
-
sandboxを直接カスタマイズし、ビルドする方法について説明します。まずは、カスタマイズしたいベースコンテナイメージの取得を行い、予めsandboxを作成しておきます。次に、sandboxをコンテナとして起動します。例として、testというsandboxをカスタマイズするには、以下のコマンドを実行します。
|
1 2 3 |
$ apptainer run -f -w test 書式は以下のとおりです。 $ apptainer run -f -w <sandbox名> |
続いて、コンテナイメージのビルドを行い、sifファイルを生成します。例として、testというsandboxをビルドし、test.sifを作成するには、以下のコマンドを実行します。
|
1 2 3 |
$ apptainer build -f test.sif test コマンドの書式は以下の通りです。 $ apptainer build -f <sifファイル名> <sandbox名> |
defファイルにカスタマイズ内容を記載する方法
defファイルにカスタマイズ内容を記載し、ビルド時にカスタマイズする方法について説明します。まずは、ビルドに使用するdefファイルを作成します。
例として、ローカルレジストリに登録されたtestをベースコンテナイメージとしてカスタマイズを行う場合、defファイルは以下のようになります。
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
Bootstrap: oras From: cntm:5000/master_image/test:1 %files ./test.conf /opt/test.conf ./test_start.sh /opt/test_start.sh %post dnf install -y net-tools chmod 755 /opt/test_start.sh %runscript /opt/test_start.sh |
| defファイルの概要 ※詳細はApptainerのマニュアルをご参照ください。 | |
|---|---|
| Bootstrap、From | ベースイメージの種類、場所を記載します。 |
| %files | ホストOSからコンテナにコピーしたいファイルを記載します。 |
| %post | カスタマイズ用のコマンドを記載します。 |
| %runscript | コンテナ起動時に自動実行する処理を記載します。 |
defファイルの作成完了後、コンテナイメージのビルドを行い、sifファイルを生成します。例として、test.defというdefファイルを使用してビルドを行い、test.sifを作成するには、以下のコマンドを実行します。
|
1 2 3 |
$ apptainer build -f test.sif test.def コマンドの書式は以下の通りです。 $ apptainer build -f <sifファイル名> <defファイル名> |
ビルドに成功すると、カレントディレクトリにsifファイルが作成されます。
コンテナの実行方法
-
コンテナの実行をする上で最低限把握しておくべき内容について説明します。
- --env オプションによる個別指定
- --env-file オプションによる一括指定
- ホームディレクトリ:/octfs/home/(利用者番号)
- テンポラリ領域 :/tmp
実行コマンド
-
コンテナの実行は、exec サブコマンドを指定して実施します。
|
1 2 3 |
$ apptainer exec <sifファイル名> <コンテナ内の実行コマンド> #以下はrocky9.sifコンテナイメージ内のhostnameコマンドを実行する場合のサンプルです。 $ apptainer exec rocky9.sif hostname |
環境変数
-
コンテナ外で定義した環境変数は、基本的にはコンテナ内にも引き継がれます。ただし、build時などにコンテナ側で明示的に定義されている環境変数は、コンテナ側の定義に従います。
コンテナ側で定義されている環境変数を上書きする場合には、--envオプションによる個別の指定や、--env-fileオプションによる一括の指定でコンテナ内に渡すことが可能です。
|
1 2 3 |
$ apptainer exec --env <変数名>=<値> <sifファイル名> <コンテナ内の実行コマンド> #以下はrocky9.sifコンテナ内で環境変数MYVARに"My Value!"を設定してa.outを実行する場合のサンプルです。 $ apptainer exec --env MYVAR="My Value!" rocky9.sif ./a.out |
|
1 2 3 |
$ apptainer exec --env-file <環境変数ファイル名> <sifファイル名> <コンテナ内の実行コマンド> #以下はmyenvfileというファイルから環境変数を読み込み、rocky9.sifコンテナ内でa.outを実行する場合のサンプルです。 $ apptainer exec --env-file myenvfile rocky9.sif ./a.out |
ホストOSのマウント
-
コンテナ内からホストOSのファイルシステムのread/writeを行いたい場合には、ホストOSの特定のディレクトリをbindマウントすることで利用可能です。オプション指定なしでも、下記のディレクトリは標準でマウントされており、コンテナ内でも同じパスで利用が可能です。
例として、コンテナ内からホストOSのhomeディレクトリに置かれたプログラムを実行する場合のコマンドは以下となります。
|
1 2 3 |
$ apptainer exec <sifファイル名> <プログラム> #以下はrocky9.sifコンテナ内で、ホストOSのhomeディレクトリに置かれたa.outを実行する場合のサンプルです。 $ apptainer exec rocky9.sif ./a.out |
※ 上記例では、カレントディレクトリが、コンテナ内でhome に移動しています。
ホストOSの特定のディレクトリをマウントする場合には、--bindオプションを利用します。--bind オプションの書式は以下となります。
--bind <ホストOSのパス>:<コンテナ内のパス>:<モード>
コンテナ内のパス並びにモード(ro/rw)は省略可能です。省略した場合は、コンテナ内のパスは、ホストOSのパスと同じパスでread/write でマウントされます。
例として、拡張領域上のディレクトリに置かれたプログラムを実行する場合のコマンドは以下となります。
|
1 2 3 4 |
$ cd /octfs/work/(グループ名)/(利用者番号) $ apptainer exec --bind <ホストOSのパス> <sifファイル名> <プログラム> #以下はカレントディレクトリ(`pwd`の結果)をコンテナ内にマウントし、rocky9.sifコンテナ内でa.outを実行する場合のサンプルです。 $ apptainer exec --bind `pwd` rocky9.sif ./a.out |

