Skip to content

Code_Saturne in a Docker container

CFLAG edited this page Mar 29, 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 \
 && apt-get upgrade -y \
 && DEBIAN_FRONTEND=noninteractive apt-get install -y tzdata \
 && apt-get install -y \
        wget zlib1g-dev \
        vim \
        gfortran g++ gcc make cmake \
        python3 python3-pyqt5 \
        pyqt5-dev pyqt5-dev-tools \
        openmpi-bin libopenmpi2 libopenmpi-dev \
 && apt-get autoremove \
 && apt-get clean

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

ARG hdfdir=/opt/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 \
 && mkdir ${hdfdir}
WORKDIR /tmp/hdf5-1.10.6
RUN ./configure CC=mpicc FC=mpif90 CXX=mpic++ \
        --prefix=${hdfdir} --enable-build-mode=production --enable-parallel \
 && make -j \
 && make install \
 && rm -rf /tmp/hdf5-1.10.6 \
 && chmod -R 777 ${hdfdir}

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

ARG meddir=/opt/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 \
 && mkdir ${meddir}
WORKDIR /tmp/med-4.0.0
RUN ./configure CC=mpicc CXX=mpic++ --prefix=${meddir} \
        --with-med_int=long --disable-python --disable-fortran --with-hdf5=${hdfdir} \
 && make -j \
 && make install \
 && rm -rf /tmp/med-4.0.0 \
 && chmod -R 777 ${meddir}

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

ARG cgnsdir=/opt/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 \
 && mkdir /opt/cgns-4.1.1 /tmp/tmp
WORKDIR /tmp/tmp
RUN cmake -DCMAKE_INSTALL_PREFIX=${cgnsdir} -DCGNS_ENABLE_64BIT=ON -DCGNS_ENABLE_SCOPING=ON \
        -DCGNS_ENABLE_HDF5=ON -DHDF5_NEED_MPI=ON -DHDF5_NEED_ZLIB=ON \
        -DCMAKE_PREFIX_PATH=${hdfdir} -DHDF5_INCLUDE_PATH=${hdfdir}/include \
        -DZLIB_LIBRARY=/usr/lib/x86_64-linux-gnu/libz.so ../CGNS-4.1.1 \
 && make \
 && make install \
 && rm -rf /tmp/CGNS-4.1.1 /tmp/tmp \
 && chmod -R 777 ${cgnsdir}

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

ARG version=6.0.2
RUN wget http://www.code-saturne.org/cms/sites/default/files/releases/code_saturne-${version}.tar.gz --directory-prefix=/opt/ \
 && tar -zxvf /opt/code_saturne-${version}.tar.gz -C /opt/ \
 && rm -r /opt/code_saturne-${version}.tar.gz \
 && mv /opt/code_saturne-${version} /opt/code_saturne-${version}_src \
 && mkdir /opt/saturne_tmp /opt/code_saturne-${version}_build /opt/code_saturne-${version}_debug \
 && chmod -R 777 /opt/code_saturne-${version}_src

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

