On Snellius only Apptainer is installed. For backward compatibility there is a symbolic link from the former
singularity command to
On Lisa, both Singularity and Apptainer are installed, with the former accessible through the
singularity command, and latter through the
apptainer command . Note that Apptainer contains a compability script called
run-singularity that will actually call the
Apptainer (and Singularity) is a software system that is in active development. SURF aims to keep the version of Apptainer on our systems at the latest stable release. To keep our documentation up to date we have decided to give some general guidelines and do not provide in-depth generic information, but there are links below to find this information.
We guarantee no backward compatibility when Singularity/Apptainer is upgraded.
Using a Singularity/Apptainer container involves two steps:
- Preparing the container image, by downloading or building it.
- Running the container on a host system
In order to build your own container images you will need to have Singularity/Apptainer installed on a Linux system where you have root (i.e. superuser) rights. Note that building the container image therefore isn't possible on our systems, as regular users do not have root access. However, on Snellius the
cbuild partition can be used instead, see below.
Once you have a Singularity/Apptainer container image, you can then run it on Snellius, Lisa or the Grid system. You will need regular SSH access to one of these systems to do so.
Building the container
Using your local installation of Singularity/Apptainer
You can use Singularity/Apptainer on your local Linux system to build a container image. How you install Singularity/Apptainer locally depends on the Linux distribution you're using. For example, on Fedora you can install Singularity with the command
sudo dnf install singularity, on Arch Linux with
sudo pacman -S singularity (and similar commands for installing Apptainer). Ubuntu does not have Singularity included in the main software repositories. For manual builds of the Singularity or Apptainer software (note: the software, not the container!), you can check the here (Singularity) and here (Apptainer).
You can install Singularity/Apptainer for example on your own machine, or on a virtual environment, either at your local computer, at SURF HPC Cloud, or at another Cloud resource provider. Administrative privileges are necessary to install the software.
Container build nodes (Snellius)
On Snellius we have a Singularity build partition called
cbuild . The nodes in this partition are configured to allow building of Singularity containers without root privileges. There are two ways to build a Singularity container using a
cbuild node, we describe both below.
Using interactive SSH access
salloc command to reserve a
cbuild node, and then SSH into that node. You can then interactively run the Singularity/Apptainer commands you need to build the container image, specifying the
Reserve a node in the cbuild partition
SSH into the node and build image
When you got assigned a node (in this example srv2), ssh into the node and build the container, based on your definition file.
Suppose you have an definition file, for example for the hello world application "lolcow":
Test the image
When the container was successfully built, test it to make sure no more build script changes and image rebuilds are needed (the latter would best be done on the current cbuild node)
When satified, close the connection to the cbuild node
Using a SLURM batch job
The second option is to use a regular job script, containing the necessary commands to build the Singularity image:
When the job successfully finishes it will have produced the Singularity image, which you can then use further.
Error with temporary files
As noted in the job script above we need to specify a different directory for temporary files, as the default location on
/scratch-local does not work for Singularity (more specifically, the issue is that
/scratch-local is a network-mounted file sytem).
If you forget to set the
SINGULARITY_TMPDIR correctly in the job script you will get an error like this:
Get and run an image from Docker Hub
It is possible to convert a Docker container to the Singularity format, make sure you use the
cbuild partition on Snellius for this. Otherwise you will run into errors related to missing privileges. E.g. pull in an image from Docker Hub with
and then run it with
To run a container interactively, pull in an image with e.g.
And then enter the container with
Or run a single command with
By default, the $HOME directory will be bound to your image. Changes made inside the image to the files that are bound also take effect outside the container. Deleting, creating and modifying files in your image's home directory removes also the files from the host itself.
Changes inside the image made to the image itself (not to the directories that are bound) will not be saved and you will not have root rights inside the container. To make permanent adjustments continue reading in the post hoc adjustments section below.
Build an image with a Singularity definition file
Convert from local existing Docker images.
Docker is not installed or used on Snellius and Lisa. But the following is possible when Docker and Singularity are installed on a local host. Current local Docker images can be shown with
sudo docker images where you can find the ID or IMAGE ID
To convert the image you need to set up a local Docker registry
tag the wanted images and push it to the registry
Now you can use singularity to pull the images from your private local registry. The registry has no encryption and we must tell singularity to ignore lack of https with the prefix "SINGULARITY_NOHTTPS=true"
Stop the docker registry and clean up
Post hoc image adjustments
When you need to install additional software or change some settings you can execute commands using shell commands inside the image.
Keep in mind that you will need root permissions for these operations. Which you do not have on Snellius/Lisa.
The first step is to convert the compressed image into a uncompressed format in a folder structure (called a sandbox)
To keep the image persistent use the
--writeable option. e.g.
Exiting the image can be done by exiting the shell with the
After editing you compress the sandbox to ensure portability and ease of use with
Fine-tune for NIKHEF systems
To ensure you can reach data in scratch on NIKHEF systems while working on the grid you need to create a directory with the same name inside your image. This is also done with the following one-liner:
Upload your image to our systems
After bootstrap has been completed on your system and tests have been done locally it is time to move the image to one of the SURFsara systems. The various systems have different best practices on where to put your image.
From your local system, you can do a SCP to Snellius, Lisa, or Grid with the following command the image will be placed in your home directory.
Or while using the Grid distribute it via Softdrive (cvmfs):
And publish with with
Use your singularity image
First create a directory on the scratch-shared part of the scratch file system ( NOTE: of course there are a lot of other ways to use your image, we just give one example ).
Copy the image to the newly created scratch shared directory.
Go into the newly created directory
Start an interactive container sesion (you need to be on a compute node in order to access singularity).
Jump into the scratch directory
copy your image to the scratch space
When you start a job you start by default in the scratch dir (
$TMPDIR) and there is no need to switch to another directory. Images are automaticly cached by the cvmfs filesystem and there is no need to copy them to the scratch (
How do I set the
$PATH variable is taken from host environment. You can add a path to $PATH with
To make the PATH persistent in your image, add the export PATH line to "/environment" inside the container
My image is too large, can I make it smaller?
This is most likely caused by the software that was needed to build the software. Think of compilers, development headers and source code.
To make the image smaller you can best uninstall these packages and source code compress the package. Hereby an example which works on a ubuntu based container.
Detect and remove the largest packages
Before we can edit the image we need to convert it to an editable sandbox format
Then bash inside your sandbox with sudo rights:
To detect the largest packages we run the following one-liner which prints package size and sort them by size (from small to big)
Then we select the big package, which are not needed at runtime. This depends on your software stack but in general, it is save to remove gcc, clang, and *-dev packages.
Also, remove the unneeded old packages and removing the cache of apt might help to clean the container.
Compress the image
After cleaning the container can converted back to a compressed format with
Why is the
--pwd $PWD option necessary?
By default, Singularity makes the current working directory in the container the same as on the host. For resolving the current working directory, Singularity looks up the physical absolute path (see
man pwd for more info). However, many directories on our systems are symbolic links and the current working directory would resolve different than expected. This results that your files are not were you expected them to be (combined with some warning messages).
I do not like Docker, is there an alternative?
Yes, there is! You can write a Singularity bootstrap file (or convert Dockerfile to Singularity bootstrap).
A singularity bootstrap file is a recipe to create a singularity image (or Singularities counterpart of a Dockerfile).
Information about writing a Singularity bootstrap file can be found at https://www.sylabs.io/guides/3.0/user-guide/definition_files.html.
You can use Singularity build command to convert containers between the formats supported by Singularity.
When I use Singularity, I get an "LD_PRELOAD error". Is this affecting my runs and how can avoid it?
This error is caused by the XALT tool we use to monitor software usage on the system. The error does not impact the correct execution of Singularity, but it is printed every time you run a command interactively within the container.
In order to stop Singularity to print this error, you need to unset the LD_PRELOAD variable outside the container with the command:
This will prevent XALT to track your usage, so please use this only if directly affect your work with Singularity.