尝试将现有 docker 文件转换为使用 distroless 映像时出现 pip 错误

got pip error while trying to convert an existing docker file to use distroless image

我有一个 dockerfile,其中我使用 python:3.9.2-slim-buster 作为基础图像,我正在做以下事情。

FROM lab.com:5000/python:3.9.2-slim-buster
ENV PYTHONPATH=base_platform_update
RUN apt-get update && apt-get install -y curl && apt-get clean
RUN curl -LO https://storage.googleapis.com/kubernetes-release/release/$(curl -s https://storage.googleapis.com/kubernetes-release/release/stable.txt)/bin/linux/amd64/kubectl
RUN chmod +x ./kubectl
RUN mv ./kubectl /usr/local/bin
WORKDIR /script
RUN pip install SomePackage
COPY base_platform_update ./base_platform_update
ENTRYPOINT ["python3", "base_platform_update/core/main.py"]

我想将其转换为使用 distroless 映像。我试过了,但没有用。我找到了这些资源

我知道这是不正确的,但这是我在关注这些资源后得出的结论

# first stage
FROM lab.com:5000/python:3.9.2-slim-buster AS build-env
WORKDIR /script
COPY base_platform_update ./base_platform_update
RUN apt-get update && apt-get install -y curl && apt-get clean
RUN curl -LO https://storage.googleapis.com/kubernetes-release/release/$(curl -s https://storage.googleapis.com/kubernetes-release/release/stable.txt)/bin/linux/amd64/kubectl
RUN mv ./kubectl /usr/local/bin

# second stage
FROM gcr.io/distroless/python3
WORKDIR /script
COPY --from=build-env /script/base_platform_update ./base_platform_update
COPY --from=build-env /usr/local/bin/kubectl /usr/local/bin/kubectl
COPY --from=build-env /bin/chmod /bin/chmod
COPY --from=build-env /usr/local/bin/pip /usr/local/bin/pip
RUN chmod +x  /usr/local/bin/kubectl
ENV PYTHONPATH=base_platform_update
RUN pip install SomePackage
ENTRYPOINT ["python3", "base_platform_update/core/main.py"]

它给出了以下错误:

/bin/sh: 1: pip: not found
The command '/bin/sh -c pip install SomePackage' returned a non-zero code: 127

我也想过将 RUN pip install SomePackage 移动到 第一阶段 但不知道该怎么做。

如有任何帮助,我们将不胜感激。谢谢

编辑: docker images输出

gcr.io/distroless/python3                                latest              7f711ebcfe29   51 years ago     52.2MB
gcr.io/distroless/python3                                debug               7c587fbe3d02   51 years ago     53.3MB

可能是您需要将该目录添加到 PATH。

ENV PATH="/usr/local/bin:$PATH" 

考虑添加所有这些依赖项后最终图像大小的差异,可能不值得这么麻烦。

标记为 python:3.8.5-alpine 的最新图像是 42.7MB,而 gcr.io/distroless/python3 在撰写本文时是 52.2MB,在添加二进制文件、脚本以及您要安装的软件包之后,您可能最后超过这个数字。如果拉取时间很重要并且网络带宽使用成本很高,那可能是一个想法,否则对于当前用例来说似乎太多了。

Distroless 镜像仅 用于运行时,因此,您不能(默认情况下)使用 python 包管理器来安装包,请参阅 Google GitHub project readme

"Distroless" images contain only your application and its runtime dependencies. They do not contain package managers, shells or any other programs you would expect to find in a standard Linux distribution.

您可以在第二个新阶段安装软件包,然后将已安装的软件包从它复制到第三个,但这不一定有效,因为目标 OS 该软件包的目的是,第二个和第三个之间不兼容第三阶段等等`.

这是一个测试 Dockerfile:

# first stage
FROM python:3.8 AS builder
COPY requirements.txt .

# install dependencies to the local user directory (eg. /root/.local)
RUN pip install --user -r requirements.txt

# second unnamed stage
FROM python:3.8-slim
WORKDIR /code

# copy only the dependencies installation from the 1st stage image
COPY --from=builder /root/.local /root/.local
COPY ./src .

# update PATH environment variable
ENV PATH=/root/.local:$PATH

CMD [ "python", "./server.py" ]

Dockerfile credits

您可以使用任意数量的 python 库将您的应用程序打包为二进制文件,但这取决于您需要多少。您可以使用像 pyinstaller 这样的包来做到这一点,尽管它主要是打包项目而不是将其转换为单个二进制文件,nuitka 这是一个上升的选项,并且与 cx_Freeze 一起非常受欢迎。

Here's 如果您有兴趣,请提供有关该主题的相关主题。

还有 this 篇文章。