Dockerfiles
Two configurations are possible depending on how OpenIFS might be used in a container:
Panel | ||||||
---|---|---|---|---|---|---|
| ||||||
|
|
|
|
|
Motivation
Setting up the computing environment (the libraries, directory structure, etc) required by OpenIFS can present a challenge when it is necessary to run the model on a different hardware infrastructure, for instance during workshops and training events. It is time consuming to install and compile the model and all of its required software packages. Also, the libraries that are available on the local system may not be compatible with the model requirements.
Many of these issues can be avoided by running a containerised version of the model which is a self-sufficient code package that can be used in a consistent way on different hardware platforms. The computational overhead (the "costs") of the container environment itself is often outweighed by performance increases due to the local availability and the instant access to all required libraries and data within the container.
We have used the Docker platform to produce a container image for OpenIFS. This requires the design of a "Dockerfile" which describes the build process for the model code and all its dependent libraries, and which results in a binary Docker image. This image can be uploaded onto other computers that make use of the Docker platform or which use other compatible software. A “container” is the running instance of the Docker image.
Pre-compiled OpenIFS Docker images can be made available for download from container image repositories (e.g. Docker Hub or Harbor) and should be able to run on any computer that uses the Docker platform without the need to install and compile the model or any additional software. The OpenIFS Docker images should also work with other container software compatible with the Open Container Initiative (OCI) standards such as Singularity or Sarus.
The Dockerfile describes the build process of the container image. Examples are provided in OpenIFS from version 43r3v1 onwards. The naming convention for Dockerfiles is:
Panel | ||||
---|---|---|---|---|
| ||||
Dockerfile.oifs<RELEASE>.<NOTE>.<ARCH>.<TYPE> RELEASE: The OpenIFS release , e.g. 43r3v1. NOTE: Describes features of this build, in our examples this is either 'user' or 'root'. ARCH: The architecture for which this image is built, e.g. x86_64. TYPE: Type of build. Here 'bld' is used but could be changed to 'dev' or 'test' for example. |
Example: Dockerfile.oifs43r3v1.user.x86_64.bld
will generate an image of the OpenIFS 43r3v1 release.
Example Build Process
This section describes the generation process of a container image from the Dockerfile.
1. Start by navigating to the docker directory in the OpenIFS distribution:
Code Block |
---|
% cd tools/docker |
2. Make a copy of one of the Dockerfile templates that can be found in this directory. There are two versions:
Code Block |
---|
% ls Dockerfile*
Dockerfile.oifs43r3v1.root.x86_64.bld Dockerfile.oifs43r3v1.user.x86_64.bld
% cp Dockerfile.oifs43r3v1.user.x86_64.bld Dockerfile |
The note 'root
' indicates that OpenIFS is installed into a system directory /usr/local
whereas the 'user
' version installs into the user's account. Both Dockerfiles create a user called 'oifs'.
Which you choose depends on your application. The 'root' version might be more suited to a training workshop for example. We'll use the 'user
' version in this example.
3. Put a copy of the OpenIFS distribution tarfile as downloaded into the same directory as the Dockerfile.
Info |
---|
Make sure the version number of the tarfile matches that specified in the Dockerfile, the build process will unpack this file inside the container. |
You should have these files in your build directory (your version numbers may be different):
Code Block |
---|
-rw-r--r-- 1 glenn staff 4255 6 May 17:35 Dockerfile
-rw-r--r-- 1 glenn staff 30611901 6 May 18:13 oifs43r3v1.tar.gz |
4. Build the OpenIFS Docker image.
The following command builds the image oifs43r3v1.user. Change 'user' to 'root' if building the other variant.
Code Block |
---|
% docker build -t oifs43r3v1.user . # note the trailing '.' to build in the current dir |
Panel | ||||||||
---|---|---|---|---|---|---|---|---|
| ||||||||
For the docker image on the workstations at ECMWF four variables need to be set for network proxies in order to access the internet from within the container.
|
This runs the build process of the image which contains the minimum of software that is required to run OpenIFS.
The image is based on a Ubuntu Linux LTS version. After downloading the base Ubuntu image, the Dockerfile executes the following steps: the necessary developer tools are installed (e.g. GNU compiler, MPI and maths libraries).; the ecCodes library is downloaded and compiled; the OpenIFS sources are unpacked from the tar archive, and the model binaries are compiled. The last step sets file permissions and the model executable is moved to an install location.
At the end of the build process the successful image creation is shown as: Successfully tagged oifs43r3v1.user:latest
Running the docker image
We can verify that the image is available and load it into a container using the docker run
command:
Code Block |
---|
% docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
oifs43r3v1.user latest 982f6e82bb93 39 minutes ago 873MB
ubuntu latest 72300a873c2c 13 days ago 64.2MB
% docker run -it oifs43r3v1.user
oifs@40a923f11202:~$ |
Our command line prompt has changed as we are now the user 'oifs
' inside the container.
A directory listing shows the following structure (your version numbers may be different):
Code Block |
---|
oifs@40a923f11202:~$ ls
oifs43r3v1
oifs@40a923f11202:~$ ls oifs43r3v1
CHANGES COPYING NOTICE READMEs examples make oifs-config.sh t21test tools
CITE LICENSE README bin fcm oifs-config.editme.sh src t21test_xios
oifs@40a923f11202:~$ |
The compiled model executables can be found in and can be moved to another install location:
Code Block |
---|
oifs@40a923f11202:~$ ls oifs43r3v1/make/gnu-opt/oifs/bin
getres.exe grib_set_vtable.exe master.exe spinterp.exe timeint.exe vod2uv.exe
gptosp.exe intsst.exe rgrid.exe sptogp.exe uvtovod.exe |
The ecCodes library is found in its default destination under /usr/local/lib
.
Info |
---|
If using the 'root' Dockerfile, the install location will be in /usr/local and not the home directory of the 'oifs' user. In order to run the acceptance test as the root user the file
In order to run the executable with the command |
With the command 'exit
' the container is removed and all created or changed files in the container are lost. The next section will show how results can be retained and OpenIFS experiments can be run using a container.
Running OpenIFS experiments in a container
Due to the temporary nature of containers all model results that are created in an experiment need to be stored outside the container. One possible method is to mount an external experiment directory inside the container. Data written to the mounted directory will be retained once the container is removed.
Assume an experiment directory at /scratch/user/exp/.
Info |
---|
Sub-directories are allowed however symbolic links to other file system locations will not work; the symbolic links created by |
This experiment directory is mounted to the container when it is invoked:
Code Block |
---|
docker run -v /scratch/user/exp:/home/oifs/exp:rw -it oifs43r3v1.user |
A mount of the experiment directory can be found inside the container in sub-directory /exp
with read and write permissions.
In order to mount the external experiment directory successfully, all the files or sub-directories need to have full read-write-executable access: chmod -R 777 /scratch/user/exp
All the files in the mounted directory that were newly created or modified are owned by the container user, seen from outside the container their file ownership will be different.
Invoking the container from the OpenIFS run script
An alternative method of using OpenIFS in a container consists of including the docker call inside the oifs_run
script, replacing the execution of the model binary with mpirun.
This method is only suitable for running the model interactively (i.e. no batch job submission). The modification in the script is as follows:
Panel | ||||
---|---|---|---|---|
| ||||
|
When using this method the Docker container environment remains "concealed" from the model user and requires no further interaction with it.
Batch Job Submission
The use of Docker containers when running OpenIFS on HPC facilities has been tested successfully and with good scalability on the Piz Daint Cray XC50 at the Swiss National Supercomputing Centre in December 2019 using local computing support. At present we do not yet offer this capability at ECMWF.
Crib Sheet: Important Docker commands
This section contains a list of frequently used Docker commands.
Panel | ||||||
---|---|---|---|---|---|---|
| ||||||
|
Start the Docker deamon on your machine (ECMWFif not already running):
Panel | ||||
---|---|---|---|---|
| ||||
|
which is actually: sudo /usr/bin/systemctl status docker
ECMWF users may need to contact servicedesk to request permission to run Docker.
Which images are on my machine:
Panel | ||||
---|---|---|---|---|
| ||||
|
Which containers are running:
Panel | ||||
---|---|---|---|---|
| ||||
|
Build docker image:
Panel | ||||
---|---|---|---|---|
| ||||
|
Info |
---|
At ECMWF, use the proxy arguments: |
|
Run docker images in container:
Panel | ||||
---|---|---|---|---|
| ||||
|
Excerpt Include | ||||||
---|---|---|---|---|---|---|
|
Do this first: docker login eccr.ecmwf.int
The build command below makes an image that can be pushed to harbor: docker build -t eccr.ecmwf.int/openifs/oifs:0.0.1 -f --build-arg http_proxy="$http_proxy" --build-arg ftp_proxy="$ftp_proxy" --build-arg https_proxy="$https_proxy" --build-arg no_proxy="$no_proxy"
Then push it to harbor, manually specifying version number. Careful: Existing version numbers are overwritten! docker push eccr.ecmwf.int/openifs/oifs:0.0.1
Pull image from repository into memory: docker pull eccr.ecmwf.int/openifs/oifs:0.0.1
Dockerfiles
The Dockerfile describe the build process for the Docker image. Examples for several of these files are provided in the OpenIFS git repository.
The naming convention for Dockerfiles is as such:
Panel | ||||
---|---|---|---|---|
| ||||
Dockerfile.oifs<MODELRELEASE>.<GITHASH>.<NOTE>.<ARCH>.<TYPE> MODELRELEASE: A string generated from the IFS cycle, release number and OpenIFS version , e.g. 40r1v2 for CY40R1 OpenIFS release v2. GITHASH: The first five characters of the OpenIFS repository git commit from which this image is built. NOTE: An optional comment string that describes features of this build. ARCH: The architecture for which this image is built, e.g. x86_64, amd64, i386 etc. TYPE: dev, test or bld. bld (build) to be used only for production images, such as from existing OpenIFS releases. dev should be used for images created from development branch commits. |
Dockerfile.oifs40r1v2.41537.user.x86_64.bld