Featured image of post Ubuntu-22.04在Docker中编译OpenFOAM-2.3.1

Ubuntu-22.04在Docker中编译OpenFOAM-2.3.1

Docker+OpenFOAM-2.3.1

宿主机:Ubuntu-22.04 Docker容器:Ubuntu-18.04 OpenFOAM版本:v2.3.1

问题描述

Ubuntu-22.04中的gcc-11版本过高,无法编译低版本OpenFOAM(v2.3.1需要gcc-4.8~5.5)。

解决方案

  • 创建基于Ubuntu-18.04的Docker容器
  • 搭建OpenFOAM编译环境
  • 建立宿主机OpenFOAM代码与算例的目录到docker目录的映射
  • 宿主机下修改代码
  • Docker容器中编译代码,执行算例
  • 宿主机下Tecplot/Paraview查看结果

依赖

  1. 查看官方教程安装docker。
  2. 设置免ROOT使用docker命令

具体步骤

拉取OpenFOAM231-docker脚本

例如放到$HOME/github文件夹

1
2
cd $HOME/github
git clone https://github.com/TimoLin/openfoam231-docker.git

或者

1
git clone git@github.com:TimoLin/openfoam231-docker.git

创建of231镜像

运行脚本prepareOpenFOAM231.sh:

1
./prepareOpenFOAM231.sh

输出如下:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
*******************************************************
Following Docker containers are present on your system:
*******************************************************
CONTAINER ID   IMAGE          COMMAND                   CREATED       STATUS                   PORTS     NAMES
64ee332b50a6   caecf4ca1e48   "/bin/sh -c 'sh -c \"…"   2 hours ago   Exited (1) 2 hours ago             crazy_benz
WM_CC
*******************************************************

Creating Docker OpenFOAM container openfoam231
8ea1e4429ac9ea43df1c58ed206427383771c9724e757b369686d9440e2dc465
Container openfoam231 was created.
*******************************************************
Run the ./startOpenFOAM script to launch container
*******************************************************

使用镜像

首先在宿主机$HOME/OpenFOAM文件夹下创建OpenFOAM环境变量文件of-env.bashrc,内容如下:

1
2
3
4
5
source $HOME/OpenFOAM/OpenFOAM-2.3.1/etc/bashrc WM_NCOMPPROCS=4 WM_MPLIB=SYSTEMOPENMPI
export WM_CC='gcc-5'
export WM_CXX='g++-5'
export WM_NCOMPPROCS=4
export WM_MPLIB=SYSTEMOPENMPI

运行脚本startOpenFOAM231.sh

1
./startOpenFOAM231.sh

输出:

1
2
Entering container openfoam231:8ea1e4429ac9...
8ea1e4429ac9% 

在docker中激活openfoam环境:

1
of231

最后可以编译或运行算例了。

Appendix

Docker镜像相关

创建docker镜像:

1
docker build - < Dockerfile

打tag:

1
docker tag REPLACE_WITH_DOCKER_IMAGE_ID ztnuaa/openfoam231:latest

登录dockerhub:

1
docker login

推送到dockerhub:

1
docker push ztnuaa/openfoam231:latest

向已有的镜像中添加挂载目录

参考这个方法stackoverflow

  1. 首先关闭Docker服务
    1
    
    systemctl stop docker.service
    
  2. 找到容器ID与文件路径
    1
    2
    3
    4
    5
    
    # 在该命令的输出中,查找你想要修改的容器的ID
    docker container ls -a
    
    # 替换“<>”为你的ID,找到容器文件的路径
    cd /var/lib/docker/containers/<YOUR_CONTAINER_ID>
    
    查看目录下的文件ls -lht,比如输出为:
    1
    2
    3
    4
    5
    6
    7
    8
    9
    
    -rw-r----- 1 root root 7.0M Dec 11 16:35 8ea1e4429ac9ea43df1c58ed206427383771c9724e757b369686d9440e2dc465-json.log
    -rw------- 1 root root 4.6K Dec 11 16:11 config.v2.json
    -rw------- 1 root root 1.6K Dec 11 16:11 hostconfig.json
    -rw-r--r-- 1 root root   13 Dec 11 16:11 hostname
    -rw-r--r-- 1 root root  174 Dec 11 16:11 hosts
    -rw-r--r-- 1 root root  806 Dec 11 16:11 resolv.conf
    -rw-r--r-- 1 root root   71 Dec 11 16:11 resolv.conf.hash
    drwx--x--- 2 root root 4.0K Sep 26 17:02 mounts
    drwx------ 2 root root 4.0K Sep 26 17:02 checkpoints
    
  3. 修改config.v2.json配置文件,找到“MountPoints”关键字,在其中添加你想要挂载的目录,例如: 原始内容:
     1
     2
     3
     4
     5
     6
     7
     8
     9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    
    "MountPoints": {
         "/etc/group": {
             "Source": "/etc/group",
             "Destination": "/etc/group",
             "RW": false,
             "Name": "",
             "Driver": "",
             "Type": "bind",
             "Relabel": "ro",
             "Propagation": "rprivate",
             "Spec": {
                 "Type": "bind",
                 "Source": "/etc/group",
                 "Target": "/etc/group",
                 "ReadOnly": true
             },
             "SkipMountpointCreation": false
        }
    }
    
    挂载宿主机目录/home/<USER>/Data/simulation到容器目录/home/<USER>/calc下:
     1
     2
     3
     4
     5
     6
     7
     8
     9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    
    "MountPoints": {
        "/etc/group": {
             "Source": "/etc/group",
             "Destination": "/etc/group",
             "RW": false,
             "Name": "",
             "Driver": "",
             "Type": "bind",
             "Relabel": "ro",
             "Propagation": "rprivate",
             "Spec": {
                 "Type": "bind",
                 "Source": "/etc/group",
                 "Target": "/etc/group",
                 "ReadOnly": true
             },
             "SkipMountpointCreation": false
         },
         "/home/<USER>/calc": {
             "Source": "/home/<USER>/Data/simulation",
             "Destination": "/home/<USER>/calc",
             "RW": false,
             "Name": "",
             "Driver": "",
             "Type": "bind",
             "Relabel": "ro",
             "Propagation": "rprivate",
             "Spec": {
                 "Type": "bind",
                 "Source": "/home/<USER>/Data/simulation",
                 "Target": "/home/<USER>/calc",
                 "ReadOnly": true
             },
         "SkipMountpointCreation": false
        }
    }
    
  4. 重启docker服务:
    1
    
    systemctl start docker.service
    
  5. 进入容器:
    1
    
    docker start <YOUR_CONTAINER_ID>
    
使用 Hugo 构建
主题 StackJimmy 设计