原文作者:我輩李想
版權(quán)聲明:文章原創(chuàng),轉(zhuǎn)載時請務(wù)必加上原文超鏈接、作者信息和本聲明。
前言
在使用docker的過程中,跟著官方文檔或各種教程都是很順利的,在實(shí)際項(xiàng)目中,我碰到了一個docker部署conda鏡像容器,實(shí)際程序是在虛擬環(huán)境slab中,不是base。項(xiàng)目是我從其他人手中接過來的,每次更新docker鏡像時,都是pull鏡像、run進(jìn)入容器,更新環(huán)境,commit、push倉庫。一直有個不一樣的想法在沖擊我,能不能直接用dockerfile創(chuàng)建鏡像,然后直接push倉庫?,F(xiàn)在就有了這篇博客。
一、新建dockerfile文件
創(chuàng)建Dockerfile_conda文件,我們已經(jīng)按照docker配置寫入相關(guān)命令,內(nèi)容如下:
FROM continuumio/miniconda3 AS base
WORKDIR /slab
ENV PATH /opt/conda/envs/slab/bin:$PATH
# 創(chuàng)建slab環(huán)境
RUN conda create --name slab python=3.9
# 激活slab環(huán)境
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
主要關(guān)注RUN的三個命令,這是我們正常使用conda的命令。
二、使用build創(chuàng)建鏡像
docker build -t pika_conda -f Dockerfile_conda .
因?yàn)閐ockerfile配置問題,這個無法創(chuàng)建鏡像
1.報(bào)錯:Your shell has not been properly configured to use ‘conda activate’.
這個報(bào)錯我們仔細(xì)看時讓我們使用conda init **,如果是在linux系統(tǒng),可以這么干,但是在docker容器中,這個命令無效。
我參考了這篇博客,在dockerfile中加入一條命令,現(xiàn)在dockerfile內(nèi)容如下:
FROM continuumio/miniconda3 AS base
WORKDIR /slab
ENV PATH /opt/conda/envs/slab/bin:$PATH
# 創(chuàng)建slab環(huán)境
RUN conda create --name slab python=3.9
# 激活slab環(huán)境
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.報(bào)錯:source - not found
現(xiàn)在還不能確定虛擬環(huán)境是否激活成功,因?yàn)槲覀兪莇ocker鏡像,無法直接使用source。我有找了一篇博客,現(xiàn)在dockerfile內(nèi)容如下:
FROM continuumio/miniconda3 AS base
WORKDIR /slab
ENV PATH /opt/conda/envs/slab/bin:$PATH
# 創(chuàng)建slab環(huán)境
RUN conda create --name slab python=3.9
# 激活slab環(huán)境
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
現(xiàn)在的dockerfile已經(jīng)可以成功創(chuàng)建鏡像了。
三、使用run啟動并進(jìn)入容器
docker run -it --name myconda_test pika_conda:latest /bin/bash
這里有個問題,雖然我們進(jìn)入了容器,但是默認(rèn)激活的環(huán)境還是base我們還需要修改dockerfile文件,內(nèi)容如下:
FROM continuumio/miniconda3 AS base
WORKDIR /slab
ENV PATH /opt/conda/envs/slab/bin:$PATH
# 創(chuàng)建slab環(huán)境
RUN conda create --name slab python=3.9
# 激活slab環(huán)境
RUN /bin/bash -c "source activate slab"
# RUN conda activate slab
# 激活默認(rèn)環(huán)境
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
網(wǎng)絡(luò)上有將conda activate slab放在CMD中,也可以實(shí)現(xiàn)上述的效果,但是這樣有一個風(fēng)險(xiǎn)。我們這個鏡像最終會被其他dockerfile文件from,新的dockerfile中也存在CMD,可能被覆蓋。
四、檢查虛擬環(huán)境是否激活,并安裝了包
在容器中,我們直接使用pip list 查看python的三方包,我們可以看到已經(jīng)成功安裝了。
最后我整理了一下dockerfile的內(nèi)容,下面的是最終版文件。
FROM continuumio/miniconda3 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
五、通過conda參數(shù)實(shí)現(xiàn)安裝python包
通過上文,我們是按照正常的conda使用路線完成了python包安裝至指定虛擬環(huán)境。因?yàn)閜ip默認(rèn)是直接安裝至base環(huán)境,我們可以通過需改conda設(shè)置,實(shí)現(xiàn)包安裝至slab,這是一個環(huán)境變量CONDA_DEFAULT_ENV。dockerfile的終版內(nèi)容如下:文章來源:http://www.zghlxwxcb.cn/news/detail-843883.html
FROM continuumio/miniconda3 AS base
WORKDIR /slab
ENV TZ=Asia/Shanghai
ENV PATH /opt/conda/envs/slab/bin:$PATH
ENV CONDA_DEFAULT_ENV slab
RUN 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 pytest
SHELL ["/bin/bash", "-c"]
六、dockerfile執(zhí)行多個命令
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"]
根據(jù)ENTRYPOINT 和CMD,可以讀取docker 命令的 --env-file參數(shù),實(shí)現(xiàn)變參的使用文章來源地址http://www.zghlxwxcb.cn/news/detail-843883.html
docker run -d -p 9099 -name dn --env-file config/prod.env xxx:latest
到了這里,關(guān)于【Docker】dockerfile部署conda并激活環(huán)境的文章就介紹完了。如果您還想了解更多內(nèi)容,請?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!