在Docker中使用Anaconda

目录

在ploto项目中,我使用python的docker镜像构建esmdiag的镜像。 因为debian默认的cdo无法解析项目用到的NetCDF格式数据,所以需要在构建镜像时编译cdo源码,耗费大量时间。

最近基于Anaconda开发了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"]

参考

perillaroc/ploto