本システムでは、Apptainer(旧Singularity)を用いた、コンテナによるプログラム実行環境を整えることが可能です。本項では、コンテナイメージの準備、およびコンテナのカスタマイズとビルドの方法について説明します。
 

事前準備

    Apptainerをwork領域を使用する場合は実行前に必ずnewgrpコマンドを実行してください。
    初期状態では、homeディレクトリ配下にApptainerのキャッシュデータが置かれます。homeディレクトリの容量は100GBとなりますので、それを超える大容量のデータとなる場合は以下の環境変数を指定し、work領域にキャッシュデータを置いてください。
    キャッシュデータを削除する場合は以下のコマンドを実施してください。

コンテナイメージの準備

    コンテナイメージの取得方法について説明します。コンテナイメージは、OCTOPUS内のローカルレジストリや、インターネット上の公開レジストリから取得することが可能です。また、ご自身で作成したコンテナイメージをOCTOPUS内にアップロードすることもできます。
     

    ローカルレジストリからの取得

      ローカルレジストリのApptainerコンテナイメージを取得し、sandboxを作成します。例として、ローカルレジストリ/master_imageに登録したtestというコンテナイメージを取得する場合には、sandboxを作成したいディレクトリに移動し、以下のコマンドを実行します。

      コンテナイメージの取得に成功すると、カレントディレクトリにsandbox(上記の例ではtest)が作成されます。
       

    Docker Hubからの取得

      Docker HubからDockerコンテナイメージを取得し、Apptainerのsandboxを作成します。
      例として、Docker Hubより、RockyLinuxのコンテナイメージを取得する場合には、sandboxを作成したいディレクトリに移動し、以下のコマンドを実行します。

      コンテナイメージの取得に成功すると、カレントディレクトリにsandbox(上記の例ではrocky9)が作成されます。

     

コンテナイメージのカスタマイズ・ビルド

    コンテナイメージのカスタマイズ、およびビルドの方法について説明します。OCTOPUSでコンテナイメージをビルドするには、sandboxを直接カスタマイズしビルドする方法と、defファイルにカスタマイズ内容を記載しビルド時にカスタマイズする方法の二種類があります。
     

    sandboxを直接カスタマイズする方法

      sandboxを直接カスタマイズし、ビルドする方法について説明します。まずは、カスタマイズしたいベースコンテナイメージの取得を行い、予めsandboxを作成しておきます。次に、sandboxをコンテナとして起動します。例として、testというsandboxをカスタマイズするには、以下のコマンドを実行します。
      コンテナの起動に成功すると、Apptainerのプロンプトが表示されます。上記のプロンプトより、dnf、pipによるパッケージの追加などを実施します。(パッケージの操作に使用するコマンドは、コンテナに格納したOSのディストリビューションにより異なります。)コンテナイメージのカスタマイズ完了後、exitコマンドでコンテナを停止します。
      続いて、コンテナイメージのビルドを行い、sifファイルを生成します。例として、testというsandboxをビルドし、test.sifを作成するには、以下のコマンドを実行します。
      ビルドに成功すると、カレントディレクトリにsifファイルが作成されます。
       

    defファイルにカスタマイズ内容を記載する方法

      defファイルにカスタマイズ内容を記載し、ビルド時にカスタマイズする方法について説明します。まずは、ビルドに使用するdefファイルを作成します。
      例として、ローカルレジストリに登録されたtestをベースコンテナイメージとしてカスタマイズを行う場合、defファイルは以下のようになります。

      defファイルの概要 ※詳細はApptainerのマニュアルをご参照ください。
      Bootstrap、From ベースイメージの種類、場所を記載します。
      %files ホストOSからコンテナにコピーしたいファイルを記載します。
      %post カスタマイズ用のコマンドを記載します。
      %runscript コンテナ起動時に自動実行する処理を記載します。

      defファイルの作成完了後、コンテナイメージのビルドを行い、sifファイルを生成します。例として、test.defというdefファイルを使用してビルドを行い、test.sifを作成するには、以下のコマンドを実行します。

      ビルドに成功すると、カレントディレクトリにsifファイルが作成されます。
       

コンテナの実行方法

    コンテナの実行をする上で最低限把握しておくべき内容について説明します。
     

    実行コマンド

      コンテナの実行は、exec サブコマンドを指定して実施します。
      指定するコマンドは、コンテナ内の実行コマンドとなっている点にご注意ください。コマンドがパス指定なしであれば、コンテナ内のPATH環境変数で探索されたコマンドが実行されます。パス指定有りの場合も、絶対パスはコンテナ内のファイル構造に従います。
       

    環境変数

      コンテナ外で定義した環境変数は、基本的にはコンテナ内にも引き継がれます。ただし、build時などにコンテナ側で明示的に定義されている環境変数は、コンテナ側の定義に従います。
      コンテナ側で定義されている環境変数を上書きする場合には、--envオプションによる個別の指定や、--env-fileオプションによる一括の指定でコンテナ内に渡すことが可能です。

      • --env オプションによる個別指定

      • --env-file オプションによる一括指定

       

    ホストOSのマウント

      コンテナ内からホストOSのファイルシステムのread/writeを行いたい場合には、ホストOSの特定のディレクトリをbindマウントすることで利用可能です。オプション指定なしでも、下記のディレクトリは標準でマウントされており、コンテナ内でも同じパスで利用が可能です。

      • ホームディレクトリ:/octfs/home/(利用者番号)
      • テンポラリ領域 :/tmp

      例として、コンテナ内からホストOSのhomeディレクトリに置かれたプログラムを実行する場合のコマンドは以下となります。

      ※ 上記例では、カレントディレクトリが、コンテナ内でhome に移動しています。
       
      ホストOSの特定のディレクトリをマウントする場合には、--bindオプションを利用します。--bind オプションの書式は以下となります。
      --bind <ホストOSのパス>:<コンテナ内のパス>:<モード>
      コンテナ内のパス並びにモード(ro/rw)は省略可能です。省略した場合は、コンテナ内のパスは、ホストOSのパスと同じパスでread/write でマウントされます。

      例として、拡張領域上のディレクトリに置かれたプログラムを実行する場合のコマンドは以下となります。

      ※ 上記例では、コンテナ外での環境変数PWDが、コンテナ内へも引き継がれており、コンテナ内のカレントディレクトリが、拡張領域上のディレクトリになっています。
       

     

参考資料