Я пытаюсь установить некоторые недостающие модули в образ без дистрибутива 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 в образ без дистрибутива, я бы использовал многоэтапную сборку. Сначала я установлю пакеты в обычный образ 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.
Надеюсь, это поможет.
Возможно, вам придется скопировать необходимые общие библиотеки со стадии сборки на стадию без дистрибутива. Общие библиотеки обычно расположены в /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 копируется, чтобы включить любые дополнительные общие библиотеки, которые могут потребоваться. Дайте этому шанс.
Добавление вышеуказанной команды копирования устранило проблему. Большое спасибо. Только один последний вопрос. Поскольку мы хотим использовать дистрибутив по соображениям безопасности, является ли python:3.12-slim официальным и безопасным образом?
Да, python:3.12-slim — это официальное изображение, предоставленное Python Software Foundation. Это облегченная версия, которая помогает минимизировать поверхность атаки. Однако для обеспечения безопасности следует следовать рекомендациям, например регулярно обновлять образ, отслеживать уведомления о безопасности и использовать инструменты сканирования безопасности, такие как сканер Docker Hub или Snyk, для выявления и устранения уязвимостей. Соблюдение этих правил гарантирует, что образ останется безопасным выбором для ваших приложений. Вы также можете проверить его официальный статус здесь — hub.docker.com/_/python/…
Благодарю за ваш ответ. Похоже, это правильный способ установки пакетов в версии без дистрибутива. Я создал изображение, выполнив описанные выше шаги. Единственная проблема заключается в том, что я получаю сообщение об ошибке ниже при попытке запустить контейнер «python3: ошибка при загрузке общих библиотек: libpython3.12.so.1.0: невозможно открыть общий объектный файл: нет такого файла или каталога». Похоже, мне нужно скопировать еще кое-что.