Как установить недостающие модули Python в образ без дистрибутива?

Я пытаюсь установить некоторые недостающие модули в образ без дистрибутива Python, однако получаю ошибку ниже.

 => ERROR [3/7] RUN pip install --trusted-host pypi.org --trusted-host pypi.python.org --trusted-host files.pythonhosted.org --upgrade pip                                                                                    0.3s
------
 > [3/7] RUN pip install --trusted-host pypi.org --trusted-host pypi.python.org --trusted-host files.pythonhosted.org --upgrade pip:
0.253 runc run failed: unable to start container process: exec: "/bin/sh": stat /bin/sh: no such file or directory

Похоже, что образ без дистрибутива не имеет оболочки (/bin/sh). Ниже приведен Dockerfile. Есть ли альтернативный способ установки необходимых модулей? Могли бы вы, пожалуйста, посоветовать.

FROM gcr.io/distroless/python3-debian12:nonroot

RUN pip install --trusted-host pypi.org --trusted-host pypi.python.org --trusted-host files.pythonhosted.org --upgrade pip
RUN pip install --trusted-host pypi.org --trusted-host pypi.python.org --trusted-host files.pythonhosted.org requests simplejson python-json-logger

Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
0
0
153
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Чтобы дать вам представление: если бы я устанавливал пакеты Python в образ без дистрибутива, я бы использовал многоэтапную сборку. Сначала я установлю пакеты в обычный образ Python, а затем скопирую их в образ без дистрибутива. Что-то вроде этого:

# Use a regular Python image to install packages
FROM python:3.12-slim as builder

# Install the required packages
RUN pip install --trusted-host pypi.org --trusted-host pypi.python.org --trusted-host files.pythonhosted.org --upgrade pip
RUN pip install --trusted-host pypi.org --trusted-host pypi.python.org --trusted-host files.pythonhosted.org requests simplejson python-json-logger

# Switch to the distroless image
FROM gcr.io/distroless/python3-debian12:nonroot

# Copy the installed packages
COPY --from=builder /usr/local/lib/python3.12/site-packages /usr/local/lib/python3.12/site-packages
COPY --from=builder /usr/local/bin /usr/local/bin

Этот подход позволит обойти проблему отсутствия оболочки в образах без дистрибутива, если сначала выполнить установку пакета в обычной среде Python.

Надеюсь, это поможет.

Благодарю за ваш ответ. Похоже, это правильный способ установки пакетов в версии без дистрибутива. Я создал изображение, выполнив описанные выше шаги. Единственная проблема заключается в том, что я получаю сообщение об ошибке ниже при попытке запустить контейнер «python3: ошибка при загрузке общих библиотек: libpython3.12.so.1.0: невозможно открыть общий объектный файл: нет такого файла или каталога». Похоже, мне нужно скопировать еще кое-что.

Rob Wilkinson 10.06.2024 09:08

Возможно, вам придется скопировать необходимые общие библиотеки со стадии сборки на стадию без дистрибутива. Общие библиотеки обычно расположены в /usr/local/lib и, возможно, в других каталогах. COPY --from=builder /usr/local/lib /usr/local/lib COPY --from=builder /usr/lib/x86_64-linux-gnu /usr/lib/x86_64-linux-gnu. Каталог /usr/local/lib копируется, чтобы обеспечить включение всех необходимых библиотек, включая libpython3.12.so.1.0. Каталог /usr/lib/x86_64-linux-gnu копируется, чтобы включить любые дополнительные общие библиотеки, которые могут потребоваться. Дайте этому шанс.

helpinghand 10.06.2024 10:18

Добавление вышеуказанной команды копирования устранило проблему. Большое спасибо. Только один последний вопрос. Поскольку мы хотим использовать дистрибутив по соображениям безопасности, является ли python:3.12-slim официальным и безопасным образом?

Rob Wilkinson 10.06.2024 11:47

Да, python:3.12-slim — это официальное изображение, предоставленное Python Software Foundation. Это облегченная версия, которая помогает минимизировать поверхность атаки. Однако для обеспечения безопасности следует следовать рекомендациям, например регулярно обновлять образ, отслеживать уведомления о безопасности и использовать инструменты сканирования безопасности, такие как сканер Docker Hub или Snyk, для выявления и устранения уязвимостей. Соблюдение этих правил гарантирует, что образ останется безопасным выбором для ваших приложений. Вы также можете проверить его официальный статус здесь — hub.docker.com/_/python/…

helpinghand 10.06.2024 12:37

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