Singularity(四)| 自定义容器

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 文件中各节的顺序并不重要,在构建过程中可以包含多个同名的节,并将它们相互追加。

  • unsetunset%setupunsetunset

    在基本操作系统安装完成后,在容器外部的主机系统上执行 %setup 节中的命令。我们可以使用 %setup 节中的$SINGULARITY_ROOTFS 环境变量引用容器的文件系统。

    这里在容器的根目录下创建 app 这个文件夹用于放置我们的外部程序,如果使用 mkdir /app 则将在主机上文件系统的根目录下创建 app 文件夹。

  • unsetunset%filesunsetunset

    这一节允许将文件从主机系统复制到容器中,比使用 %setup 节更安全。每一行都是一个 <source><destination> 对,其中源是主机系统上的路径,目标是容器中的路径。当省略 <destination> 目标时,<source> 源将被看作与 destination 相同。

  • unsetunset%postunsetunset

    %post 部分在构建容器时内执行,但次序在安装基本操作系统后。因此,%post 部分是执行新应用程序安装的地方。在该节中,我们可以使用 gitwget 等工具从网上下载文件,安装新软件和库,编写配置文件,创建新目录等。

  • %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 的文件配置了语法高亮,看起来很舒服,见下图:

def_vscode

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 容器使用 shellexecrun 指令,并结合 --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 多平台发布

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/451717.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

数据集踩的坑及解决方案汇总

数据集踩的坑及解决方案汇总 数据集各种格式构建并训练自己的数据集汇总Yolo系列SSDMask R-CNN报错 NotADirectoryError: [Errno 20] Not a directory: /Users/mia/Desktop/P-Clean/mask-RCNN/PennFudanPed2/labelme_json/.DS_StoreFaster R-CNN数据的格式转换划分数据集设定内…

移掉 K 位数字(LeetCode 402)

文章目录 1.问题描述2.难度等级3.热门指数4.解题思路4.1 暴力法4.2 贪心 单调栈 参考文献 1.问题描述 给你一个以字符串表示的非负整数 num 和一个整数 k&#xff0c;移除这个数中的 k 位数字&#xff0c;使得剩下的整数最小。请你以字符串形式返回这个最小的整数。 示例 1 …

进电子厂了,感触颇多...

作者&#xff1a;三哥 个人网站&#xff1a;https://j3code.cn 本文已收录到语雀&#xff1a;https://www.yuque.com/j3code/me-public-note/lpgzm6y2nv9iw8ec 是的&#xff0c;真进电子厂了&#xff0c;但主人公不是我。 虽然我不是主人公&#xff0c;但是我经历的过程是和主…

Igraph入门指南 6

3、make_系列&#xff1a;igraph的建图工具 按照定义&#xff0c;正则图是指各顶点的度均相同的无向简单图&#xff0c;因为我目前没有找到描述度相等的有向&#xff08;或自环图&#xff09;的标准名称&#xff0c;所以在本文中借用一下这个概念&#xff0c;并加上定语有向无…

Android studio SDK Manager显示不全的问题解决

发现SDK Manager中只显示已下载的SDK版本&#xff0c;想下载其他版本下载不到&#xff0c;尝试翻墙也没用&#xff0c;修改host文件成功 在多个地点Ping服务器,网站测速 - 站长工具 输入dl.google.com&#xff0c;进行ping检测。 选择一个地址&#xff0c;比如180.163.150.1…

【深度学习笔记】5_12稠密连接网络(DenseNet)

注&#xff1a;本文为《动手学深度学习》开源内容&#xff0c;部分标注了个人理解&#xff0c;仅为个人学习记录&#xff0c;无抄袭搬运意图 5.12 稠密连接网络&#xff08;DenseNet&#xff09; ResNet中的跨层连接设计引申出了数个后续工作。本节我们介绍其中的一个&#xf…

Python学习:基础语法

版本查看 python --version编码 默认情况下&#xff0c;Python 3 源码文件以 UTF-8 编码&#xff0c;所有字符串都是 unicode 字符串。 特殊情况下&#xff0c;也可以为源码文件指定不同的编码&#xff1a; # -*- coding: cp-1252 -*-标识符 第一个字符必须是字母表中字母或…

Java学习笔记------常用API

Math类 常用方法&#xff1a; 1. publicb static int abs(int a) 获取参数绝对值 2. publicb static double ceil(double a) 向上取整 3. publicb static floor(double a) 向下取整 4.public static int round(float a) 四舍五入 5. publicb static int max…

