Singularityのすゝめ

Singularityとは

コンテナプラットフォームの一種。


ハンズオンの動画

こちら を参照してください(ログインが必要です)。

Singularityの使い方

SingularityのCommand Line Interfaceの中で,コンテナの実行で多く利用するCLIをまとめる.

Run

コンテナ内でユーザ定義のデフォルトコマンドを実行する.sifファイルの作成時に指定できる %runscript が実行される.DockerやPodmanでいう CMD に近い.%runscript が指定されていない場合はShellが立ち上がる.

  • 実行例
$ singularity run ubuntu20.04.sif
Singularity>

# %runscriptを指定している場合. (echo "Hello, World!!")
$ singularity run set-runscript.sif
Hello, World!!

Exec

コンテナ内でコマンドを実行する.DockerやPodmanのようにコンテナを作成してから exec するのではなく,sifファイルに直接コマンドを投げることが可能.

  • 実行例
$ singularity exec ubuntu20.04.sif cat /etc/os-release
NAME="Ubuntu"
VERSION="20.04.1 LTS (Focal Fossa)"
ID=ubuntu
(省略)

Shell

コンテナ内でShellを実行する.%runscript などは実行されずShellが起動する.デフォルトのShellは Bash が起動するが,--shell でShellを指定することも可能.

  • 実行例
$ singularity shell ubuntu20.04.sif
Singularity> echo $SHELL
/bin/bash

# Shellを指定することも可能
$ singularity shell --shell /bin/zsh ubuntu20.04.sif
Singularity> echo $SHELL
/bin/zsh

Singularityのイメージの作成方法

Singularityで利用するsifファイルは Definition Files をもとに作成される.Definition FileはDockerやPodmanでいうDockerfile,Containerfileに該当する.また,sifファイルの作成には2通りのやり方がある.

  • Docker Hubからイメージを取得する
  • Definition Fileを作成しBuildを行う

Docker Hubから取得

Docker Hubに登録されているイメージで実行環境を整えることが可能であるならば,この方法を推奨する.

  • 実行例
$ singularity pull docker://ubuntu:20.04

$ ls
ubuntu_20.04.sif

Definition Fileから作成

よく利用するコマンドのDockerfileとDefinition Fileとの対比は以下のようになっている.

  • 対比表
    Dockerfile Definition File 機能
    FROM From ベースイメージを指定する
    RUN %post パッケージのインストールなど,コマンドを実行する
    COPY %files ファイルをコンテナにコピーする
    CMD %runscript コンテナ実行時にコマンドを実行する
    ENV %environment 環境変数を定義する
    LABEL %labels メタデータを追加する

Definition FileではFromでベースとなるイメージを指定するが,どこからイメージを取得するのかを指定する BootStrap を設定する必要がある.Docker Hubから取得する場合は BootStrap: docker と指定する.

イメージの作成例として,Ubuntu20.04をベースにvim をインストールする.

  • Definition Fileの例
BootStrap: docker
From: ubuntu:20.04

%post
    apt-get update
    DEBIAN_FRONTEND=noninteractive \
    apt-get install -y \
        vim

Definition Fileを作成したら,Buildコマンドを使用しsifファイルを作成する.このとき--fakeroot を指定する必要がある.例では emacs.sif という名前で作成する (vimがインストールされている,emacsという名前のイメージ :trollface:).

  • Buildの例
$ singularity build --fakeroot emacs.sif test.def

$ ls
emacs.sif  test.def

もっと詳しく知りたい場合は公式の Definition Files が最高にまとまっています。

作成したsifファイルをベースにしよう!!

SingularityのBuildはレイヤーごとにキャッシュされないため,一度作成したsifファイルに追加でパッケージをインストールするには,また一からBuildを行う必要がある.そこで,事前に作成したsifファイルをベースにイメージを作成することができる.

例として上で作成した emacs.sif に追加で emacs をインストールする.BootStrapの部分はローカルのsifファイルを使用するため,localimageと指定する.また,Fromemacs.sfiフルパスを指定する.

BootStrap: localimage
From: /path/to/emacs.sif

%post
    apt-get update
    apt-get install -y \
        emacs

Multi-Stage Buildを活用しよう

まとめるのが面倒になってきたので,公式の Multi-Stage Builds を参考にしてください.


Singularityの便利な使い方

sifファイルは ./[SIF_NAME] のように実行できるため,通常のコマンドと同じように使える.そこで,多数の言語のシンタックス表示に対応するcat(1)のクローンである batcat の例を示す.

sifの作成

batcat環境を用意するDefinition Fileを作成する.run 時に実行したい処理を %runscript に記述し,batcatは引数を受け取るため $@ を後ろにつける.

BootStrap: docker
From: alpine:edge

%post
    apk add --update --no-cache \
        bat

%runscript
    bat $@

上のDefinition Fileを batcat.def という名前で作成し,Buildを行う.sifファイルは bat と名前をつける.

$ ls
batcat.def

$ singularity build --fakeroot bat batcat.def

$ ls
bat  batcat.def

環境設定

sifファイルを保存するディレクトリを作成し,そのディレクトリを PATH に追加する.この作業は初めて利用する場合のみで良い.

$ mkdir -p $HOME/.singularity/bin
$ echo "export PATH=$PATH:$HOME/.singularity/bin" >> ~/.zshrc
$ source ~/.zshrc

実行

最後に PATH を通している場所へsifファイルを移動させる.

$ ls
bat  batcat.def

$ mv bat ~/.singularity/bin

sifファイルを移動させたらコマンドのように利用できる.

$ bat batcat.def
───────┬────────────────────────────────────────────────────────────────────────────────────────────────
       │ File: batcat.def
───────┼────────────────────────────────────────────────────────────────────────────────────────────────
   1   │ BootStrap: docker
   2   │ From: alpine:edge
   3   4   │ %post
   5   │     apk add --update --no-cache \
   6   │         bat
   7   8   │ %runscript
   9   │     bat $@
───────┴────────────────────────────────────────────────────────────────────────────────────────────────