在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 命令,让所有的后续 RUNENTRYPOINT 命令都运行在 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,实现上述步骤的自动编排。

参考

perillaroc/ploto

perillaroc/ploto-gidat