Skip to content

Code_Saturne in a Docker container

CFLAG edited this page Mar 27, 2020 · 15 revisions

Prerequisites

  • Docker should be installed on the machine, both to create the Code_Saturne image and to run the container.
  • A fast internet connection is preferable.

Creation of the docker image

Create a file named Dockerfile with the following content:

FROM ubuntu:18.04 as builder

RUN apt-get update -y
RUN apt-get upgrade -y
RUN DEBIAN_FRONTEND=noninteractive apt-get install -y tzdata
RUN apt-get install -y                             		\
        wget zlib1g-dev                                         \
        vim gedit git gitk                                      \
        gfortran g++ gcc make cmake                             \
        python3 python3-pyqt5                                   \
        pyqt5-dev pyqt5-dev-tools                               \
        openmpi-bin libopenmpi2 libopenmpi-dev
RUN apt-get autoremove
RUN apt-get clean

#---------------------------------------------------------
# hdf5 1.10.6
#---------------------------------------------------------

RUN wget https://support.hdfgroup.org/ftp/HDF5/releases/hdf5-1.10/hdf5-1.10.6/src/hdf5-1.10.6.tar.gz --directory-prefix=/tmp/ \
        && tar -zxvf /tmp/hdf5-1.10.6.tar.gz -C /tmp/ \
        && rm -r /tmp/hdf5-1.10.6.tar.gz
RUN mkdir /opt/hdf5-1.10.6
WORKDIR /tmp/hdf5-1.10.6
RUN ./configure CC=mpicc FC=mpif90 CXX=mpic++ --prefix=/opt/hdf5-1.10.6 --enable-build-mode=production --enable-parallel && make -j && make install
RUN rm -rf /tmp/hdf5-1.10.6

#---------------------------------------------------------
# MED 4.0.0
#---------------------------------------------------------

RUN wget http://files.salome-platform.org/Salome/other/med-4.0.0.tar.gz --directory-prefix=/tmp/ \
	&& tar -zxvf /tmp/med-4.0.0.tar.gz -C /tmp/ \
	&& rm -r /tmp/med-4.0.0.tar.gz
RUN mkdir /opt/med-4.0.0
WORKDIR /tmp/med-4.0.0
RUN ./configure CC=mpicc CXX=mpic++ --prefix=/opt/med-4.0.0 --with-med_int=long --disable-python --disable-fortran --with-hdf5=/opt/hdf5-1.10.6 && make -j && make install
RUN rm -rf /tmp/med-4.0.0

#---------------------------------------------------------
# CGNS 4.1.1
#---------------------------------------------------------

RUN wget https://github.com/CGNS/CGNS/archive/v4.1.1.tar.gz --directory-prefix=/tmp/ \
        && tar -zxvf /tmp/v4.1.1.tar.gz -C /tmp/ \
        && rm  -r /tmp/v4.1.1.tar.gz
RUN mkdir /opt/cgns-4.1.1 /tmp/tmp
WORKDIR /tmp/tmp
RUN cmake -DCMAKE_INSTALL_PREFIX=/opt/cgns-4.1.1 -DCGNS_ENABLE_64BIT=ON -DCGNS_ENABLE_SCOPING=ON -DCGNS_ENABLE_HDF5=ON -DHDF5_NEED_MPI=ON -DHDF5_NEED_ZLIB=ON -DCMAKE_PREFIX_PATH=/opt/hdf5-1.10.6 -DHDF5_INCLUDE_PATH=/opt/hdf5-1.10.6/include -DZLIB_LIBRARY=/usr/lib/x86_64-linux-gnu/libz.so ../CGNS-4.1.1 && make && make install
RUN rm -rf /tmp/CGNS-4.1.1 /tmp/tmp

#---------------------------------------------------------
# Code Saturne, get sources
#---------------------------------------------------------

RUN wget http://www.code-saturne.org/cms/sites/default/files/releases/code_saturne-6.0.2.tar.gz --directory-prefix=/opt/ \
	&& tar -zxvf /opt/code_saturne-6.0.2.tar.gz -C /opt/ \
        && rm -r /opt/code_saturne-6.0.2.tar.gz
RUN mv /opt/code_saturne-6.0.2 /opt/code_saturne-6.0.2_src

#---------------------------------------------------------
# Code Saturne, build
#---------------------------------------------------------

