Blog de Contraslash (Legacy)

Using Singularity containers in HTCondor

December 17, 2016

Using Singularity containers in HTCondor

Introduction

Designed around the notion of extreme mobility of compute and reproducible science, Singularity enables users to have full control of their operating system environment.

Installing Singularity

Singularity needs to be installer in a modern linux distribution, it’s installed as follows

VERSION=2.2
wget https://github.com/singularityware/singularity/releases/download/$VERSION/singularity-$VERSION.tar.gz
tar xvf singularity-$VERSION.tar.gz
cd singularity-$VERSION
./configure --prefix=/usr/local
make
sudo make install

Then, check that everything is alright

singularity -v

Configuring HTCondor

It can be used along with HTCondor by adding some entries to the HTCondor configuration file:

sudo nano /etc/condor/config.d/condor_config.local

# Tell HTCondor where is the singularity executable
SINGULARITY = /usr/local/bin/singularity

SINGULARITY_JOB = (TARGET.DESIRED_OS isnt MY.OpSysAndVer) && ((TARGET.DESIRED_OS is "CentOS6") || (TARGET.DESIRED_OS is "CentOS7"))
SINGULARITY_IMAGE_EXPR = (TARGET.DESIRED_OS is "CentOS6") ? "/tmp/Centos7.img" : "/tmp/Centos7.img"
# Maps $_CONDOR_SCRATCH_DIR on the host to /srv inside the image.
SINGULARITY_TARGET_DIR = /srv
# Writable scratch directories inside the image.  Auto-deleted after the job exits.
MOUNT_UNDER_SCRATCH = /tmp, /var/tmp

Then restart HTCondor sudo service condor restart and check if the machine has singularity enable.

condor_status -const HasSingularity

Testing your configuration

Lets first create a singularity container from Docker Centos image

sudo singularity create --size 2048 /tmp/Centos7.img
sudo singularity import /tmp/Centos7.img docker://centos:latest
sudo singularity exec --writable /tmp/Centos7.img  echo "Hello World"  > /tmp/hola

An then, create a HTCondor submit file

nano /tmp/sing.submit

executable = /bin/hostname
universe = vanilla
+SingularityImage = "/tmp/Centos7.img"
+DESIRED_OS="CentOS6"
output = example1.$(cluster).$(process).out
error =  example1.$(cluster).$(process).err
log =    example1.$(cluster).$(process).log
queue 1

Then execute and wait

condor_submit /tmp/sing.submit

You can find more information here