From 412c9db54cb65772655c9c4d3b9e407b126ee771 Mon Sep 17 00:00:00 2001
From: Wouter Deconinck <wdconinc@gmail.com>
Date: Sun, 27 Mar 2022 21:20:25 +0000
Subject: [PATCH] Intel oneAPI 2022.1.2 HPC kit and CUDA build containers

---
 .gitlab-ci.yml               |  24 ++
 containers.yaml              |  18 ++
 containers/cuda/Dockerfile   |  72 ++++++
 containers/cuda/bashrc       | 452 +++++++++++++++++++++++++++++++++++
 containers/debian/Dockerfile |   2 +
 containers/oneapi/Dockerfile |  72 ++++++
 containers/oneapi/bashrc     | 452 +++++++++++++++++++++++++++++++++++
 7 files changed, 1092 insertions(+)
 create mode 100644 containers.yaml
 create mode 100644 containers/cuda/Dockerfile
 create mode 100644 containers/cuda/bashrc
 create mode 100644 containers/oneapi/Dockerfile
 create mode 100644 containers/oneapi/bashrc

diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml
index 4c431bae5..d3c51ecec 100644
--- a/.gitlab-ci.yml
+++ b/.gitlab-ci.yml
@@ -184,6 +184,30 @@ debian_base:default:
                    containers/debian
     - !reference [.build, script]
 
+oneapi_base:default:
+  extends: .build
+  stage: build:base
+  needs:
+    - version
+  variables:
+    BUILD_IMAGE: "oneapi_base"
+  script:
+    - docker build -t ${CI_REGISTRY_IMAGE}/${BUILD_IMAGE}:${INTERNAL_TAG} 
+                   containers/oneapi
+    - !reference [.build, script]
+
+cuda_base:default:
+  extends: .build
+  stage: build:base
+  needs:
+    - version
+  variables:
+    BUILD_IMAGE: "cuda_base"
+  script:
+    - docker build -t ${CI_REGISTRY_IMAGE}/${BUILD_IMAGE}:${INTERNAL_TAG} 
+                   containers/oneapi
+    - !reference [.build, script]
+
 jug_dev:default:
   extends: .build
   stage: build:jug