WORKDIR /opt/saturne_tmp
RUN ../code_saturne-${version}_src/configure PYTHON=/usr/bin/python3 CC=mpicc FC=mpif90 CXX=mpic++ \
        --prefix=/opt/code_saturne-${version}_build --with-hdf5=${hdfdir} \
        --with-med=${meddir} --with-cgns=${cgnsdir} \
 && make -j \
 && make install \
 && rm -r /opt/saturne_tmp/* \
 && chmod -R 777 /opt/code_saturne-${version}_build

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

WORKDIR /opt/saturne_tmp
RUN ../code_saturne-${version}_src/configure PYTHON=/usr/bin/python3 CC=mpicc FC=mpif90 CXX=mpic++ CFLAGS='-g' FCFLAGS='-g' \
        --enable-debug --prefix=/opt/code_saturne-${version}_debug --with-hdf5=${hdfdir} \
        --with-med=${meddir} --with-cgns=${cgnsdir} \
 && make -j \
 && make install \
 && rm -r /opt/saturne_tmp/* \
 && chmod -R 777 /opt/code_saturne-${version}_debug

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

RUN echo 'root:rootpwd' | chpasswd \
 && apt-get install -y sudo gnome-terminal gedit paraview \
 && apt-get autoremove \
 && apt-get clean \
 && useradd csuser \
 && mkdir /home/csuser \
 && chown csuser /home/csuser \
 && chgrp csuser /home/csuser \
 && echo 'csuser:userpwd' | chpasswd \
 && adduser csuser sudo
USER csuser
ENV HOME /home/csuser
WORKDIR /home/csuser
RUN echo "alias code_saturne=/opt/code_saturne-${version}_build/bin/code_saturne" >> /home/csuser/.bashrc \
 && echo "alias code_saturne_debug=/opt/code_saturne-${version}_debug/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/

Create a container based on the development version of Code_Saturne

The Dockerfile file below can be used to create a container based on the development version of Code_Saturne.

FROM ubuntu:18.04 as builder

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

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

ARG hdfdir=/opt/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 \
 && mkdir ${hdfdir}
WORKDIR /tmp/hdf5-1.10.6
RUN ./configure CC=mpicc FC=mpif90 CXX=mpic++ \
        --prefix=${hdfdir} --enable-build-mode=production --enable-parallel \
 && make -j \
 && make install \
 && rm -rf /tmp/hdf5-1.10.6 \
 && chmod -R 777 ${hdfdir}

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

ARG meddir=/opt/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 \
 && mkdir ${meddir}
WORKDIR /tmp/med-4.0.0
RUN ./configure CC=mpicc CXX=mpic++ --prefix=${meddir} \
        --with-med_int=long --disable-python --disable-fortran --with-hdf5=${hdfdir} \
 && make -j \
 && make install \
 && rm -rf /tmp/med-4.0.0 \
 && chmod -R 777 ${meddir}

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

ARG cgnsdir=/opt/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 \
 && mkdir /opt/cgns-4.1.1 /tmp/tmp
WORKDIR /tmp/tmp
RUN cmake -DCMAKE_INSTALL_PREFIX=${cgnsdir} -DCGNS_ENABLE_64BIT=ON -DCGNS_ENABLE_SCOPING=ON \
        -DCGNS_ENABLE_HDF5=ON -DHDF5_NEED_MPI=ON -DHDF5_NEED_ZLIB=ON \
        -DCMAKE_PREFIX_PATH=${hdfdir} -DHDF5_INCLUDE_PATH=${hdfdir}/include \
        -DZLIB_LIBRARY=/usr/lib/x86_64-linux-gnu/libz.so ../CGNS-4.1.1 \
 && make \
 && make install \
 && rm -rf /tmp/CGNS-4.1.1 /tmp/tmp \
 && chmod -R 777 ${cgnsdir}

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

ARG version=master
WORKDIR /opt
RUN apt-get install -y build-essential autoconf automake libtool bison flex gettext python git \
 && apt-get autoremove \
 && apt-get clean \
 && git clone -b ${version} --single-branch --depth 100 https://github.com/code-saturne/code_saturne.git code_saturne-${version}_src \
 && cd code_saturne-${version}_src \
 && ./sbin/bootstrap \
 && mkdir /opt/saturne_tmp /opt/code_saturne-${version}_build /opt/code_saturne-${version}_debug \
 && chmod -R 777 /opt/code_saturne-${version}_src

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

WORKDIR /opt/saturne_tmp
RUN ../code_saturne-${version}_src/configure PYTHON=/usr/bin/python3 CC=mpicc FC=mpif90 CXX=mpic++ \
        --prefix=/opt/code_saturne-${version}_build --with-hdf5=${hdfdir} \
        --with-med=${meddir} --with-cgns=${cgnsdir} \
 && make -j \
 && make install \
 && rm -r /opt/saturne_tmp/* \
 && chmod -R 777 /opt/code_saturne-${version}_build

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

WORKDIR /opt/saturne_tmp
RUN ../code_saturne-${version}_src/configure PYTHON=/usr/bin/python3 CC=mpicc FC=mpif90 CXX=mpic++ CFLAGS='-g' FCFLAGS='-g' \
        --enable-debug --prefix=/opt/code_saturne-${version}_debug --with-hdf5=${hdfdir} \
        --with-med=${meddir} --with-cgns=${cgnsdir} \
 && make -j \
 && make install \
 && rm -r /opt/saturne_tmp/* \
 && chmod -R 777 /opt/code_saturne-${version}_debug

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

RUN echo 'root:rootpwd' | chpasswd \
 && apt-get install -y sudo gnome-terminal gedit paraview gitk \
 && apt-get autoremove \
 && apt-get clean \
 && useradd csuser \
 && mkdir /home/csuser \
 && chown csuser /home/csuser \
 && chgrp csuser /home/csuser \
 && echo 'csuser:userpwd' | chpasswd \
 && adduser csuser sudo
USER csuser
ENV HOME /home/csuser
WORKDIR /home/csuser
RUN echo "alias code_saturne=/opt/code_saturne-${version}_build/bin/code_saturne" >> /home/csuser/.bashrc \
 && echo "alias code_saturne_debug=/opt/code_saturne-${version}_debug/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
#
#---------------------------------------------------------
Clone this wiki locally