将Python软件包安装到Docker映像的不同方法

时间:2019-11-27 12:58:41

标签: python docker pip package docker-image

我想基于一个已经安装了一些Python软件包的现有镜像创建Docker镜像。因此,我正在考虑在Dockerfile中使用pip将其他软件包安装到该映像。看来我可以单独安装它们,例如:

RUN pip install foo==1.2.*
RUN pip install bar==3.4.*
...

或者将它们放在requirements.txt中,然后执行以下操作:

COPY requirements.txt /opt/app/requirements.txt
WORKDIR /opt/app
RUN pip install -r requirements.txt

我想知道哪种方法被认为是更好的做法(例如,性能更高和/或导致图像更小)。

2 个答案:

答案 0 :(得分:1)

  

我需要一种更快的方法并导致更小的图像尺寸

使用高山和多阶段构建。示例:

FROM python:3.7-alpine as base
FROM base as builder
RUN mkdir /install
WORKDIR /install
COPY requirements.txt /requirements.txt
RUN pip install --install-option="--prefix=/install" -r /requirements.txt
FROM base
COPY --from=builder /install /usr/local
COPY src /app
WORKDIR /app
CMD ["gunicorn", "-w 4", "main:app"]

来源:https://blog.realkinetic.com/building-minimal-docker-containers-for-python-applications-37d0272c52f3

答案 1 :(得分:0)

这是一个复杂的问题,两种选择都有其优缺点。让我们根据以下方法扩展方法:计算资源,依赖链,用户友好等。

方法1:将包添加到requirements.txt

  • 以这种方式包含软件包是更干净和有保证的方法。
  • 添加软件包后,您需要构建映像并重新启动容器,这会占用大量时间和处理资源。
  • 借助版本控制机制,它变得更加强大。

方法2:在部署的容器上使用pip进行操作

  • 这种方法更简单,更容易。
  • 使用pip直接安装在已部署的容器上,将始终获得其依赖项来进行安装。
  • 由于版本不匹配或软件包本身与其他软件包冲突,因此这些依赖软件包有时可能与现有软件包冲突。
  • 有时您可能会忘记从工作容器中构建docker映像。

结论

  • 这两种方法的大小不会有太大变化。
  • 如果您正在尝试使用其他软件包,请使用方法2,它将节省时间和资源。
  • 如果确定,可以添加需求并开始工作。