Singularity(四)| 自定义容器
4.1 Singularity Definition 文件
对于可复制的、高质量的容器,我们应该使用定义文件(Definition File)构建 Singularity 容器 。使用定义文件的方式可以在纯文本文件中描述容器的配置和构建过程。定义文件通常具有 .def
扩展名。在其中可以指定容器的基础镜像、安装软件包、设置环境变量等。然后使用 sudo singularity build
命令根据定义文件构建容器。这也使得添加文件、环境变量和安装定制软件变得容易。
定义文件包含一个 header 和一个 body。header 决定了开始使用的基础容器,body 进一步分为几个部分,这些部分执行诸如安装软件、设置环境以及将文件从主机系统复制到容器中的操作。
以下是一个定义文件的示例:
BootStrap: library
From: ubuntu:20.04
%setup
mkdir ${SINGULARITY_ROOTFS}/app
%post
apt-get -y update
apt-get -y install fortune cowsay lolcat
%environment
export LC_ALL=C
export PATH=/usr/games:$PATH
%runscript
fortune | cowsay | lolcat
%labels
Author GodloveD
在这个例子中,header 告诉 Singularity 使用来自容器库的基本 Ubuntu 20.04 镜像。
引导文件的主要内容分为几节(section)。在构建过程中,不同的节在不同的时间添加不同的内容或执行命令。注意,如果任何命令失败,构建过程将停止。def 文件中各节的顺序并不重要,在构建过程中可以包含多个同名的节,并将它们相互追加。
-
%setup
在基本操作系统安装完成后,在容器外部的主机系统上执行
%setup
节中的命令。我们可以使用%setup
节中的$SINGULARITY_ROOTFS
环境变量引用容器的文件系统。这里在容器的根目录下创建 app 这个文件夹用于放置我们的外部程序,如果使用
mkdir /app
则将在主机上文件系统的根目录下创建 app 文件夹。 -
%files
这一节允许将文件从主机系统复制到容器中,比使用 %setup 节更安全。每一行都是一个
<source>
和<destination>
对,其中源是主机系统上的路径,目标是容器中的路径。当省略<destination>
目标时,<source>
源将被看作与destination
相同。 -
%post
%post
部分在构建容器时内执行,但次序在安装基本操作系统后。因此,%post
部分是执行新应用程序安装的地方。在该节中,我们可以使用git
和wget
等工具从网上下载文件,安装新软件和库,编写配置文件,创建新目录等。 -
%environment
部分定义了一些环境变量,这些变量将在运行时对容器可用。
-
%runscript
定义了容器在
run
指令执行时要采取的操作。 -
%labels
这部分允许将注释性内容(作者、更新时间等)添加到容器中。
我们可以按照以下方式调用 build
指令从这个定义文件构建一个容器(假设它是一个名为 lolcow.def 的文件),
singularity build lolcow.sif lolcow.def
这个小例子说明了可以使用定义文件完成的容器构建操作。
除了从 Docker Hub 等官方容器存储库的基本镜像(如 Ubuntu、Debian、CentOS、Arch 和 BusyBox)开始构建容器之外,我们还可以使用主机系统上的现有容器作为基础容器。
小技巧:
编写 def 文件建议利用 VScode 插件 Apptainer/Singularity (在插件商店直接搜索安装),其特别为后缀为
.def
的文件配置了语法高亮,看起来很舒服,见下图:
4.2 从容器仓库下载 Singularity 容器
Singularity Hub 是一个公共容器仓库,我们可以从中获取已经构建好的容器。使用 sudo singularity build
命令,指定 shub://URL
或 Singularity Hub 上容器的名称来下载并构建容器。例如:
$ singularity build mycontainer.sif shub://singularityhub/ubuntu
第一个参数 mycontainer.sif
指定容器的路径和名称。第二个参数 shub://singularityhub/ubuntu
给出了要下载的容器库 URI。默认情况下,容器将被转换为压缩的只读 SIF 格式。如果希望容器是可修改的状态,使用 --sandbox
选项。
4.3 修改本地 singularity 容器
如果已经有一个现成的 Singularity 容器,我们当然也可以直接使用该容器作为基础进行修改和扩展。前面我们提到,sif 格式为只读的压缩文件,因此如果我们现有为 sif 格式容器,我们需要先将容器转换为 sandbox 格式。
使用 build --sandbox
指令和选项建立一个 sandbox:
singularity build --sandbox ubuntu ubuntu.sif
singularity build --sandbox ubuntu library://ubuntu
这个指令创建了一个名为 ubuntu
的 sandbox,其中包含整个 ubuntu 操作系统和当前工作目录下的一些 Singularity 元数据。
在此基础上,对 sandbox 容器使用 shell
、exec
和 run
指令,并结合 --writable
选项,我们就可以在沙箱目录中写入文件。在后面我们会对这些指令进行更详细的介绍。
singularity exec --writable ubuntu touch /foo
singularity exec ubuntu/ ls /foo
/foo
通过这种方式,我们可以进入镜像并安装软件和依赖项,直到容器完全满足我们的需求。
由于 build
指令可以接受已有容器作为目标,并以任何一种支持的格式创建容器,所以我们同样可以将 sandbox 转换为 SIF 格式:
singularity build ubuntu.sif ubuntu
4.4 基于 CentOS 7 的 singularity 容器
在此,我们为大家提供了一个基于 centOS 7 系统的容器定义文件,其中定义了常见的软件安装所需依赖包和库,且包含了 R、python、perl、java 和 PHP 等语言的解释器和标准运行环境。参考上述基于 def 文件的容器构建方法,我们可将这一容器构建为 sandbox,在此基础上进入容器后安装我们所需的各类软件。
Bootstrap: docker
From: centos:7.9.2009
%setup
mkdir ${SINGULARITY_ROOTFS}/app
%files
/mnt/data1/prog1/Container/ACGT101_PopGen/CentOS/R/R_base_pkgs.tar /app/R/R_base_pkgs.tar
%post
# compilie software that depends on the corresponding libraries.
yum install -y gcc* glibc*
# a comprehensive set of tools available for software development
yum groupinstall -y "Development Tools"
# a collection of utilities that extend the functionality of yum, such as yum-config-manager, yum-builddep, yumdownloader
yum install -y yum-utils
# provide a foreign function interface (FFI) that allows programming languages to call functions written in different languages
yum install -y libffi*
# provide an API for creating text-based user interfaces (TUI) in a terminal
yum install -y ncurses ncurses-devel
# edit and manipulate text input in a terminal, providing features like command history, line editing, tab completion ...
yum install -y readline readline-devel
# X Toolkit Intrinsics library, which is part of the X Window System
yum install -y libXt libXt-devel
# work with web APIs and performing network-related tasks such as downloading files, sending HTTP requests ...
yum install -y libcurl curl curl-devel
# parse, manipulate, and work with XML documents and data
yum install -y xml libxml2 libxml2-devel
# develope applications with scripting capabilities and graphical user interfaces
yum install -y tcl tcl-devel tk tk-devel
# provide functions and utilities for data compression and decompression
yum install -y zlib* lzo* unzip zip bzip* xz*
# an open-source software library that provides cryptographic functions and protocols to secure communications over computer networks
yum install -y openssl* crypto*
# graphics-related
yum install -y libtiff* libjpeg* libpng* libXpm* cairo cairo-devel gd gd-devel igraph igraph-devel ImageMagick gnuplot* inkscape
# system management software
yum install -y smartmontools # Self-Monitoring, Analysis, and Reporting Technology (SMART) data of storage devices
yum install -y net-tools # managing and diagnosing network connections
yum install -y sysstat # a collection of performance monitoring tools for Linux systems
# enable the development and deployment of applications that use SQLite for data storage and manipulation
yum install -y sqlite*
# a mature and widely-used open-source library for handling Unicode and globalized software development
yum install -y libicu*
# TeX document production system
yum install -y texlive*
# C++ library for rendering PDF documents
yum install -y poppler-cpp
# provide a rich set of functions and features for pattern matching and manipulation using regular expressions
yum install -y pcre2 pcre2-devel
# install useful apps
yum install -y dos2unix wget which
# provide a collection of additional software packages that are not available in the default repositories
yum install -y epel-release
yum-config-manager --enable epel
# PHP
yum install -y php
# Java
yum install -y java-1.8.0-openjdk*
# > Perl
yum install -y perl perl-ExtUtils-Embed perl-CPAN perl-GD
# > Python
# Install default python version 2.7.5
yum install -y python Cython python-devel python-pip
# Install python 3.9
cd /app
mkdir Python
cd Python
wget https://www.python.org/ftp/python/3.9.16/Python-3.9.16.tgz
tar -xzf Python-3.9.16.tgz
cd Python-3.9.16
./configure --with-system-ffi --with-computed-gotos --enable-loadable-sqlite-extensions
make -j 8
make altinstall
# > R
# provide a set of routines (R version) for performing common linear algebra operations, such as matrix multiplication, vector operations ...
yum install -y openblas-Rblas
yum-builddep R -y
# Install R 3.6.3
cd /app/R
tar -xf R_base_pkgs.tar
cp R_base_pkgs/R-3.6.3.tar.gz .
tar -zxvf R-3.6.3.tar.gz
cd R-3.6.3
./configure --prefix=/usr/local/R-3.6.3 --enable-R-shlib --with-libpng --with-jpeglib --with-libtiff --with-cairo --with-x=no
make -j8
make install
# Install R 4.2.1
cd /app/R
cp R_base_pkgs/R-4.2.1.tar.gz .
tar -zxvf R-4.2.1.tar.gz
cd R-4.2.1
./configure --prefix=/usr/local/R-4.2.1 --enable-R-shlib --with-libpng --with-jpeglib --with-libtiff --with-cairo --with-x=no
make -j8
make install
%labels
Author handsome_boy
Version 1.0
Time 2023/05/17
本文由 mdnice 多平台发布