【大气反演模型CIF第二期】通过 Docker 容器快速部署和运行 CIF 系统
目录
- Docker 概述
- Docker 安装
- CIF Docker 镜像
- 如何获取 CIF Docker 镜像?
- 如何使用 Docker 容器运行 CIF?
- 容器中文件结构说明
- 使用外部数据(如观测、排放、气象等)
- CIF 支持的测试模型
- 自动测试(CI)运行方法
- 调试技巧:进入容器
- 高级调试:使用 Python 调试器(pudb)
- 参考
本博客结合 Community Inversion Framework (CIF) 网站中 “Using the CIF in Docker” 页面 详细介绍如何通过 Docker 容器快速部署和运行 CIF 系统。
Docker 概述
官网-Docker
Docker 是一种容器化技术,用于在预定义的环境中运行应用程序。
它的优势包括:
- ✅ 可移植性:相同的配置在不同机器上表现一致
- ✅ 可重复性:避免“在我电脑上能跑”的问题
- ✅ 易用性:新用户几乎无需配置环境即可运行示例
在 CIF 项目中,Docker 被用于:
- 自动化测试
- 发布演示环境
- 新用户快速上手(如使用高斯羽流模型)
Docker 安装
Docker 安装 教程
需要在本地或服务器上安装 Docker。建议使用 Docker 官方安装文档。
如果你没有管理员权限,可以考虑安装 Docker 的 rootless 模式,以支持非 root 用户运行 Docker 容器。
CIF Docker 镜像
CIF 的 Docker 镜像基于 Ubuntu 20.04,并预装以下内容:
- Python 3.9 和所有必要第三方库
- Fortran 编译器与库(如 MPI、NetCDF)
- 用于开发的工具(如
pytest
,tox
,cython
,pandas
,xarray
等)
这意味着可以在容器内运行包括 CHIMERE 在内的复杂模型(但需要一定 Docker 使用经验)。
# Build a Docker image that contains all requirements to run the PyCIF CI.
FROM ubuntu:20.04RUN apt update \&& DEBIAN_FRONTEND=noninteractive apt install -y software-properties-common rsync git wget\&& apt update \
# Install Python&& DEBIAN_FRONTEND=noninteractive apt install -y python3.9 python3-pip \
# Install GDAL&& apt-get install -y gdal-bin libgdal-dev \&& pip install numpy GDAL \
# Install important packages&& DEBIAN_FRONTEND=noninteractive apt-get install -y build-essential xmlstarlet gfortran libeccodes0 graphviz \&& pip install scipy tox==3.23.1 sphinx sphinxcontrib-plantuml graphviz f90nml \pyproj cython pandas matplotlib==3.3.4 bottleneck h5py xarray \
# Install MPI&& apt-get install -y libopenmpi-dev openmpi-bin libhdf5-openmpi-dev \
# Install NetCDF&& apt-get install libnetcdf-dev libnetcdff-dev;# Install python packages to install pycif locally
RUN apt update \&& apt-get install -y python3-yaml \&& pip install pytest pytest-html pyyaml virtualenv==20.4.7 \&& pip install numpy --upgrade ;# Install pycif on the container
COPY ./ /tmp/CIFWORKDIR /tmp/CIF/RUN pip3 install -e .# Command to run at execution
COPY ./bin/docker_entrypoint.sh /bin/# Create directories
RUN mkdir /workdir/ \&& mkdir /config/;ENTRYPOINT ["docker_entrypoint.sh"]
如何获取 CIF Docker 镜像?
从 Docker Hub 拉取官方镜像:
docker pull pycif/pycif-ubuntu:0.2
此外还有针对特定模型(如 TM5)的镜像,例如:
docker pull pycif/pycif-tm5:0.2
⚠️ 注意:镜像标签可能会更新,建议访问 Docker Hub 页面 查看最新版本。
如何使用 Docker 容器运行 CIF?
Step1:快速运行配置文件
使用 CIF 提供的脚本 docker_debug.sh
,只需一条命令即可运行配置:
cd CIF_root_dir/bin
./docker_debug.sh path_to_my_config_file.yml
该脚本会:
- 自动挂载 YAML 配置文件和工作目录到容器
- 启动容器
- 执行模拟并将结果写入
workdir
文件内容如下:
#!/usr/bin/env bash# Provide local path to your yaml configuration file
config_file=$1
pycif_root_dir=`pwd`/../
extra_volumns=$2# Convert to absolute paths
config_file=`echo "$(cd "$(dirname "$config_file")"; pwd)/$(basename "$config_file")"`
pycif_root_dir=`echo "$(cd "$pycif_root_dir"; pwd)"`# Fetch workdir to mount it in the container for saving outputs
workdir=`python3 -W ignore -c \
"
from pycif.utils.yml import ordered_load;
with open('$config_file', 'r') as f:config = ordered_load(f)print('AAAAAAAAAAAA')
print(config['workdir']); "`workdir=`echo $workdir | awk -F "AAAAAAAAAAAA" '{print $2}'`mkdir -p $workdir# Run the configuration into the container and writing outputs to workdir
docker run -it -v $config_file:/config/config.yml \-v $pycif_root_dir:/tmp/CIF/ \-v $workdir:/workdir/ \-v /home/aberchet/Projects/PYCIF_DATA_TEST/:/tmp/PYCIF_DATA_TEST/ \$extra_volumns \--entrypoint /bin/bash pycif/pycif-ubuntu:0.3
# pycif/pycif-ubuntu:0.3
# --entrypoint /bin/bash pycif/pycif-ubuntu:0.2#pip install h5py
#python3 -m pycif /config/config.yml
容器中文件结构说明
在 Docker 中的目录结构如下:
Docker Container
├── /bin/ # 启动脚本
├── /tmp/CIF/ # CIF 源代码
├── /config/ # 挂载的配置文件
└── /workdir/ # 输出目录(与主机同步)
注意:
workdir
在配置文件中应为主机上的合法路径- 其他路径应为 Docker 容器中的路径(如
/tmp/CIF/...
)
使用外部数据(如观测、排放、气象等)
复杂模拟时,Docker 镜像内可能缺少你需要的数据。解决方法:
- 挂载主机数据目录到容器,例如:
-v /my/host/data:/data/
- 在 YAML 配置文件中,将路径指向
/data/...
CIF 支持的测试模型
CIF 支持的测试模型如下:
- Gaussian Toy Model
- CHIMERE
- FLEXPART
- TM5
所有模型测试所需数据(如 EDGAR, meteorology)可从 CIF 提供的链接下载,并设置环境变量:
export PYCIF_DATA_TEST=/path/to/test/data
自动测试(CI)运行方法
CIF 的自动测试系统基于 tox
,你可以在 Docker 容器中手动运行测试:
示例脚本 run_tests.sh
:
#!/usr/bin/env bash
pycif_root_dir=`pwd`/../
extra_volumns="-v ${PYCIF_DATA_TEST}:/tmp/PYCIF_DATA_TEST/"docker run \-v $pycif_root_dir:/tmp/CIF/ \$extra_volumns \-it --entrypoint /tmp/CIF/bin/tox_command.sh \pycif/pycif-tm5:0.2
脚本 tox_command.sh
示例:
#!/usr/bin/env bash
cd /tmp/CIF/
pip freeze
tox -e py38 -e coverage -- -m 'test_in_ci and dummy'
可以替换 dummy
为其他模型关键字来测试不同模型:
模型 | tox 命令关键字 |
---|---|
Gaussian | dummy |
CHIMERE | chimere |
FLEXPART | flexpart |
TM5 | tm5 |
调试技巧:进入容器
可以手动进入容器查看测试结果或调试:
docker ps -a # 查看容器ID
docker start <container-id> # 启动容器
docker exec -it <container-id> /bin/bash # 进入容器
高级调试:使用 Python 调试器(pudb)
可以在代码中插入:
import pudb; pudb.set_trace()
并在 tox.ini
中添加依赖:
[testenv]
deps =numpypudbpytest-pudb