1

我有一个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
4

1 回答 1

1

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

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

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

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

Distroless 映像适用于运行时,因此,您不能(默认情况下)使用 python 包管理器安装包,请参阅Google GitHub 项目自述文件

“Distroless”映像仅包含您的应用程序及其运行时依赖项。它们不包含包管理器、shell 或您希望在标准 Linux 发行版中找到的任何其他程序。

您可以在第二个新阶段安装软件包并将已安装的软件包从它复制到第三个,但这并不一定会导致该软件包用于目标操作系统的工作原因,第二个和第三个阶段之间的不兼容等。

这是一个考试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 学分

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

如果您有兴趣,这里有一个关于该主题的相关主题。

还有这篇文章。

于 2021-09-17T18:09:57.330 回答