Vue3全家桶 - VueRouter - 【2】重定向路由

重定向路由 在路由规则数组中&#xff0c;可采用 redirect 来重定向到另一个地址&#xff1a; 通常是将 / 重定向到 某个页面&#xff1b; 示例展示&#xff1a; router/index.js&#xff1a;import { createRouter, createWebHashHistory, createWebHistory } from vue-route…

云桥通SDWAN企业组网的15大应用场景

云桥通SD-WAN企业组网技术在企业网络中有多样化的应用场景&#xff0c;在技术不断迭代升级中&#xff0c;已经越来越匹配现在的互联网环境&#xff0c;其中在这15中常见的应用场景中&#xff0c;使用云桥通SDWAN企业组网可以很好的帮到企业&#xff1a; 分支机构连接优化&#…

蓝桥杯之【01背包模版】牛客例题展示

牛客链接 #include <bits/stdc.h> using namespace std; int n,V; const int N1010; int v[N],w[N]; int dp[N][N]; int main() {cin>>n>>V;for(int i1;i<n;i){cin>>v[i]>>w[i];}for(int i1;i<n;i){for(int j1;j<V;j){dp[i][j]dp[i-1][…

力扣刷题Days16(js)-67二进制求和

目录 1,题目 2&#xff0c;代码 2.1转换进制数 2.2模拟加法 3&#xff0c;学习与总结 Math.floor() 模拟加法思路回顾 重点复习巩固 模拟加法的思路和学习位运算&#xff1b; 今天没精力了&#xff0c;先休息 1,题目 给你两个二进制字符串 a 和 b &#xff0c;以二进制…

CSS 用 flex 布局绘制骰子

<!DOCTYPE html> <html><head><meta charset"utf-8"><title></title><style>.box {height: 100px;width: 100px;border: 2px solid grey;border-radius: 10px;display: flex;justify-content: center; // 水平居中/* alig…

桥接模式以及在JDBC源码剖析

介绍&#xff1a; 1、桥接模式是指&#xff1a;将实现和抽象放在两个不同类层次中&#xff0c;使两个层次可以独立改变 2、是一种结构型设计模式 3、Bridge模式基于类的最小设计原则&#xff0c;通过使用封装、聚合以及继承等行为让不同的类承担不同的职责。 4、特点&#xff1…

【DAY11 软考中级备考笔记】数据结构 查找和排序

数据结构 查找和排序 3月12日 – 天气&#xff1a;晴 1. 顺序查找 顺序查找就是简单的从头一个一个的进行比较&#xff0c;注意它的平均查找长度 2. 折半查找 折半查找和二叉排序树一致&#xff1a; 优点&#xff1a;查找效率很高 缺点&#xff1a;要求必须是循序存储并且表中…

LoadRunner学习:RuntimeSetting、参数化、关联、(unfinished

LoadRunner RuntimeSetting 运行时设置 在Vuser中设置Run-time Settings RunLogic&#xff1a;运行逻辑&#xff0c;决定了脚本真正执行逻辑&#xff0c; Init和End部分代码只能执行一次。决定脚本真正执行逻辑的意思是&#xff0c;在Run中的代码和Number of Iteration决定了…

马斯克放出豪言,他旗下的xAI要把Grok开源了

每周跟踪AI热点新闻动向和震撼发展 想要探索生成式人工智能的前沿进展吗&#xff1f;订阅我们的简报&#xff0c;深入解析最新的技术突破、实际应用案例和未来的趋势。与全球数同行一同&#xff0c;从行业内部的深度分析和实用指南中受益。不要错过这个机会&#xff0c;成为AI领…

WeiPHP5.0远程代码执行漏洞

文章目录 前言声明一、漏洞描述二、影响版本三、漏洞复现四、修复建议 前言 weiphp 是一个开源&#xff0c;高效&#xff0c;简洁的微信开发平台 声明 请勿利用文章内的相关技术从事非法测试&#xff0c;由于传播、利用此文所提供的信息或者工具而造成的任何直接或者间接的后…

Learn OpenGL 08 颜色+基础光照+材质+光照贴图

我们在现实生活中看到某一物体的颜色并不是这个物体真正拥有的颜色&#xff0c;而是它所反射的(Reflected)颜色。物体的颜色为物体从一个光源反射各个颜色分量的大小。 创建光照场景 首先需要创建一个光源&#xff0c;因为我们以及有一个立方体数据&#xff0c;我们只需要进行…