在Docker中使用Anaconda
在 ploto 项目中,我使用 python 的 docker 镜像构建 esmdiag 的镜像。 因为 debian 默认的 cdo 无法解析项目用到的 NetCDF 格式数据,所以需要在构建镜像时编译 cdo 源码,耗费大量时间。
最近基于 Anaconda 开发了 nwpc-oper/nwpc-graphics 项目,该项目部署在安装了 SUSE 操作系统的服务器上,没有正版支持,无法在线安装软件。 经搜索发现,可以使用 conda 安装 NCL 软件包,安装后可以执行业务系统使用的 NCL 脚本。
因此,我准备将 ploto 项目中的基础镜像从 Python 替换为 Anaconda。
选择镜像
Anaconda 是一个商业公司,相关的 Docker 镜像由该公司提供。 访问下面网址,可以看到该公司提交的镜像:
https://hub.docker.com/u/continuumio/
镜像主要分为 anaconda 和 miniconda 两种类型。 如果只需要 conda 环境,可以选择占用磁盘空间较小的 miniconda 镜像。
创建 env
使用 conda 安装 NCL 需要单独创建一个 env,在默认的 env 中无法正常安装。
FROM continuumio/miniconda
RUN conda create -n ncl_stable -c conda-forge ncl cdo imagemagick \
&& conda clean -y -a
CMD ["conda", "run", "-n", "ncl_stable", "/bin/bash", "-c"]
上面的 dockerfile 创建 ncl_stable 环境,并安装 ploto 项目需要使用的 ncl、cdo 和 imagemagick。
在 CMD
命令中,使用 conda run -n ncl_stable
在 ncl_stable 环境中启动 bash。
使用其他用户
默认的 miniconda 使用 root 用户,conda 的 envs 安装在/opt/conda/envs
中。
如果需要使用其他用户,需要修改该目录的权限。
FROM continuumio/miniconda
RUN groupadd -g 1004 user \
&& useradd -u 1004 -g 1004 --create-home user \
&& chown -R user:user /opt/conda
USER user
RUN conda create -n ncl_stable -c conda-forge ncl cdo imagemagick \
&& conda clean -y -a
CMD ["conda", "run", "-n", "ncl_stable", "/bin/bash", "-c"]
上面的 Dockerfile 修改 /opt/conda 整个目录的权限。
额外安装 python 包
ploto 需要额外安装本地 python 包,可以通过设置 SHELL
命令,让所有的后续 RUN
和 ENTRYPOINT
命令都运行在 ncl_stable 环境中。
FROM nwpc-oper/ploto-esmdiag:base
USER user
COPY ploto/ /srv/ploto
COPY ploto-esmdiag/ /srv/ploto-esmdiag
COPY vendor/ /srv/vendor
SHELL ["conda", "run", "-n", "ncl_stable", "/bin/bash", "-c"]
RUN cd /srv/ploto \
&& python3 -m pip config set global.index-url https://pypi.tuna.tsinghua.edu.cn/simple \
&& python3 -m pip install . \
&& cd /srv/ploto-esmdiag \
&& python3 -m pip install .
ENTRYPOINT ["python3", "/srv/ploto/ploto/scheduler/rabbitmq/consumer/consumer.py"]
ENV ESMDIAG_ROOT=/srv/vendor/esmdiag
CMD ["--config-file=/etc/ploto/consumer.config.yaml"]
自行创建
Anaconda 系列镜像使用 Debian 构建,当然也可以基于其他镜像自行创建 Anaconda 的镜像。
比如 ploto-gidat 项目使用的绘图工具需要 libfortran3,而默认 Anaconda 镜像的 Debian 版本中已不支持。 所以,笔者在低版本的 Ubuntu 镜像中下载并安装 Miniconda。
笔者目前仅尝试手动在容器中安装镜像,然后再创建镜像。
首先启动运行一个容器,进入 SHELL 界面
docker run -it --tag ploto-ubuntu \
ubuntu:18.04 bash
下载 Minconda 安装包并运行,创建 ENV,安装需要的包。
退出 SHELL 界面,容器会停止运行。
使用 docker commit
将容器打包为镜像
docker commit ploto-ubuntu nwpc-oper/ploto-giset
笔者后续会尝试设计 Dockerfile,实现上述步骤的自动编排。