diff --git a/containers.yaml b/containers.yaml
new file mode 100644
index 000000000..c9a6da725
--- /dev/null
+++ b/containers.yaml
@@ -0,0 +1,18 @@
+base:
+  debian:
+    develop: amd64/debian:testing-20211220-slim
+    runtime: amd64/debian:testing-20211220-slim
+    Dockerfile: containers/base/Dockerfile.in
+  oneapi:
+    develop: intel/oneapi-hpckit:2022.1.2-devel-ubuntu18.04
+    runtime: intel/oneapi-runtime:2022.1.2-devel-ubuntu18.04
+    Dockerfile: containers/base/Dockerfile.in
+  cuda:
+    develop: nvidia/cuda:11.6.0-devel-ubuntu18.04
+    runtime: nvidia/cuda:11.6.0-runtime-ubuntu18.04
+    Dockerfile: containers/base/Dockerfile.in
+jug:
+  jug_dev:
+    Dockerfile: containers/jug/dev.Dockerfile
+  jug_xl:
+    Dockerfile: containers/jug/xl.Dockerfile
diff --git a/containers/cuda/Dockerfile b/containers/cuda/Dockerfile
new file mode 100644
index 000000000..947cd8aaf
--- /dev/null
+++ b/containers/cuda/Dockerfile
@@ -0,0 +1,72 @@
+#syntax=docker/dockerfile:1.2
+
+# Minimal container based on Intel oneAPI for up-to-date packages. 
+# Very lightweight container with a minimal build environment (LOL)
+
+FROM  nvidia/cuda:11.6.0-devel-ubuntu18.04
+LABEL maintainer="Wouter Deconinck <wouter.deconinck@umanitoba.ca"      \
+      name="cuda_base"                                                \
+      march="amd64"
+
+COPY bashrc /root/.bashrc
+
+ENV CLICOLOR_FORCE=1                                                    \
+    LANGUAGE=en_US.UTF-8                                                \
+    LANG=en_US.UTF-8                                                    \
+    LC_ALL=en_US.UTF-8
+
+## Install additional packages. Remove the auto-cleanup functionality
+## for docker, as we're using the new buildkit cache instead.
+## We also install gitlab-runner, from the buster package (as bullseye is not available atm)
+## TODO: libyaml-cpp-dev is a dependency for afterburner. We can probably remove
+##       this once afterburner is added to spack
+RUN --mount=type=cache,target=/var/cache/apt                            \
+    rm -f /etc/apt/apt.conf.d/docker-clean                              \
+ && ln -fs /usr/share/zoneinfo/America/New_York /etc/localtime          \
+ && echo "US/Eastern" > /etc/timezone                                   \
+ && apt-get -yqq update                                                 \
+ && apt-get -yqq upgrade                                                \
+ && apt-get -yqq install --no-install-recommends                        \
+        bc                                                              \
+        ca-certificates                                                 \
+        clang-format                                                    \
+        clang-tidy                                                      \
+        curl                                                            \
+        file                                                            \
+        build-essential                                                 \
+        gdb                                                             \
+        ghostscript                                                     \
+        git                                                             \
+        gnupg2                                                          \
+        gv                                                              \
+        iproute2                                                        \
+        iputils-ping                                                    \
+        iputils-tracepath                                               \
+        less                                                            \
+        libcbor-xs-perl                                                 \
+        libjson-xs-perl                                                 \
+        libyaml-cpp-dev                                                 \
+        locales                                                         \
+        lua-posix                                                       \
+        make                                                            \
+        nano                                                            \
+        openssh-client                                                  \
+        parallel                                                        \
+        poppler-utils                                                   \
+        time                                                            \
+        unzip                                                           \
+        valgrind                                                        \
+        vim-nox                                                         \
+        wget                                                            \
+ && localedef -i en_US -f UTF-8 en_US.UTF-8                             \
+ && gcc --version                                                       \
+ && curl -L                                                             \
+    "https://packages.gitlab.com/install/repositories/runner/gitlab-runner/script.deb.sh" \
+    | bash                                                              \
+ && sed -i "s/bookworm/buster/"                                         \
+           /etc/apt/sources.list.d/runner_gitlab-runner.list            \
+ && apt-get -yqq update                                                 \
+ && apt-get -yqq install --no-install-recommends                        \
+        gitlab-runner                                                   \
+ && apt-get -yqq autoremove                                             \
+ && rm -rf /var/lib/apt/lists/*                                         
diff --git a/containers/cuda/bashrc b/containers/cuda/bashrc
new file mode 100644
index 000000000..4d1c1f348
--- /dev/null
+++ b/containers/cuda/bashrc
@@ -0,0 +1,452 @@
+#!/bin/bash
+iatest=$(expr index "$-" i)
+
+#######################################################
+# SOURCED ALIAS'S AND SCRIPTS BY zachbrowne.me
+#######################################################
+
+# Source global definitions
+if [ -f /etc/bashrc ]; then
+	 . /etc/bashrc
+fi
+
+# Enable bash programmable completion features in interactive shells
+if [ -f /usr/share/bash-completion/bash_completion ]; then
+	. /usr/share/bash-completion/bash_completion
+elif [ -f /etc/bash_completion ]; then
+	. /etc/bash_completion
+fi
+
+#######################################################
+# EXPORTS
+#######################################################
+
+# Disable the bell
+if [[ $iatest > 0 ]]; then bind "set bell-style visible"; fi
+
+# Expand the history size
+export HISTFILESIZE=10000
+export HISTSIZE=500
+
+# Don't put duplicate lines in the history and do not add lines that start with a space
+export HISTCONTROL=erasedups:ignoredups:ignorespace
+
+# Check the window size after each command and, if necessary, update the values of LINES and COLUMNS
+shopt -s checkwinsize
+
+# Causes bash to append to history instead of overwriting it so if you start a new terminal, you have old session history
+shopt -s histappend
+PROMPT_COMMAND='history -a'
+
+# Allow ctrl-S for history navigation (with ctrl-R)
+stty -ixon
+
+# Ignore case on auto-completion
+# Note: bind used instead of sticking these in .inputrc
+if [[ $iatest > 0 ]]; then bind "set completion-ignore-case on"; fi
+
+# Show auto-completion list automatically, without double tab
+if [[ $iatest > 0 ]]; then bind "set show-all-if-ambiguous On"; fi
+
+# Set the default editor
+export EDITOR=vim
+export VISUAL=vim
+alias pico='edit'
+alias spico='sedit'
+alias nano='edit'
+alias snano='sedit'
+
+# To have colors for ls and all grep commands such as grep, egrep and zgrep
+export CLICOLOR=1
+export LS_COLORS='no=00:fi=00:di=00;34:ln=01;36:pi=40;33:so=01;35:do=01;35:bd=40;33;01:cd=40;33;01:or=40;31;01:ex=01;32:*.tar=01;31:*.tgz=01;31:*.arj=01;31:*.taz=01;31:*.lzh=01;31:*.zip=01;31:*.z=01;31:*.Z=01;31:*.gz=01;31:*.bz2=01;31:*.deb=01;31:*.rpm=01;31:*.jar=01;31:*.jpg=01;35:*.jpeg=01;35:*.gif=01;35:*.bmp=01;35:*.pbm=01;35:*.pgm=01;35:*.ppm=01;35:*.tga=01;35:*.xbm=01;35:*.xpm=01;35:*.tif=01;35:*.tiff=01;35:*.png=01;35:*.mov=01;35:*.mpg=01;35:*.mpeg=01;35:*.avi=01;35:*.fli=01;35:*.gl=01;35:*.dl=01;35:*.xcf=01;35:*.xwd=01;35:*.ogg=01;35:*.mp3=01;35:*.wav=01;35:*.xml=00;31:'
+#export GREP_OPTIONS='--color=auto' #deprecated
+#alias grep="/usr/bin/grep $GREP_OPTIONS"
+#unset GREP_OPTIONS
+
+# Color for manpages in less makes manpages a little easier to read
+export LESS_TERMCAP_mb=$'\E[01;31m'
+export LESS_TERMCAP_md=$'\E[01;31m'
+export LESS_TERMCAP_me=$'\E[0m'
+export LESS_TERMCAP_se=$'\E[0m'
+export LESS_TERMCAP_so=$'\E[01;44;33m'
+export LESS_TERMCAP_ue=$'\E[0m'
+export LESS_TERMCAP_us=$'\E[01;32m'
+
+#######################################################
+# GENERAL ALIAS'S
+#######################################################
+
+# Alias's to modified commands
+alias cp='cp -i'
+alias mv='mv -i'
+alias rm='rm -iv'
+alias mkdir='mkdir -p'
+alias ps='ps auxf'
+alias ping='ping -c 10'
+alias less='less -R'
+alias cls='clear'
+alias apt-get='apt-get'
+alias multitail='multitail --no-repeat -c'
+alias freshclam='freshclam'
+alias vi='vim'
+alias vis='vim "+set si"'
+
+# Change directory aliases
+alias home='cd ~'
+alias cd..='cd ..'
+alias ..='cd ..'
+alias ...='cd ../..'
+alias ....='cd ../../..'
+alias .....='cd ../../../..'
+
+# cd into the old directory
+alias bd='cd "$OLDPWD"'
+
+# Remove a directory and all files
+alias rmd='/bin/rm  --recursive --force --verbose '
+
+# Alias's for multiple directory listing commands
+alias la='ls -Alh' # show hidden files
+alias ls='ls -aFh --color=always' # add colors and file type extensions
+alias lx='ls -lXBh' # sort by extension
+alias lk='ls -lSrh' # sort by size
+alias lc='ls -lcrh' # sort by change time
+alias lu='ls -lurh' # sort by access time
+alias lr='ls -lRh' # recursive ls
+alias lt='ls -ltrh' # sort by date
+alias lm='ls -alh |more' # pipe through 'more'
+alias lw='ls -xAh' # wide listing format
+alias ll='ls -Fls' # long listing format
+alias labc='ls -lap' #alphabetical sort
+alias lf="ls -l | egrep -v '^d'" # files only
+alias ldir="ls -l | egrep '^d'" # directories only
+
+# alias chmod commands
+alias mx='chmod a+x'
+alias 000='chmod -R 000'
+alias 644='chmod -R 644'
+alias 666='chmod -R 666'
+alias 755='chmod -R 755'
+alias 777='chmod -R 777'
+
+# Search command line history
+alias h="history | grep "
+
+# Search running processes
+alias p="ps aux | grep "
+alias topcpu="/bin/ps -eo pcpu,pid,user,args | sort -k 1 -r | head -10"
+
+# Search files in the current folder
+alias f="find . | grep "
+
+# Count all files (recursively) in the current folder
+alias countfiles="for t in files links directories; do echo \`find . -type \${t:0:1} | wc -l\` \$t; done 2> /dev/null"
+
+# To see if a command is aliased, a file, or a built-in command
+alias checkcommand="type -t"
+
+# Show all logs in /var/log
+alias logs="sudo find /var/log -type f -exec file {} \; | grep 'text' | cut -d' ' -f1 | sed -e's/:$//g' | grep -v '[0-9]$' | xargs tail -f"
+
+# SHA1
+alias sha1='openssl sha1'
+
+#######################################################
+# SPECIAL FUNCTIONS
+#######################################################
+
+# Extracts any archive(s) (if unp isn't installed)
+extract () {
+	for archive in $*; do
+		if [ -f $archive ] ; then
+			case $archive in
+				*.tar.bz2)   tar xvjf $archive    ;;
+				*.tar.gz)    tar xvzf $archive    ;;
+				*.bz2)       bunzip2 $archive     ;;
+				*.rar)       rar x $archive       ;;
+				*.gz)        gunzip $archive      ;;
+				*.tar)       tar xvf $archive     ;;
+				*.tbz2)      tar xvjf $archive    ;;
+				*.tgz)       tar xvzf $archive    ;;
+				*.zip)       unzip $archive       ;;
+				*.Z)         uncompress $archive  ;;
+				*.7z)        7z x $archive        ;;
+				*)           echo "don't know how to extract '$archive'..." ;;
+			esac
+		else
+			echo "'$archive' is not a valid file!"
+		fi
+	done
+}
+
+# Searches for text in all files in the current folder
+ftext ()
+{
+	# -i case-insensitive
+	# -I ignore binary files
+	# -H causes filename to be printed
+	# -r recursive search
+	# -n causes line number to be printed
+	# optional: -F treat search term as a literal, not a regular expression
+	# optional: -l only print filenames and not the matching lines ex. grep -irl "$1" *
+	grep -iIHrn --color=always "$1" . | less -r
+}
+
+# Copy file with a progress bar
+cpp()
+{
+	set -e
+	strace -q -ewrite cp -- "${1}" "${2}" 2>&1 \
+	| awk '{
+	count += $NF
+	if (count % 10 == 0) {
+		percent = count / total_size * 100
+		printf "%3d%% [", percent
+		for (i=0;i<=percent;i++)
+			printf "="
+			printf ">"
+			for (i=percent;i<100;i++)
+				printf " "
+				printf "]\r"
+			}
+		}
+	END { print "" }' total_size=$(stat -c '%s' "${1}") count=0
+}
+
+# Copy and go to the directory
+cpg ()
+{
+	if [ -d "$2" ];then
+		cp $1 $2 && cd $2
+	else
+		cp $1 $2
+	fi
+}
+
+# Move and go to the directory
+mvg ()
+{
+	if [ -d "$2" ];then
+		mv $1 $2 && cd $2
+	else
+		mv $1 $2
+	fi
+}
+
+# Create and go to the directory
+mkdirg ()
+{
+	mkdir -p $1
+	cd $1
+}
+
+# Goes up a specified number of directories  (i.e. up 4)
+up ()
+{
+	local d=""
+	limit=$1
+	for ((i=1 ; i <= limit ; i++))
+		do
+			d=$d/..
+		done
+	d=$(echo $d | sed 's/^\///')
+	if [ -z "$d" ]; then
+		d=..
+	fi
+	cd $d
+}
+
+#Automatically do an ls after each cd
+# cd ()
+# {
+# 	if [ -n "$1" ]; then
+# 		builtin cd "$@" && ls
+# 	else
+# 		builtin cd ~ && ls
+# 	fi
+# }
+
+# Returns the last 2 fields of the working directory
+pwdtail ()
+{
+	pwd|awk -F/ '{nlast = NF -1;print $nlast"/"$NF}'
+}
+
+# Show the current version of the operating system
+ver ()
+{
+	local dtype
+	dtype=$(distribution)
+
+	if [ $dtype == "redhat" ]; then
+		if [ -s /etc/redhat-release ]; then
+			cat /etc/redhat-release && uname -a
+		else
+			cat /etc/issue && uname -a
+		fi
+	elif [ $dtype == "suse" ]; then
+		cat /etc/SuSE-release
+	elif [ $dtype == "debian" ]; then
+		lsb_release -a
+		# sudo cat /etc/issue && sudo cat /etc/issue.net && sudo cat /etc/lsb_release && sudo cat /etc/os-release # Linux Mint option 2
+	elif [ $dtype == "gentoo" ]; then
+		cat /etc/gentoo-release
+	elif [ $dtype == "mandriva" ]; then
+		cat /etc/mandriva-release
+	elif [ $dtype == "slackware" ]; then
+		cat /etc/slackware-version
+	else
+		if [ -s /etc/issue ]; then
+			cat /etc/issue
+		else
+			echo "Error: Unknown distribution"
+			exit 1
+		fi
+	fi
+}
+
+# For some reason, rot13 pops up everywhere
+rot13 () {
+	if [ $# -eq 0 ]; then
+		tr '[a-m][n-z][A-M][N-Z]' '[n-z][a-m][N-Z][A-M]'
+	else
+		echo $* | tr '[a-m][n-z][A-M][N-Z]' '[n-z][a-m][N-Z][A-M]'
+	fi
+}
+
+# Trim leading and trailing spaces (for scripts)
+trim()
+{
+	local var=$@
+	var="${var#"${var%%[![:space:]]*}"}"  # remove leading whitespace characters
+	var="${var%"${var##*[![:space:]]}"}"  # remove trailing whitespace characters
+	echo -n "$var"
+}
+
+#######################################################
+# Set the ultimate amazing command prompt
+#######################################################
+
+alias cpu="grep 'cpu ' /proc/stat | awk '{usage=(\$2+\$4)*100/(\$2+\$4+\$5)} END {print usage}' | awk '{printf(\"%.1f\n\", \$1)}'"
+function __setprompt
+{
+	local LAST_COMMAND=$? # Must come first!
+
+	# Define colors
+	local LIGHTGRAY="\033[0;37m"
+	local WHITE="\033[1;37m"
+	local BLACK="\033[0;30m"
+	local DARKGRAY="\033[1;30m"
+	local RED="\033[0;31m"
+	local LIGHTRED="\033[1;31m"
+	local GREEN="\033[0;32m"
+	local LIGHTGREEN="\033[1;32m"
+	local BROWN="\033[0;33m"
+	local YELLOW="\033[1;33m"
+	local BLUE="\033[0;34m"
+	local LIGHTBLUE="\033[1;34m"
+	local MAGENTA="\033[0;35m"
+	local LIGHTMAGENTA="\033[1;35m"
+	local CYAN="\033[0;36m"
+	local LIGHTCYAN="\033[1;36m"
+	local NOCOLOR="\033[0m"
+
+	# Show error exit code if there is one
+	if [[ $LAST_COMMAND != 0 ]]; then
+		# PS1="\[${RED}\](\[${LIGHTRED}\]ERROR\[${RED}\])-(\[${LIGHTRED}\]Exit Code \[${WHITE}\]${LAST_COMMAND}\[${RED}\])-(\[${LIGHTRED}\]"
+		PS1="\[${DARKGRAY}\](\[${LIGHTRED}\]ERROR\[${DARKGRAY}\])-(\[${RED}\]Exit Code \[${LIGHTRED}\]${LAST_COMMAND}\[${DARKGRAY}\])-(\[${RED}\]"
+		if [[ $LAST_COMMAND == 1 ]]; then
+			PS1+="General error"
+		elif [ $LAST_COMMAND == 2 ]; then
+			PS1+="Missing keyword, command, or permission problem"
+		elif [ $LAST_COMMAND == 126 ]; then
+			PS1+="Permission problem or command is not an executable"
+		elif [ $LAST_COMMAND == 127 ]; then
+			PS1+="Command not found"
+		elif [ $LAST_COMMAND == 128 ]; then
+			PS1+="Invalid argument to exit"
+		elif [ $LAST_COMMAND == 129 ]; then
+			PS1+="Fatal error signal 1"
+		elif [ $LAST_COMMAND == 130 ]; then
+			PS1+="Script terminated by Control-C"
+		elif [ $LAST_COMMAND == 131 ]; then
+			PS1+="Fatal error signal 3"
+		elif [ $LAST_COMMAND == 132 ]; then
+			PS1+="Fatal error signal 4"
+		elif [ $LAST_COMMAND == 133 ]; then
+			PS1+="Fatal error signal 5"
+		elif [ $LAST_COMMAND == 134 ]; then
+			PS1+="Fatal error signal 6"
+		elif [ $LAST_COMMAND == 135 ]; then
+			PS1+="Fatal error signal 7"
+		elif [ $LAST_COMMAND == 136 ]; then
+			PS1+="Fatal error signal 8"
+		elif [ $LAST_COMMAND == 137 ]; then
+			PS1+="Fatal error signal 9"
+		elif [ $LAST_COMMAND -gt 255 ]; then
+			PS1+="Exit status out of range"
+		else
+			PS1+="Unknown error code"
+		fi
+		PS1+="\[${DARKGRAY}\])\[${NOCOLOR}\]\n"
+	else
+		PS1=""
+	fi
+
+	# Date
+	PS1+="\[${DARKGRAY}\](\[${CYAN}\]\$(date +%a) $(date +%b-'%-m')" # Date
+	PS1+="${BLUE} $(date +'%-I':%M:%S%P)\[${DARKGRAY}\])-" # Time
+
+	# CPU
+	PS1+="(\[${MAGENTA}\]CPU $(cpu)%"
+
+	# Jobs
+	PS1+="\[${DARKGRAY}\]:\[${MAGENTA}\]\j"
+
+	# Network Connections (for a server - comment out for non-server)
+	PS1+="\[${DARKGRAY}\]:\[${MAGENTA}\]Net $(awk 'END {print NR}' /proc/net/tcp)"
+
+	PS1+="\[${DARKGRAY}\])-"
+
+	# User and server
+	local SSH_IP=`echo $SSH_CLIENT | awk '{ print $1 }'`
+	local SSH2_IP=`echo $SSH2_CLIENT | awk '{ print $1 }'`
+	if [ $SSH2_IP ] || [ $SSH_IP ] ; then
+		PS1+="(\[${RED}\]\u@\h"
+	else
+		PS1+="(\[${RED}\]\u"
+	fi
+
+	# Current directory
+	PS1+="\[${DARKGRAY}\]:\[${BROWN}\]\w\[${DARKGRAY}\])-"
+
+	# Total size of files in current directory
+	PS1+="(\[${GREEN}\]$(/bin/ls -lah | /bin/grep -m 1 total | /bin/sed 's/total //')\[${DARKGRAY}\]:"
+
+	# Number of files
+	PS1+="\[${GREEN}\]\$(/bin/ls -A -1 | /usr/bin/wc -l)\[${DARKGRAY}\])"
+
+	# Skip to the next line
+	PS1+="\n"
+
+  # singularity?
+  if [ -e /environment ] ; then
+      PS1+="singularity"
+  fi
+
+	if [[ $EUID -ne 0 ]]; then
+		PS1+="\[${GREEN}\]>\[${NOCOLOR}\] " # Normal user
+	else
+		PS1+="\[${RED}\]>\[${NOCOLOR}\] " # Root user
+	fi
+
+	# PS2 is used to continue a command using the \ character
+	PS2="\[${DARKGRAY}\]>\[${NOCOLOR}\] "
+
+	# PS3 is used to enter a number choice in a script
+	PS3='Please enter a number from above list: '
+
+	# PS4 is used for tracing a script in debug mode
+	PS4='\[${DARKGRAY}\]+\[${NOCOLOR}\] '
+}
+PROMPT_COMMAND='__setprompt'
diff --git a/containers/debian/Dockerfile b/containers/debian/Dockerfile
index 1c71071fa..d0caed73b 100644
--- a/containers/debian/Dockerfile
+++ b/containers/debian/Dockerfile
@@ -22,6 +22,8 @@ ENV CLICOLOR_FORCE=1                                                    \
 ##       this once afterburner is added to spack
 RUN --mount=type=cache,target=/var/cache/apt                            \
     rm -f /etc/apt/apt.conf.d/docker-clean                              \
+ && ln -fs /usr/share/zoneinfo/America/New_York /etc/localtime          \
+ && echo "US/Eastern" > /etc/timezone                                   \
  && apt-get -yqq update                                                 \
  && apt-get -yqq upgrade                                                \
  && apt-get -yqq install --no-install-recommends                        \
diff --git a/containers/oneapi/Dockerfile b/containers/oneapi/Dockerfile
new file mode 100644
index 000000000..b30c36975
--- /dev/null
+++ b/containers/oneapi/Dockerfile
@@ -0,0 +1,72 @@
+#syntax=docker/dockerfile:1.2
+
+# Minimal container based on Intel oneAPI for up-to-date packages. 
+# Very lightweight container with a minimal build environment (LOL)
+
+FROM  intel/oneapi-hpckit:2022.1.2-devel-ubuntu18.04
+LABEL maintainer="Wouter Deconinck <wouter.deconinck@umanitoba.ca"      \
+      name="oneapi_base"                                                \
+      march="amd64"
+
+COPY bashrc /root/.bashrc
+
+ENV CLICOLOR_FORCE=1                                                    \
+    LANGUAGE=en_US.UTF-8                                                \
+    LANG=en_US.UTF-8                                                    \
+    LC_ALL=en_US.UTF-8
+
+## Install additional packages. Remove the auto-cleanup functionality
+## for docker, as we're using the new buildkit cache instead.
+## We also install gitlab-runner, from the buster package (as bullseye is not available atm)
+## TODO: libyaml-cpp-dev is a dependency for afterburner. We can probably remove
+##       this once afterburner is added to spack
+RUN --mount=type=cache,target=/var/cache/apt                            \
+    rm -f /etc/apt/apt.conf.d/docker-clean                              \
+ && ln -fs /usr/share/zoneinfo/America/New_York /etc/localtime          \
+ && echo "US/Eastern" > /etc/timezone                                   \
+ && apt-get -yqq update                                                 \
+ && apt-get -yqq upgrade                                                \
+ && apt-get -yqq install --no-install-recommends                        \
+        bc                                                              \
+        ca-certificates                                                 \
+        clang-format                                                    \
+        clang-tidy                                                      \
+        curl                                                            \
+        file                                                            \
+        build-essential                                                 \
+        gdb                                                             \
+        ghostscript                                                     \
+        git                                                             \
+        gnupg2                                                          \
+        gv                                                              \
+        iproute2                                                        \
+        iputils-ping                                                    \
+        iputils-tracepath                                               \
+        less                                                            \
+        libcbor-xs-perl                                                 \
+        libjson-xs-perl                                                 \
+        libyaml-cpp-dev                                                 \
+        locales                                                         \
+        lua-posix                                                       \
+        make                                                            \
+        nano                                                            \
+        openssh-client                                                  \
+        parallel                                                        \
+        poppler-utils                                                   \
+        time                                                            \
+        unzip                                                           \
+        valgrind                                                        \
+        vim-nox                                                         \
+        wget                                                            \
+ && localedef -i en_US -f UTF-8 en_US.UTF-8                             \
+ && gcc --version                                                       \
+ && curl -L                                                             \
+    "https://packages.gitlab.com/install/repositories/runner/gitlab-runner/script.deb.sh" \
+    | bash                                                              \
+ && sed -i "s/bookworm/buster/"                                         \
+           /etc/apt/sources.list.d/runner_gitlab-runner.list            \
+ && apt-get -yqq update                                                 \
+ && apt-get -yqq install --no-install-recommends                        \
+        gitlab-runner                                                   \
+ && apt-get -yqq autoremove                                             \
+ && rm -rf /var/lib/apt/lists/*                                         
diff --git a/containers/oneapi/bashrc b/containers/oneapi/bashrc
new file mode 100644
index 000000000..4d1c1f348
--- /dev/null
+++ b/containers/oneapi/bashrc
@@ -0,0 +1,452 @@
+#!/bin/bash
+iatest=$(expr index "$-" i)
+
+#######################################################
+# SOURCED ALIAS'S AND SCRIPTS BY zachbrowne.me
+#######################################################
+
+# Source global definitions
+if [ -f /etc/bashrc ]; then
+	 . /etc/bashrc
+fi
+
+# Enable bash programmable completion features in interactive shells
+if [ -f /usr/share/bash-completion/bash_completion ]; then
+	. /usr/share/bash-completion/bash_completion
+elif [ -f /etc/bash_completion ]; then
+	. /etc/bash_completion
+fi
+
+#######################################################
+# EXPORTS
+#######################################################
+
+# Disable the bell
+if [[ $iatest > 0 ]]; then bind "set bell-style visible"; fi
+
+# Expand the history size
+export HISTFILESIZE=10000
+export HISTSIZE=500
+
+# Don't put duplicate lines in the history and do not add lines that start with a space
+export HISTCONTROL=erasedups:ignoredups:ignorespace
+
+# Check the window size after each command and, if necessary, update the values of LINES and COLUMNS
+shopt -s checkwinsize
+
+# Causes bash to append to history instead of overwriting it so if you start a new terminal, you have old session history
+shopt -s histappend
+PROMPT_COMMAND='history -a'
+
+# Allow ctrl-S for history navigation (with ctrl-R)
+stty -ixon
+
+# Ignore case on auto-completion
+# Note: bind used instead of sticking these in .inputrc
+if [[ $iatest > 0 ]]; then bind "set completion-ignore-case on"; fi
+
+# Show auto-completion list automatically, without double tab
+if [[ $iatest > 0 ]]; then bind "set show-all-if-ambiguous On"; fi
+
+# Set the default editor
+export EDITOR=vim
+export VISUAL=vim
+alias pico='edit'
+alias spico='sedit'
+alias nano='edit'
+alias snano='sedit'
+
+# To have colors for ls and all grep commands such as grep, egrep and zgrep
+export CLICOLOR=1
+export LS_COLORS='no=00:fi=00:di=00;34:ln=01;36:pi=40;33:so=01;35:do=01;35:bd=40;33;01:cd=40;33;01:or=40;31;01:ex=01;32:*.tar=01;31:*.tgz=01;31:*.arj=01;31:*.taz=01;31:*.lzh=01;31:*.zip=01;31:*.z=01;31:*.Z=01;31:*.gz=01;31:*.bz2=01;31:*.deb=01;31:*.rpm=01;31:*.jar=01;31:*.jpg=01;35:*.jpeg=01;35:*.gif=01;35:*.bmp=01;35:*.pbm=01;35:*.pgm=01;35:*.ppm=01;35:*.tga=01;35:*.xbm=01;35:*.xpm=01;35:*.tif=01;35:*.tiff=01;35:*.png=01;35:*.mov=01;35:*.mpg=01;35:*.mpeg=01;35:*.avi=01;35:*.fli=01;35:*.gl=01;35:*.dl=01;35:*.xcf=01;35:*.xwd=01;35:*.ogg=01;35:*.mp3=01;35:*.wav=01;35:*.xml=00;31:'
+#export GREP_OPTIONS='--color=auto' #deprecated
+#alias grep="/usr/bin/grep $GREP_OPTIONS"
+#unset GREP_OPTIONS
+
+# Color for manpages in less makes manpages a little easier to read
+export LESS_TERMCAP_mb=$'\E[01;31m'
+export LESS_TERMCAP_md=$'\E[01;31m'
+export LESS_TERMCAP_me=$'\E[0m'
+export LESS_TERMCAP_se=$'\E[0m'
+export LESS_TERMCAP_so=$'\E[01;44;33m'
+export LESS_TERMCAP_ue=$'\E[0m'
+export LESS_TERMCAP_us=$'\E[01;32m'
+
+#######################################################
+# GENERAL ALIAS'S
+#######################################################
+
+# Alias's to modified commands
+alias cp='cp -i'
+alias mv='mv -i'
+alias rm='rm -iv'
+alias mkdir='mkdir -p'
+alias ps='ps auxf'
+alias ping='ping -c 10'
+alias less='less -R'
+alias cls='clear'
+alias apt-get='apt-get'
+alias multitail='multitail --no-repeat -c'
+alias freshclam='freshclam'
+alias vi='vim'
+alias vis='vim "+set si"'
+
+# Change directory aliases
+alias home='cd ~'
+alias cd..='cd ..'
+alias ..='cd ..'
+alias ...='cd ../..'
+alias ....='cd ../../..'
+alias .....='cd ../../../..'
+
+# cd into the old directory
+alias bd='cd "$OLDPWD"'
+
+# Remove a directory and all files
+alias rmd='/bin/rm  --recursive --force --verbose '
+
+# Alias's for multiple directory listing commands
+alias la='ls -Alh' # show hidden files
+alias ls='ls -aFh --color=always' # add colors and file type extensions
+alias lx='ls -lXBh' # sort by extension
+alias lk='ls -lSrh' # sort by size
+alias lc='ls -lcrh' # sort by change time
+alias lu='ls -lurh' # sort by access time
+alias lr='ls -lRh' # recursive ls
+alias lt='ls -ltrh' # sort by date
+alias lm='ls -alh |more' # pipe through 'more'
+alias lw='ls -xAh' # wide listing format
+alias ll='ls -Fls' # long listing format
+alias labc='ls -lap' #alphabetical sort
+alias lf="ls -l | egrep -v '^d'" # files only
+alias ldir="ls -l | egrep '^d'" # directories only
+
+# alias chmod commands
+alias mx='chmod a+x'
+alias 000='chmod -R 000'
+alias 644='chmod -R 644'
+alias 666='chmod -R 666'
+alias 755='chmod -R 755'
+alias 777='chmod -R 777'
+
+# Search command line history
+alias h="history | grep "
+
+# Search running processes
+alias p="ps aux | grep "
+alias topcpu="/bin/ps -eo pcpu,pid,user,args | sort -k 1 -r | head -10"
+
+# Search files in the current folder
+alias f="find . | grep "
+
+# Count all files (recursively) in the current folder
+alias countfiles="for t in files links directories; do echo \`find . -type \${t:0:1} | wc -l\` \$t; done 2> /dev/null"
+
+# To see if a command is aliased, a file, or a built-in command
+alias checkcommand="type -t"
+
+# Show all logs in /var/log
+alias logs="sudo find /var/log -type f -exec file {} \; | grep 'text' | cut -d' ' -f1 | sed -e's/:$//g' | grep -v '[0-9]$' | xargs tail -f"
+
+# SHA1
+alias sha1='openssl sha1'
+
+#######################################################
+# SPECIAL FUNCTIONS
+#######################################################
+
+# Extracts any archive(s) (if unp isn't installed)
+extract () {
+	for archive in $*; do
+		if [ -f $archive ] ; then
+			case $archive in
+				*.tar.bz2)   tar xvjf $archive    ;;
+				*.tar.gz)    tar xvzf $archive    ;;
+				*.bz2)       bunzip2 $archive     ;;
+				*.rar)       rar x $archive       ;;
+				*.gz)        gunzip $archive      ;;
+				*.tar)       tar xvf $archive     ;;
+				*.tbz2)      tar xvjf $archive    ;;
+				*.tgz)       tar xvzf $archive    ;;
+				*.zip)       unzip $archive       ;;
+				*.Z)         uncompress $archive  ;;
+				*.7z)        7z x $archive        ;;
+				*)           echo "don't know how to extract '$archive'..." ;;
+			esac
+		else
+			echo "'$archive' is not a valid file!"
+		fi
+	done
+}
+
+# Searches for text in all files in the current folder
+ftext ()
+{
+	# -i case-insensitive
+	# -I ignore binary files
+	# -H causes filename to be printed
+	# -r recursive search
+	# -n causes line number to be printed
+	# optional: -F treat search term as a literal, not a regular expression
+	# optional: -l only print filenames and not the matching lines ex. grep -irl "$1" *
+	grep -iIHrn --color=always "$1" . | less -r
+}
+
+# Copy file with a progress bar
+cpp()
+{
+	set -e
+	strace -q -ewrite cp -- "${1}" "${2}" 2>&1 \
+	| awk '{
+	count += $NF
+	if (count % 10 == 0) {
+		percent = count / total_size * 100
+		printf "%3d%% [", percent
+		for (i=0;i<=percent;i++)
+			printf "="
+			printf ">"
+			for (i=percent;i<100;i++)
+				printf " "
+				printf "]\r"
+			}
+		}
+	END { print "" }' total_size=$(stat -c '%s' "${1}") count=0
+}
+
+# Copy and go to the directory
+cpg ()
+{
+	if [ -d "$2" ];then
+		cp $1 $2 && cd $2
+	else
+		cp $1 $2
+	fi
+}
+
+# Move and go to the directory
+mvg ()
+{
+	if [ -d "$2" ];then
+		mv $1 $2 && cd $2
+	else
+		mv $1 $2
+	fi
+}
+
+# Create and go to the directory
+mkdirg ()
+{
+	mkdir -p $1
+	cd $1
+}
+
+# Goes up a specified number of directories  (i.e. up 4)
+up ()
+{
+	local d=""
+	limit=$1
+	for ((i=1 ; i <= limit ; i++))
+		do
+			d=$d/..
+		done
+	d=$(echo $d | sed 's/^\///')
+	if [ -z "$d" ]; then
+		d=..
+	fi
+	cd $d
+}
+
+#Automatically do an ls after each cd
+# cd ()
+# {
+# 	if [ -n "$1" ]; then
+# 		builtin cd "$@" && ls
+# 	else
+# 		builtin cd ~ && ls
+# 	fi
+# }
+
+# Returns the last 2 fields of the working directory
+pwdtail ()
+{
+	pwd|awk -F/ '{nlast = NF -1;print $nlast"/"$NF}'
+}
+
+# Show the current version of the operating system
+ver ()
+{
+	local dtype
+	dtype=$(distribution)
+
+	if [ $dtype == "redhat" ]; then
+		if [ -s /etc/redhat-release ]; then
+			cat /etc/redhat-release && uname -a
+		else
+			cat /etc/issue && uname -a
+		fi
+	elif [ $dtype == "suse" ]; then
+		cat /etc/SuSE-release
+	elif [ $dtype == "debian" ]; then
+		lsb_release -a
+		# sudo cat /etc/issue && sudo cat /etc/issue.net && sudo cat /etc/lsb_release && sudo cat /etc/os-release # Linux Mint option 2
+	elif [ $dtype == "gentoo" ]; then
+		cat /etc/gentoo-release
+	elif [ $dtype == "mandriva" ]; then
+		cat /etc/mandriva-release
+	elif [ $dtype == "slackware" ]; then
+		cat /etc/slackware-version
+	else
+		if [ -s /etc/issue ]; then
+			cat /etc/issue
+		else
+			echo "Error: Unknown distribution"
+			exit 1
+		fi
+	fi
+}
+
+# For some reason, rot13 pops up everywhere
+rot13 () {
+	if [ $# -eq 0 ]; then
+		tr '[a-m][n-z][A-M][N-Z]' '[n-z][a-m][N-Z][A-M]'
+	else
+		echo $* | tr '[a-m][n-z][A-M][N-Z]' '[n-z][a-m][N-Z][A-M]'
+	fi
+}
+
+# Trim leading and trailing spaces (for scripts)
+trim()
+{
+	local var=$@
+	var="${var#"${var%%[![:space:]]*}"}"  # remove leading whitespace characters
+	var="${var%"${var##*[![:space:]]}"}"  # remove trailing whitespace characters
+	echo -n "$var"
+}
+
+#######################################################
+# Set the ultimate amazing command prompt
+#######################################################
+
+alias cpu="grep 'cpu ' /proc/stat | awk '{usage=(\$2+\$4)*100/(\$2+\$4+\$5)} END {print usage}' | awk '{printf(\"%.1f\n\", \$1)}'"
+function __setprompt
+{
+	local LAST_COMMAND=$? # Must come first!
+
+	# Define colors
+	local LIGHTGRAY="\033[0;37m"
+	local WHITE="\033[1;37m"
+	local BLACK="\033[0;30m"
+	local DARKGRAY="\033[1;30m"
+	local RED="\033[0;31m"
+	local LIGHTRED="\033[1;31m"
+	local GREEN="\033[0;32m"
+	local LIGHTGREEN="\033[1;32m"
+	local BROWN="\033[0;33m"
+	local YELLOW="\033[1;33m"
+	local BLUE="\033[0;34m"
+	local LIGHTBLUE="\033[1;34m"
+	local MAGENTA="\033[0;35m"
+	local LIGHTMAGENTA="\033[1;35m"
+	local CYAN="\033[0;36m"
+	local LIGHTCYAN="\033[1;36m"
+	local NOCOLOR="\033[0m"
+
+	# Show error exit code if there is one
+	if [[ $LAST_COMMAND != 0 ]]; then
+		# PS1="\[${RED}\](\[${LIGHTRED}\]ERROR\[${RED}\])-(\[${LIGHTRED}\]Exit Code \[${WHITE}\]${LAST_COMMAND}\[${RED}\])-(\[${LIGHTRED}\]"
+		PS1="\[${DARKGRAY}\](\[${LIGHTRED}\]ERROR\[${DARKGRAY}\])-(\[${RED}\]Exit Code \[${LIGHTRED}\]${LAST_COMMAND}\[${DARKGRAY}\])-(\[${RED}\]"
+		if [[ $LAST_COMMAND == 1 ]]; then
+			PS1+="General error"
+		elif [ $LAST_COMMAND == 2 ]; then
+			PS1+="Missing keyword, command, or permission problem"
+		elif [ $LAST_COMMAND == 126 ]; then
+			PS1+="Permission problem or command is not an executable"
+		elif [ $LAST_COMMAND == 127 ]; then
+			PS1+="Command not found"
+		elif [ $LAST_COMMAND == 128 ]; then
+			PS1+="Invalid argument to exit"
+		elif [ $LAST_COMMAND == 129 ]; then
+			PS1+="Fatal error signal 1"
+		elif [ $LAST_COMMAND == 130 ]; then
+			PS1+="Script terminated by Control-C"
+		elif [ $LAST_COMMAND == 131 ]; then
+			PS1+="Fatal error signal 3"
+		elif [ $LAST_COMMAND == 132 ]; then
+			PS1+="Fatal error signal 4"
+		elif [ $LAST_COMMAND == 133 ]; then
+			PS1+="Fatal error signal 5"
+		elif [ $LAST_COMMAND == 134 ]; then
+			PS1+="Fatal error signal 6"
+		elif [ $LAST_COMMAND == 135 ]; then
+			PS1+="Fatal error signal 7"
+		elif [ $LAST_COMMAND == 136 ]; then
+			PS1+="Fatal error signal 8"
+		elif [ $LAST_COMMAND == 137 ]; then
+			PS1+="Fatal error signal 9"
+		elif [ $LAST_COMMAND -gt 255 ]; then
+			PS1+="Exit status out of range"
+		else
+			PS1+="Unknown error code"
+		fi
+		PS1+="\[${DARKGRAY}\])\[${NOCOLOR}\]\n"
+	else
+		PS1=""
+	fi
+
+	# Date
+	PS1+="\[${DARKGRAY}\](\[${CYAN}\]\$(date +%a) $(date +%b-'%-m')" # Date
+	PS1+="${BLUE} $(date +'%-I':%M:%S%P)\[${DARKGRAY}\])-" # Time
+
+	# CPU
+	PS1+="(\[${MAGENTA}\]CPU $(cpu)%"
+
+	# Jobs
+	PS1+="\[${DARKGRAY}\]:\[${MAGENTA}\]\j"
+
+	# Network Connections (for a server - comment out for non-server)
+	PS1+="\[${DARKGRAY}\]:\[${MAGENTA}\]Net $(awk 'END {print NR}' /proc/net/tcp)"
+
+	PS1+="\[${DARKGRAY}\])-"
+
+	# User and server
+	local SSH_IP=`echo $SSH_CLIENT | awk '{ print $1 }'`
+	local SSH2_IP=`echo $SSH2_CLIENT | awk '{ print $1 }'`
+	if [ $SSH2_IP ] || [ $SSH_IP ] ; then
+		PS1+="(\[${RED}\]\u@\h"
+	else
+		PS1+="(\[${RED}\]\u"
+	fi
+
+	# Current directory
+	PS1+="\[${DARKGRAY}\]:\[${BROWN}\]\w\[${DARKGRAY}\])-"
+
+	# Total size of files in current directory
+	PS1+="(\[${GREEN}\]$(/bin/ls -lah | /bin/grep -m 1 total | /bin/sed 's/total //')\[${DARKGRAY}\]:"
+
+	# Number of files
+	PS1+="\[${GREEN}\]\$(/bin/ls -A -1 | /usr/bin/wc -l)\[${DARKGRAY}\])"
+
+	# Skip to the next line
+	PS1+="\n"
+
+  # singularity?
+  if [ -e /environment ] ; then
+      PS1+="singularity"
+  fi
+
+	if [[ $EUID -ne 0 ]]; then
+		PS1+="\[${GREEN}\]>\[${NOCOLOR}\] " # Normal user
+	else
+		PS1+="\[${RED}\]>\[${NOCOLOR}\] " # Root user
+	fi
+
+	# PS2 is used to continue a command using the \ character
+	PS2="\[${DARKGRAY}\]>\[${NOCOLOR}\] "
+
+	# PS3 is used to enter a number choice in a script
+	PS3='Please enter a number from above list: '
+
+	# PS4 is used for tracing a script in debug mode
+	PS4='\[${DARKGRAY}\]+\[${NOCOLOR}\] '
+}
+PROMPT_COMMAND='__setprompt'
-- 
GitLab