如何在Docker镜像中安装dateinfer ?



一些背景知识:我刚开始了解docker映像和容器以及如何编写DOCKERFILE。我目前有一个Dockerfile安装所有的依赖关系,我想通过PIP安装命令,所以,它是非常简单的构建和部署图像。但是我目前有一个使用Dateinfer模块的新需求,不能通过pip install命令安装。repo必须首先克隆,然后必须安装,我很难通过DOCKERFILE实现这一点。目前我一直在做的工作是运行容器,并在所有其他依赖项的目录中手动安装它,并在安装了dateinfer的情况下提交更改。但这是一个非常繁琐和耗时的过程,我想通过在DOCKERFILE中提到它以及所有其他依赖项来实现相同的目标。

这是我的Dockerfile的样子:

FROM ubuntu:20.04
RUN apt update
RUN apt upgrade -y
RUN apt-get install -y python3
RUN apt-get install -y python3-pip
RUN DEBIAN_FRONTEND=noninteractive TZ=Etc/UTC apt-get -y install tzdata
RUN apt-get install -y libenchant1c2a
RUN apt install git -y
RUN pip3 install argparse
RUN pip3 install boto3
RUN pip3 install numpy==1.19.1
RUN pip3 install scipy
RUN pip3 install pandas
RUN pip3 install scikit-learn
RUN pip3 install matplotlib
RUN pip3 install plotly
RUN pip3 install kaleido
RUN pip3 install fpdf
RUN pip3 install regex
RUN pip3 install pyenchant
RUN pip3 install openpyxl
ADD core.py /
ENTRYPOINT [ "/usr/bin/python3.8", "/core.py”]

所以当我尝试像这样安装Dateinfer时:

RUN git clone https://github.com/nedap/dateinfer.git
RUN cd dateinfer
RUN pip3 install .

会抛出以下错误:错误:目录'。'无法安装。既不是'setup.py'也不是'pyproject. py'。toml的发现。命令'/bin/sh -c pip3 install .'返回一个非零代码:1

如何解决这个问题?

Dockerfile中的每个RUN指令都运行在自己的子shell中。如果你这样写:

RUN cd dateinfer

这是一个no-op:它启动一个新的shell,更改目录,然后退出shell。当执行下一个RUN命令时,您将回到/目录。

解决这个问题的最简单方法是将命令包含在单个RUN语句中:

RUN git clone https://github.com/nedap/dateinfer.git && 
cd dateinfer && 
pip3 install .

事实上,您也可以从其他pip install命令中获益;而不是一堆单独的RUN命令,请考虑:

RUN pip3 install 
argparse 
boto3 
numpy==1.19.1 
scipy 
pandas 
scikit-learn 
matplotlib 
plotly 
kaleido 
fpdf 
regex 
pyenchant 
openpyxl

这通常会更快,因为pip只需要解析依赖关系。

而不是在命令中单独指定所有包行,您也可以将它们放入requirements.txt文件中,然后使用pip install -r requirements.txt.

最新更新