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
と指定する.また,From
は emacs.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 $@
───────┴────────────────────────────────────────────────────────────────────────────────────────────────