Charliecloud provee stacks de software definido por el usuario para centros de computación de alto rendimiento (HPC). Esta funcionalidad de "trae tu propio stack de software" aborda necesidades como:
Charliecloud usa espacios de nombre (namespaces) de Linux para ejecutar contenedores sin operaciones ni demonios privilegiados y con cambios de configuración mínimos en los recursos del Centro de cálculo. Este enfoque simple evita la mayoría de los riesgos de seguridad mientras mantiene el acceso al rendimiento y la funcionalidad que ya se ofrece.
Las imágenes de contenedor se pueden construir usando Docker o cualquier otra cosa que pueda generar un árbol de sistemas de archivos estándar de Linux.
Para proceder seguimos los siguientes pasos.
Procedemos a loguearnos en Drago.
# ssh usuario@drago.csic.es
Tal como se indica en el listado de software disponible para usar Charliecloud siguiente charliecloud, podemos hacer uso del mismo de la siguiente forma:
[usuario@drago31010015 ~]$ module load foss/2021b
[usuario@drago31010015 ~]$ module load charliecloud/0.28
[usuario@drago31010015 ~]$ ch-
ch-checkns ch-convert ch-fromhost ch-image ch-run ch-run-oci ch-ssh ch-test
[usuario@drago31010015 ~]$ ch-
A continuación veremos varias tareas básicas habituales a la hora de trabajar, generar, listar, destruir, imágenes de contenedor, además de poder ejecutar un job en slurm basado en charliecloud.
Para las próximas tareas procedemos a descargar del repositorio de git.csic.es del proyecto drago-hpc-containers, donde podrán encontrar distintos dockerfiles para poder construir imágenes de contenedores.
Procedemos a usar por línea de comandos git para clonar proyecto drago-hpc-containers, nos autenticamos en git.csic.es con nuestro usuario.
[usuario@drago31010015 ~]$ git clone https://git.csic.es/area-de-informatica-cientifica/drago-hpc-
containers.git
Cloning into 'drago-hpc-containers'...
Username for 'https://git.csic.es': USUARIO
Password for 'https://NIF@git.csic.es':
remote: Enumerating objects: 24, done.
remote: Counting objects: 100% (24/24), done.
remote: Compressing objects: 100% (20/20), done.
remote: Total 24 (delta 5), reused 0 (delta 0), pack-reused 0
Receiving objects: 100% (24/24), 8.58 KiB | 2.14 MiB/s, done.
Resolving deltas: 100% (5/5), done.
[usuario@drago31010015 ~]$ ls -lh
[usuario@drago31010015 ~]$ ls -lh
total G
drwxr-xr-x 10 usuario grupo 4.0K Jan 17 10:58 drago-hpc-containers
Una vez tenemos lo anterior realizado ya estamos en disposición de construir imágenes.
En primer lugar, accedemos al directorio generado a partir de clonar el proyecto drago-hpc-containers:
[usuario@drago31010015 ~]$ cd drago-hpc-containers
[usuario@drago31010015 drago-hpc-containers]$ ls -lh
total 32K
-rw-r--r-- 1 usuario grupo 2.6K Jan 17 10:28 README.md
drwxr-xr-x 2 usuario grupo 4.0K Jan 17 10:28 almalinux8
drwxr-xr-x 2 usuario grupo 4.0K Jan 17 11:11 centos7
drwxr-xr-x 2 usuario grupo 4.0K Jan 17 11:11 mpihelloworld
drwxr-xr-x 2 usuario grupo 4.0K Jan 17 11:11 openmpi
drwxr-xr-x 2 usuario grupo 4.0K Jan 17 11:22 rockylinux8
drwxr-xr-x 3 usuario grupo 4.0K Jan 17 11:44 scuff
drwxr-xr-x 3 usuario grupo 4.0K Jan 17 10:28 trinity
[usuario@drago31010015 drago-hpc-containers]$
Accedemos, por ejemplo, en el directorio almalinux8 y visualizamos el contenido del archivo Dockerfile
[usuario@drago31010015 almalinux8]$ cat Dockerfile
# ch-test-scope: standard
FROM almalinux:8
# This image has two purposes: (1) demonstrate we can build a AlmaLinux 8 image
# and (2) provide a build environment for Charliecloud EPEL 8 RPMs.
#
# Quirks:
#
# 1. Install the dnf ovl plugin to work around RPMDB corruption when
# building images with Docker and the OverlayFS storage driver.
#
# 2. Enable PowerTools repo, because some packages in EPEL depend on it.
#
# 3. Install packages needed to build el8 rpms.
#
# 4. Issue #1103: Install libarchive to resolve cmake bug
#
RUN dnf install -y --setopt=install_weak_deps=false \
epel-release \
'dnf-command(config-manager)' \
&& dnf config-manager --enable powertools \
&& dnf install -y --setopt=install_weak_deps=false \
dnf-plugin-ovl \
autoconf \
automake \
gcc \
git \
libarchive \
make \
python3 \
python3-devel \
python3-lark-parser \
python3-requests \
python3-sphinx \
python3-sphinx_rtd_theme \
rpm-build \
rpmlint \
rsync \
squashfs-tools \
squashfuse \
wget \
&& dnf clean all
# Need wheel to install bundled Lark, and the RPM version doesn't work.
RUN pip3 install wheel
# AlmaLinux's linker doesn't search these paths by default; add them because we
# will install stuff later into /usr/local.
RUN echo "/usr/local/lib" > /etc/ld.so.conf.d/usrlocal.conf \
&& echo "/usr/local/lib64" >> /etc/ld.so.conf.d/usrlocal.conf \
&& ldconfig
[usuario@drago31010015 almalinux8]$
Y procedemos finalmente a construirla.
[usuario@drago31010015 almalinux8]$ ch-image build --force .
inferred image name: almalinux8
2. FROM almalinux:8
manifest list: downloading: 100%
manifest: downloading: 100%
config: downloading: 100%
layer 1/1: 9589bd8: downloading: 67.5/67.5 MiB (100%)
flattening image
layer 1/1: 9589bd8: listing
validating tarball members
layer 1/1: 9589bd8: changed 42 absolute symbolic and/or hard links to relative
resolving whiteouts
layer 1/1: 9589bd8: extracting
image arch: amd64
copying image ...
will use --force: rhel8: RHEL 8+ and derivatives
18. RUN.F dnf install -y --setopt=install_weak_deps=false
epel-release
'dnf-command(config-manager)' && dnf config-manager --enable powertools && dnf install -y --
setopt=install_weak_deps=false
dnf-plugin-ovl
autoconf
automake
gcc
git
libarchive
make
python3
python3-devel
python3-lark-parser
python3-
requests
python3-sphinx
python3-sphinx_rtd_theme
rpm-build
rpmlint
rsync
squashfs-tools
squashfuse
wget && dnf clean all
workarounds: init step 1: checking: $ command -v fakeroot > /dev/null
workarounds: init step 1: $ set -ex; if ! grep -Eq '\[epel\]' /etc/yum.conf /etc/yum.repos.d/*;
then dnf install -y https://dl.fedoraproject.org/pub/epel/epel-release-latest-$(rpm -E
%rhel).noarch.rpm; dnf install -y fakeroot; dnf remove -y epel-release; else dnf install -y
fakeroot; fi;
+ grep -Eq '\[epel\]' /etc/yum.conf /etc/yum.repos.d/almalinux-ha.repo /etc/yum.repos.d/almalinux-
nfv.repo /etc/yum.repos.d/almalinux-plus.repo /etc/yum.repos.d/almalinux-powertools.repo
/etc/yum.repos.d/almalinux-resilientstorage.repo /etc/yum.repos.d/almalinux-rt.repo
/etc/yum.repos.d/almalinux.repo
++ rpm -E %rhel
+ dnf install -y https://dl.fedoraproject.org/pub/epel/epel-release-latest-8.noarch.rpm
AlmaLinux 8 - BaseOS
6.8 MB/s | 7.0 MB
00:01
AlmaLinux 8 - AppStream
11 MB/s | 11 MB
00:00
AlmaLinux 8 - Extras
29 kB/s | 18 kB
00:00
epel-release-latest-8.noarch.rpm
31 kB/s | 24 kB
00:00
Dependencies resolved.
===================================================================================================
=============================================================================
Package
Architecture
Version
Repository
Size
===================================================================================================
=============================================================================
Installing:
epel-release
noarch
8-17.el8
@commandline
24 k
Installing dependencies:
dbus-glib
x86_64
0.110-2.el8
baseos
127 k
python3-dateutil
noarch
1:2.6.1-
6.el8
baseos
251 k
python3-dbus
x86_64
1.2.4-15.el8
baseos
134 k
python3-dnf-plugins-core
noarch
4.0.21-
11.el8
baseos
239 k
python3-six
noarch
1.11.0-8.el8
baseos
38 k
Installing weak dependencies:
dnf-plugins-core
noarch
4.0.21-
11.el8
baseos
70 k
Transaction Summary
===================================================================================================
=============================================================================
Install 7 Packages
………
Una vez finaliza la construcción y si no ha habido errores el siguiente paso.
Además de poder construir, como anteriormente, una imagen de contenedor, podemos descargarla directamente desde cualquier registro público o privado que tengamos acceso, como puede ser Docker Hub.
[usuario@drago31010015 almalinux8]$ ch-image pull centos:7
pulling image:
centos:7
requesting arch: amd64
manifest list: downloading: 100%
manifest: downloading: 100%
config: downloading: 100%
layer 1/1: 2d473b0: downloading: 72.6/72.6 MiB (100%)
pulled image: adding to build cache
flattening image
layer 1/1: 2d473b0: listing
validating tarball members
layer 1/1: 2d473b0: changed 17 absolute symbolic and/or hard links to relative
resolving whiteouts
layer 1/1: 2d473b0: extracting
image arch: amd64
done
A continuación, después de construir nuestra propia imágen de contenedor o descargarla de Docker Hub podemos listar si la tenemos disponible para su uso.
[usuario@drago31010015 almalinux8]$ ch-image list
almalinux:8
almalinux8
centos:7
Procedemos a eliminar, por ejemplo, la imagen de Centos 7 descargada de Docker Hub.
[usuario@drago31010015 almalinux8]$ ch-image delete centos:7
deleting image: centos:7
Se ha desplegado servicio de registro de imágenes de contenedor, charts, y otros objetos para uso servicios en el CSIC (Proyecto estado INCUBADORA). Es equivalente a Docker Hub y para su descarga de imágenes procederíamos de la siguiente forma:
[usuario@drago31010015 almalinux8]$ ch-image -vvv --debug --auth --password-many --tls-no-verify pull containerhub.rstools.csic.es/hpcdrago/centos7:latest
verbose level: 3
host architecture from uname: x86_64
host architecture for registry: amd64
registry authentication: True
found storage dir v3: /var/tmp/usuario.ch
validating storage directory: /var/tmp/usuario.ch
executing: git --version
git version 2.31.1
git version OK: 2.31.1 ≥ 2.28.1
using default build cache mode
build cache mode: disabled
image_ref
ir_hostport containerhub.rstools.csic.es
ir_path hpcdrago
ir_name centos7
ir_tag latest
pulling image: containerhub.rstools.csic.es/hpcdrago/centos7:latest
requesting arch: amd64
downloading image: containerhub.rstools.csic.es/hpcdrago/centos7:latest
initializing session
auth: no authorization
GET: https://containerhub.rstools.csic.es:443/v2/hpcdrago/centos7/manifests/latest
response status: 401
date: Wed, 25 Jan 2023 11:52:36 GMT
content-type: application/json; charset=utf-8
content-length: 152
connection: keep-alive
docker-distribution-api-version: registry/2.0
set-cookie: sid=13ed2a95150dbf150f533876cd861a8e; Path=/; HttpOnly
www-authenticate: Bearer realm="https://containerhub.rstools.csic.es/service/token",service="harbor-registry",scope="repository:hpcdrago/centos7:pull"
x-request-id: 635587615de537145a757b28642300d9
strict-transport-security: max-age=15724800; includeSubDomains
HTTP 401 unauthorized
escalating from no authorization
WWW-Authenticate parsed: Bearer {'realm': 'https://containerhub.rstools.csic.es/service/token', 'service': 'harbor-registry', 'scope': 'repository:hpcdrago/centos7:pull'}
skipping Registry_Auth_Bearer_Anon: auth mode mismatch
authenticating using Registry_Auth_Bearer_IDed
Username: usuario
Password:
....
"created_by": "/bin/sh -c #(nop) ADD file:b3ebbe8bd304723d43b7b44a6d990cd657b63d93d6a2a9293983a30bfc1dfa53 in / "
},
{
"created": "2021-09-15T18:20:23.819893035Z",
"created_by": "/bin/sh -c #(nop) LABEL org.label-schema.schema-version=1.0 org.label-schema.name=CentOS Base Image org.label-schema.vendor=CentOS org.label-schema.license=GPLv2 org.label-schema.build-date=20201113 org.opencontainers.image.title=CentOS Base Image org.opencontainers.image.vendor=CentOS org.opencontainers.image.licenses=GPL-2.0-only org.opencontainers.image.created=2020-11-13 00:00:00+00:00",
"empty_layer": true
},
{
"created": "2021-09-15T18:20:23.99863383Z",
"created_by": "/bin/sh -c #(nop) CMD [\"/bin/bash\"]",
"empty_layer": true
},
{
"created": "2022-12-21T14:56:29.072176435Z",
"created_by": "/bin/sh -c yum install -y --setopt=install_weak_deps=false epel-release && yum install -y --setopt=install_weak_deps=false autoconf automake gcc git libarchive make \t\tbzip2 python3 python3-devel rpm-build rpmlint rsync squashfs-tools wget && yum clean all"
},
{
"created": "2022-12-21T14:56:31.013098018Z",
"created_by": "/bin/sh -c pip3 install wheel"
},
{
"created": "2022-12-21T14:56:31.747331975Z",
"created_by": "/bin/sh -c echo \"/usr/local/lib\" > /etc/ld.so.conf.d/usrlocal.conf && echo \"/usr/local/lib64\" >> /etc/ld.so.conf.d/usrlocal.conf && ldconfig"
}
],
"labels": {
"org.label-schema.build-date": "20201113",
"org.label-schema.license": "GPLv2",
"org.label-schema.name": "CentOS Base Image",
"org.label-schema.schema-version": "1.0",
"org.label-schema.vendor": "CentOS",
"org.opencontainers.image.created": "2020-11-13 00:00:00+00:00",
"org.opencontainers.image.licenses": "GPL-2.0-only",
"org.opencontainers.image.title": "CentOS Base Image",
"org.opencontainers.image.vendor": "CentOS"
},
"shell": [
"/bin/sh",
"-c"
],
"volumes": []
}
writing metadata file: /var/tmp/usuario.ch/img/containerhub.rstools.csic.es%hpcdrago%centos7+latest/ch/metadata.json
writing environment file: /var/tmp/usuario.ch/img/containerhub.rstools.csic.es%hpcdrago%centos7+latest/ch/environment
ensuring volume directories exist
image arch: amd64
done
Verificamos y veríamos algo tal como sigue:
[usuario@drago31010015 almalinux8]$ ch-image list
almalinux:8
almalinux8
containerhub.rstools.csic.es/hpcdrago/centos7:latest
Previo a poder usar imagen de contendor para poder ejecutarlo en Drago hay que comprimir la imagen, para ello procedemos así.
[usuario@drago31010015 ~]$ ch-convert almalinux8 almalinux8.tar.gz
input:
ch-image almalinux8
output: tar
almalinux8.tar.gz
exporting ...
done
[usuario@drago31010015 ~]$ ls -lh almalinux8.tar.gz
-rw-r--r-- 1 usuario centro 191M Sep 19 18:59 almalinux8.tar.gz
A partir de la anterior tar.gz generada de la imagen, o si no desde las imágenes que tenemos disponibles, vamos a proceder a generar el contedor, para ello, lo recomendamos en /tmp de la máquina que tengamos, tal como sigue:
[usuario@drago31010015 ~]$ ch-convert almalinux8 /tmp/almalinux8
input:
ch-image almalinux8
output: dir
/tmp/almalinux8
deleting existing image: /tmp/almalinux8
exporting ...
done
A continuación ejecutamos el contenedor indicándole bash en lugar de software dentro del contenedor para así entrar en terminal dentro del contendor.
[usuario@drago31010015 ~]$ ch-run /tmp/almalinux8/ -- bash
[usuario@drago31010015 /]$ id
uid=yyyy5(usuario) gid=yyyyy(grupo) groups=yyyyy(grupo),65534(nogroup)
[usuario@drago31010015 /]$ ls -lh
total 8.0K
lrwxrwxrwx 1 usuario grupo 7 Sep 18 15:24 bin -> usr/bin
drwxr-xr-x 2 usuario grupo 72 Sep 18 15:24 ch
drwxr-xr-x 21 nobody nogroup 3.2K Sep 7 07:22 dev
drwxr-xr-x 48 usuario grupo 4.0K Sep 18 15:25 etc
drwxrwxrwt 3 usuario grupo 60 Sep 19 17:02 home
lrwxrwxrwx 1 usuario grupo 7 Sep 18 15:24 lib -> usr/lib
lrwxrwxrwx 1 usuario grupo 9 Sep 18 15:24 lib64 -> usr/lib64
drwxr-xr-x 2 usuario grupo 6 Oct 9 2021 media
drwxr-xr-x 12 usuario grupo 96 Sep 18 15:24 mnt
drwxr-xr-x 2 usuario grupo 6 Oct 9 2021 opt
dr-xr-xr-x 858 nobody nogroup 0 Jul 8 13:34 proc
drwxr-x--- 3 usuario grupo 105 Sep 18 15:25 root
drwxr-xr-x 11 usuario grupo 148 Sep 1 01:50 run
lrwxrwxrwx 1 usuario grupo 8 Sep 18 15:24 sbin -> usr/sbin
drwxr-xr-x 2 usuario grupo 6 Oct 9 2021 srv
dr-xr-xr-x 13 nobody nogroup 0 Jul 8 13:34 sys
drwxrwxrwt. 8 nobody nogroup 4.0K Sep 19 17:10 tmp
drwxr-xr-x 12 usuario grupo 144 Sep 1 01:50 usr
drwxr-xr-x 19 usuario grupo 249 Sep 1 01:50 var
[usuario@drago31010015 /]$ exit
exit
[usuario@drago31010015 ~]$ id
uid=yyyy5(usuario) gid=yyyyy(grupo)
groups=yyyyy(centro),10002(foss),10003(campus),10004(restricted)
[usuario@drago31010015 ~]$