38,760
edits
(Updating to match new version of source page) |
(Updating to match new version of source page) |
||
Line 30: | Line 30: | ||
** Supports rootless (i.e., normal) container use, etc. similar to Apptainer. | ** Supports rootless (i.e., normal) container use, etc. similar to Apptainer. | ||
** Is available as a package in rpm-supporting (and some other) Linux distributions. | ** Is available as a package in rpm-supporting (and some other) Linux distributions. | ||
** While Podman is a Linux container technology there are [https://github.com/containers/podman/blob/main/docs/tutorials/mac_win_client.md instructions for installing Podman on Windows/Mac machines]. | ** While Podman is a Linux container technology, there are [https://github.com/containers/podman/blob/main/docs/tutorials/mac_win_client.md instructions for installing Podman on Windows/Mac machines]. | ||
** Podman version 4 supports Apptainer .SIF files. | ** Podman version 4 supports Apptainer .SIF files. | ||
* [https://www.docker.com/ Docker] | * [https://www.docker.com/ Docker] | ||
** Using Docker on | ** Using Docker on a multiuser cluster creates security risks, therefore we do not make Docker available on our HPC clusters. | ||
** You can install and use Docker on your own computer and use it to create an Apptainer image, which can then be uploaded to an HPC cluster as outlined in <b>[[#Creating_an_Apptainer_Container_From_a_Dockerfile|this section]]</b> later on this page. | ** You can install and use Docker on your own computer and use it to create an Apptainer image, which can then be uploaded to an HPC cluster as outlined in <b>[[#Creating_an_Apptainer_Container_From_a_Dockerfile|this section]]</b> later on this page. | ||
Line 80: | Line 80: | ||
|} | |} | ||
Another important option is the <code>-W</code> or <code>--workdir</code> option. On Alliance clusters and on most Linux systems, <code>/tmp</code> and similar filesystems use RAM, not disk space. Since jobs typically run on our clusters with limited RAM amounts, this can result in jobs getting killed because they consume too much RAM relative to what was requested for the job. A suitable | Another important option is the <code>-W</code> or <code>--workdir</code> option. On Alliance clusters and on most Linux systems, <code>/tmp</code> and similar filesystems use RAM, not disk space. Since jobs typically run on our clusters with limited RAM amounts, this can result in jobs getting killed because they consume too much RAM relative to what was requested for the job. A suitable workaround for this is to tell Apptainer to use a real disk location for its working directory ("workdir"). This is done by passing the <code>-W</code> option followed by a path to a disk location where Apptainer can read/write temporary files, etc. For example, suppose one wanted to run a command called <code>myprogram</code> in a using an Apptainer container image called <code>myimage.sif</code> with its "workdir" set to <code>/path/to/a/workdir</code> in the filesystem: | ||
<source lang="console">$ mkdir -p $HOME/aworkdir | <source lang="console">$ mkdir -p $HOME/aworkdir | ||
Line 104: | Line 104: | ||
==Using MPI programs== | ==Using MPI programs== | ||
If you need to run MPI programs inside a container there are things that need to be done in the host environment in order for such to work. Please see the [[#Running_MPI_Programs_Inside_an_Apptainer Container|Running MPI Programs section below]] for an example of how to run MPI programs inside a container. The [http://apptainer.org/docs/user/main/mpi.html official Apptainer documentation] has more information concerning how MPI programs can be run inside a container. | If you need to run MPI programs inside a container, there are things that need to be done in the host environment in order for such to work. Please see the [[#Running_MPI_Programs_Inside_an_Apptainer Container|Running MPI Programs section below]] for an example of how to run MPI programs inside a container. The [http://apptainer.org/docs/user/main/mpi.html official Apptainer documentation] has more information concerning how MPI programs can be run inside a container. | ||
==Container-specific help: <code>apptainer run-help</code>== | ==Container-specific help: <code>apptainer run-help</code>== | ||
Line 136: | Line 136: | ||
* Using the <code>apptainer run</code> command is preferred over using the <code>apptainer exec</code> command (which directly runs a command within the specified container). | * Using the <code>apptainer run</code> command is preferred over using the <code>apptainer exec</code> command (which directly runs a command within the specified container). | ||
For example, suppose you want to run the <code>g++</code> compiler inside your container to compile a C++ program called <code>myprog.cpp</code> and then run that program. To this | For example, suppose you want to run the <code>g++</code> compiler inside your container to compile a C++ program called <code>myprog.cpp</code> and then run that program. To do this, you might use this command: | ||
apptainer run your-container-name.sif g++ -O2 -march=broadwell ./myprog.cpp | apptainer run your-container-name.sif g++ -O2 -march=broadwell ./myprog.cpp | ||
Line 145: | Line 145: | ||
* <code>g++ -O2 -march=broadwell ./myprog.cpp</code> is the command you want to run inside the container | * <code>g++ -O2 -march=broadwell ./myprog.cpp</code> is the command you want to run inside the container | ||
On our clusters, you will want to use a number of additional options (that appear after <code>run</code> but before <code>your-container-name.sif</code>). These options will include <code>-C</code>, <code>-c</code>, <code>-e</code>, <code>-W</code> as well as various bind mount options to make your disk space available to the programs that run in your container. For example: | On our clusters, you will want to use a number of additional options (that appear after <code>run</code>, but before <code>your-container-name.sif</code>). These options will include <code>-C</code>, <code>-c</code>, <code>-e</code>, <code>-W</code> as well as various bind mount options to make your disk space available to the programs that run in your container. For example: | ||
apptainer run -C -W $SLURM_TMPDIR -B /home -B /project -B /scratch your-container-name.sif g++ -O2 -march=broadwell ./myprog.cpp | apptainer run -C -W $SLURM_TMPDIR -B /home -B /project -B /scratch your-container-name.sif g++ -O2 -march=broadwell ./myprog.cpp | ||
Line 214: | Line 214: | ||
apptainer run -C -W $SLURM_TMPDIR a-container.sif wc -l ./my_data_file.txt | apptainer run -C -W $SLURM_TMPDIR a-container.sif wc -l ./my_data_file.txt | ||
where <code>./my_data_file.txt</code> | where <code>./my_data_file.txt</code> is a file in the current directory on the host, i.e., the file is not stored in the container at all. Because of the <code>-C</code> option, this file will not be accessible to the <code>wc</code> program inside the container --and so an access error will result. The fix is to bind mount the current directory, e.g., | ||
apptainer run -C -B . -W $SLURM_TMPDIR a-container.sif wc -l ./my_data_file.txt | apptainer run -C -B . -W $SLURM_TMPDIR a-container.sif wc -l ./my_data_file.txt | ||
Line 329: | Line 329: | ||
<b>NOTE: This section requires you to install and use Docker and Apptainer on a system where you have appropriate privileges. These instructions will <i>not</i> work on our compute clusters.</b> | <b>NOTE: This section requires you to install and use Docker and Apptainer on a system where you have appropriate privileges. These instructions will <i>not</i> work on our compute clusters.</b> | ||
Unfortunately some instructions for packages only provide a <code>Dockerfile</code> without a container image. A <code>Dockerfile</code> contains the instructions necessary for the Docker software to build that container. Our clusters do not have the Docker software installed. That said, if you've access to a system with both Docker and Apptainer installed, and, sufficient access to Docker (e.g., <code>sudo</code> or root access, or, you are in that system's <code>docker</code> group) and if needed Apptainer (e.g., <code>sudo</code> or root access, or, you have <code>--fakeroot</code> access), then you can follow the instructions below to use Docker and then Apptainer to build an Apptainer image on that system. | Unfortunately, some instructions for packages only provide a <code>Dockerfile</code> without a container image. A <code>Dockerfile</code> contains the instructions necessary for the Docker software to build that container. Our clusters do not have the Docker software installed. That said, if you've access to a system with both Docker and Apptainer installed, and, sufficient access to Docker (e.g., <code>sudo</code> or root access, or, you are in that system's <code>docker</code> group) and if needed Apptainer (e.g., <code>sudo</code> or root access, or, you have <code>--fakeroot</code> access), then you can follow the instructions below to use Docker and then Apptainer to build an Apptainer image on that system. | ||
<b>NOTE:</b> Using Docker may fail if you are not in the <code>docker</code> group. Similarly, building some containers may fail with Apptainer without appropriate <code>sudo</code>, root, or <code>--fakeroot</code> permissions. It is your responsibility to ensure you've such access on the system you are running the commands below. | <b>NOTE:</b> Using Docker may fail if you are not in the <code>docker</code> group. Similarly, building some containers may fail with Apptainer without appropriate <code>sudo</code>, root, or <code>--fakeroot</code> permissions. It is your responsibility to ensure you've such access on the system you are running the commands below. | ||
Line 348: | Line 348: | ||
* <code>your-sif-name.sif</code> is the name of the Apptainer SIF file for the Apptainer container | * <code>your-sif-name.sif</code> is the name of the Apptainer SIF file for the Apptainer container | ||
After this is done, the SIF file is an Apptainer container for the <code>Dockerfile</code>. Transfer the SIF to the | After this is done, the SIF file is an Apptainer container for the <code>Dockerfile</code>. Transfer the SIF to the appropriate cluster(s) in order to use such. | ||
<b>NOTE:</b> It is possible that the Dockerfile pulled in more layers which means you will have to manually delete those additional layers by running: | <b>NOTE:</b> It is possible that the Dockerfile pulled in more layers which means you will have to manually delete those additional layers by running: | ||
Line 354: | Line 354: | ||
docker images | docker images | ||
followed by | followed by running <code>docker image rm ID</code> (where ID is the image ID output from the <code>docker images</code> command) in order to free up the disk space associated with those other image layers on the system you are using. | ||
=Miscellaneous items= | =Miscellaneous items= |