原文作者:我辈李想
版权声明:文章原创,转载时请务必加上原文超链接、作者信息和本声明。
在使用docker的过程中,跟着官方文档或各种教程都是很顺利的,在实际项目中,我碰到了一个docker部署conda镜像容器,实际程序是在虚拟环境slab中,不是base。项目是我从其他人手中接过来的,每次更新docker镜像时,都是pull镜像、run进入容器,更新环境,commit、push仓库。一直有个不一样的想法在冲击我,能不能直接用dockerfile创建镜像,然后直接push仓库。现在就有了这篇博客。
创建Dockerfile_conda文件,我们已经按照docker配置写入相关命令,内容如下:
FROM continuumio/anaconda3 AS base
WORKDIR /slab
ENV PATH /opt/conda/envs/slab/bin:$PATH
# 创建slab环境
RUN conda create --name slab python=3.9
# 激活slab环境
RUN conda activate slab
# 安装python库
RUN pip install -i https://pypi.tuna.tsinghua.edu.cn/simple \
uvicorn fastapi python-dotenv redis requests pymysql pandas \
jsonpath sqlalchemy python-docx cx_Oracle schedule rabbitpy \
pika python-multipart openpyxl superstream
主要关注RUN的三个命令,这是我们正常使用conda的命令。
docker build -t pika_conda -f Dockerfile_conda .
因为dockerfile配置问题,这个无法创建镜像
这个报错我们仔细看时让我们使用conda init **,如果是在linux系统,可以这么干,但是在docker容器中,这个命令无效。
我参考了这篇博客,在dockerfile中加入一条命令,现在dockerfile内容如下:
FROM continuumio/anaconda3 AS base
WORKDIR /slab
ENV PATH /opt/conda/envs/slab/bin:$PATH
# 创建slab环境
RUN conda create --name slab python=3.9
# 激活slab环境
RUN source activate slab
# RUN conda activate slab
# 安装python库
RUN pip install -i https://pypi.tuna.tsinghua.edu.cn/simple \
uvicorn fastapi python-dotenv redis requests pymysql pandas \
jsonpath sqlalchemy python-docx cx_Oracle schedule rabbitpy \
pika python-multipart openpyxl superstream
现在还不能确定虚拟环境是否激活成功,因为我们是docker镜像,无法直接使用source。我有找了一篇博客,现在dockerfile内容如下:
FROM continuumio/anaconda3 AS base
WORKDIR /slab
ENV PATH /opt/conda/envs/slab/bin:$PATH
# 创建slab环境
RUN conda create --name slab python=3.9
# 激活slab环境
RUN /bin/bash -c "source activate slab"
# RUN conda activate slab
# 安装python库
RUN pip install -i https://pypi.tuna.tsinghua.edu.cn/simple \
uvicorn fastapi python-dotenv redis requests pymysql pandas \
jsonpath sqlalchemy python-docx cx_Oracle schedule rabbitpy \
pika python-multipart openpyxl superstream
现在的dockerfile已经可以成功创建镜像了。
docker run -it --name myconda_test pika_conda:latest /bin/bash
这里有个问题,虽然我们进入了容器,但是默认激活的环境还是base
我们还需要修改dockerfile文件,内容如下:
FROM continuumio/anaconda3 AS base
WORKDIR /slab
ENV PATH /opt/conda/envs/slab/bin:$PATH
# 创建slab环境
RUN conda create --name slab python=3.9
# 激活slab环境
RUN /bin/bash -c "source activate slab"
# RUN conda activate slab
# 激活默认环境
RUN echo "conda activate slab" >> ~/.bashrc
# 安装python库
RUN pip install -i https://pypi.tuna.tsinghua.edu.cn/simple \
uvicorn fastapi python-dotenv redis requests pymysql pandas \
jsonpath sqlalchemy python-docx cx_Oracle schedule rabbitpy \
pika python-multipart openpyxl superstream
网络上有将conda activate slab放在CMD中,也可以实现上述的效果,但是这样有一个风险。我们这个镜像最终会被其他dockerfile文件from,新的dockerfile中也存在CMD,可能被覆盖。
在容器中,我们直接使用pip list 查看python的三方包,我们可以看到已经成功安装了。
最后我整理了一下dockerfile的内容,下面的是最终版文件。
FROM continuumio/anaconda3 AS base
WORKDIR /slab
ENV PATH /opt/conda/envs/slab/bin:$PATH
RUN conda create --name slab python=3.9 \
&& /bin/bash -c "source activate slab" \
&& echo "conda activate slab" >> ~/.bashrc \
&& pip install -i https://pypi.tuna.tsinghua.edu.cn/simple \
uvicorn fastapi python-dotenv redis requests pymysql pandas \
jsonpath sqlalchemy python-docx cx_Oracle schedule rabbitpy \
pika python-multipart openpyxl superstream