RUN mkdir /opt/code_saturne-6.0.2_bld /opt/saturne_tmp
WORKDIR /opt/saturne_tmp
RUN ../code_saturne-6.0.2_src/configure PYTHON=/usr/bin/python3 CC=mpicc FC=mpif90 CXX=mpic++ --prefix=/opt/code_saturne-6.0.2_bld --with-hdf5=/opt/hdf5-1.10.6 --with-med=/opt/med-4.0.0 --with-cgns=/opt/cgns-4.1.1 && make -j && make install

#---------------------------------------------------------
# Code Saturne, debug build
#---------------------------------------------------------
RUN mkdir /opt/code_saturne-6.0.2_bld_debug
WORKDIR /opt/saturne_tmp
RUN rm -rf *
RUN ../code_saturne-6.0.2_src/configure PYTHON=/usr/bin/python3 CC=mpicc FC=mpif90 CXX=mpic++ CFLAGS='-g' FCFLAGS='-g' --enable-debug --prefix=/opt/code_saturne-6.0.2_bld_debug --with-hdf5=/opt/hdf5-1.10.6 --with-med=/opt/med-4.0.0 --with-cgns=/opt/cgns-4.1.1 && make -j && make install

#---------------------------------------------------------
#
# This is probably unsafe
#
# Use at your own risks
#
#---------------------------------------------------------

RUN chmod -R 777 /opt/hdf5-1.10.6/ /opt/med-4.0.0/ /opt/cgns-4.1.1 /opt/code_saturne-6.0.2_src /opt/code_saturne-6.0.2_bld /opt/code_saturne-6.0.2_bld_debug
RUN echo 'root:rootpwd' | chpasswd
RUN apt-get install -y sudo gnome-terminal
RUN useradd csuser
RUN mkdir /home/csuser
RUN chown csuser /home/csuser
RUN chgrp csuser /home/csuser
RUN echo 'csuser:userpwd' | chpasswd
RUN adduser csuser sudo
USER csuser
ENV HOME /home/csuser
WORKDIR /home/csuser
RUN echo "alias code_saturne=/opt/code_saturne-6.0.2_bld/bin/code_saturne" >> /home/csuser/.bashrc

#---------------------------------------------------------
#
# This is probably unsafe.
#
# Use at your own risks.
#
# Build the image with:
#   docker build -t cs_v6 .
#
# Clean all the docker images with:
#   docker system prune --volumes
#
# [Linux] - Run the container with:
#   docker run -it --rm -e DISPLAY=:0 -v ${HOME}/.Xautority:/root/.Xauthority:rw --net=host --name gnome-terminal cs_v6
#
# [Linux] - To share the local folder /aaa/bbb/ccc with the container, run the container with:
#   WARNING: the container will be able to modify the corresponding folder
#   docker run -it --rm -e DISPLAY=:0 -v ${HOME}/.Xautority:/root/.Xauthority:rw -v /aaa/bbb/ccc:/home/csuser/ccc --net=host --name gnome-terminal cs_v6
#
# [Linux] - When the container is running, activate the GUI:
#   xhost +local:root
#
# [Linux] - When the container is stopped, undo:
#   xhost -local:root
#
#---------------------------------------------------------

Open a terminal in the folder containing the Dockerfile. The following command will create a Docker image based on the aforementioned Dockerfile. The name of the Docker image will be cs_v6

docker build -t cs_v6 .

At this stage, a relatively large number of temporary Docker images are stored on the computer. They can be removed with the following command:

docker system prune --volumes

[Linux] Start a container based on the image

The following basic command can be used to start a container based on the image cs_v6, and open a terminal inside it:

docker run -it --rm --name gnome-terminal cs_v6

To activate the GUI, the following can be used:

docker run -it --rm -e DISPLAY=:0 -v ${HOME}/.Xautority:/root/.Xauthority:rw --net=host --name gnome-terminal cs_v6

Please note that the GUI will not work at first. The command xhost +local:root must be entered in the host to activate it. When the container is no longer used, the command xhost -local:root must be entered in the host.

It is possible to give additional options when running the Docker container. For instance, the option -v allows file sharing between the host and the container.

[Windows] Start a container based on the image

This link could help: https://cuneyt.aliustaoglu.biz/en/running-gui-applications-in-docker-on-windows-linux-mac-hosts/

[Mac] Start a container based on the image

This link could help: https://cuneyt.aliustaoglu.biz/en/running-gui-applications-in-docker-on-windows-linux-mac-hosts/