получил ошибку pip при попытке преобразовать существующий файл докеров для использования образа без дистрибутива

у меня есть 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"]

Я хочу преобразовать это, чтобы использовать образ без дистрибутива. Я пробовал, но не работает. Я нашел эти ресурсы

Я знаю, что это неверно, но это то, что я придумал после просмотра этих ресурсов.

      # 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до первого этапа, но они не могли понять, как это сделать.

Любая помощь будет оценена по достоинству. Спасибо

1 ответ

Возможно, вам нужно добавить этот каталог в PATH.

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

Учтите, хотя окончательная разница в размере изображения после добавления всех этих зависимостей может не стоить всех хлопот.

последнее изображение с тегом составляет 42,7 МБ, а на момент написания это 20,4 МБ, после добавления двоичных файлов, сценария и, тем не менее, пакета, который вы хотите установить, вы можете превзойти эту цифру в конце. Если время извлечения важно, а использование полосы пропускания сети является дорогостоящим, это можно подумать, иначе для текущего варианта использования кажется слишком большим.

Образы без дистрибутивов предназначены только для среды выполнения, в результате вы не можете (по умолчанию) использовать диспетчер пакетов python для установки пакетов, см. Readme проекта Google GitHub

Образы «без дистрибутивов» содержат только ваше приложение и его зависимости времени выполнения. Они не содержат менеджеров пакетов, оболочек или каких-либо других программ, которые вы ожидаете найти в стандартном дистрибутиве Linux.

вы можете установить пакеты на втором новом этапе и скопировать установленные пакеты с него на третий, но это не обязательно сработает из-за целевой ОС, для которой предназначен пакет, несовместимости между вторым и третьим этапами и т. д.

Вы можете упаковать свое приложение в двоичный файл, используя любое количество библиотек python, но это зависит от того, сколько вам нужно.

Другие вопросы по тегам