当前位置:首页 » 《随便一记》 » 正文

【Docker】dockerfile部署conda并激活环境

25 人参与  2024年04月07日 15:05  分类 : 《随便一记》  评论

点击全文阅读


原文作者:我辈李想
版权声明:文章原创,转载时请务必加上原文超链接、作者信息和本声明。


文章目录

前言一、新建dockerfile文件二、使用build创建镜像1.报错:Your shell has not been properly configured to use 'conda activate'.2.报错:source - not found 三、使用run启动并进入容器四、检查虚拟环境是否激活,并安装了包五、通过conda参数实现安装python包六、dockerfile执行多个命令七、dockerfile 定义run变参


前言

在使用docker的过程中,跟着官方文档或各种教程都是很顺利的,在实际项目中,我碰到了一个docker部署conda镜像容器,实际程序是在虚拟环境slab中,不是base。项目是我从其他人手中接过来的,每次更新docker镜像时,都是pull镜像、run进入容器,更新环境,commit、push仓库。一直有个不一样的想法在冲击我,能不能直接用dockerfile创建镜像,然后直接push仓库。现在就有了这篇博客。


一、新建dockerfile文件

创建Dockerfile_conda文件,我们已经按照docker配置写入相关命令,内容如下:

FROM continuumio/miniconda3 AS baseWORKDIR /slabENV 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的命令。

二、使用build创建镜像

docker build -t pika_conda -f Dockerfile_conda .

因为dockerfile配置问题,这个无法创建镜像

1.报错:Your shell has not been properly configured to use ‘conda activate’.

这个报错我们仔细看时让我们使用conda init **,如果是在linux系统,可以这么干,但是在docker容器中,这个命令无效
在这里插入图片描述
我参考了这篇博客,在dockerfile中加入一条命令,现在dockerfile内容如下:

FROM continuumio/miniconda3 AS baseWORKDIR /slabENV 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

2.报错:source - not found

现在还不能确定虚拟环境是否激活成功,因为我们是docker镜像,无法直接使用source。我有找了一篇博客,现在dockerfile内容如下:

FROM continuumio/miniconda3 AS baseWORKDIR /slabENV 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已经可以成功创建镜像了。

三、使用run启动并进入容器

docker run -it --name myconda_test pika_conda:latest /bin/bash

这里有个问题,虽然我们进入了容器,但是默认激活的环境还是base
在这里插入图片描述我们还需要修改dockerfile文件,内容如下:

FROM continuumio/miniconda3 AS baseWORKDIR /slabENV 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/miniconda3 AS baseWORKDIR /slabENV PATH /opt/conda/envs/slab/bin:$PATHRUN 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

五、通过conda参数实现安装python包

通过上文,我们是按照正常的conda使用路线完成了python包安装至指定虚拟环境。因为pip默认是直接安装至base环境,我们可以通过需改conda设置,实现包安装至slab,这是一个环境变量CONDA_DEFAULT_ENV。dockerfile的终版内容如下:

FROM continuumio/miniconda3 AS baseWORKDIR /slabENV TZ=Asia/ShanghaiENV PATH /opt/conda/envs/slab/bin:$PATHENV CONDA_DEFAULT_ENV slabRUN conda create --name slab python=3.9 \    && 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 xlsxwriter pytestSHELL ["/bin/bash", "-c"]

六、dockerfile执行多个命令

SHELL ["/bin/bash", "-c"]ENTRYPOINT uvicorn main:app --host 0.0.0.0 --port 9099 --workers 4 --env-file config/dev.env & python mq_main.py

七、dockerfile 定义run变参

SHELL ["/bin/bash", "-c"]ENTRYPOINT ["uvicorn","main:app","--host","0.0.0.0","--port","9099","--workers","4","--env-file"]CMD ["config/dev.env"]

根据ENTRYPOINT 和CMD,可以读取docker 命令的 --env-file参数,实现变参的使用

docker run -d -p 9099 -name dn --env-file config/prod.env xxx:latest

点击全文阅读


本文链接:http://zhangshiyu.com/post/91784.html

<< 上一篇 下一篇 >>

  • 评论(0)
  • 赞助本站

◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。

关于我们 | 我要投稿 | 免责申明

Copyright © 2020-2022 ZhangShiYu.com Rights Reserved.豫ICP备2022013469号-1