Многоступенчатый dockerfile: как установить без аргумента —user pip3?

#python #docker

#python #docker

Вопрос:

Я новичок в docker, и я не совсем уверен, почему это работает.

Я попытался написать свой dockerfile без --user аргумента, предоставленного pip3 для установки моего requirements.txt файла, но по какой-то причине копирование результатов настройки из ${INSTALL} каталога в ${APP} каталог у меня не работает.

Как я могу написать это так, чтобы мне не нужно было полагаться на --user аргумент, предоставленный pip3 ?

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

Я создаю образ с помощью этой команды:

 docker image build --no-cache -t apptest .
  

Dockerfile

 FROM python:3.8-alpine as base
ENV APP="/app"
ENV INSTALL="/install"
ENV LOC="/root/.local"
ENV LOCBIN="${LOC}/bin"
ENV PATH $PATH:${LOC}:${LOCBIN}

FROM base as builder
WORKDIR ${INSTALL}

COPY ./requirements.txt requirements.txt

#install all dependencies
RUN apk add --no-cache curl python3 pkgconfig python3-dev openssl-dev libffi-dev musl-dev make gcc
RUN pip3 install --user --no-cache-dir -r requirements.txt

FROM base

COPY --from=builder ${LOC} ${LOC}
COPY --from=builder ${LOCBIN} ${LOCBIN}
COPY ./src/ ${APP}
COPY ./src/Cogs/ ${APP}/Cogs
COPY ./src/Documentation/ ${APP}/Documentation
COPY ./src/Models/ ${APP}/Models
COPY ./src/OneNight/ ${APP}/OneNight

WORKDIR ${APP}

#start the service
ENTRYPOINT [ "python3", "service.py" ]
  

Ответ №1:

  1. Когда вы устанавливаете пакеты Python, код распространяется повсюду. Например, библиотеки попадают в пакеты сайта, скрипты попадают в bin / и т. Д.. Итак, вам нужно установить все в одном месте, чтобы упростить копирование. Ваши варианты — --user или virtualenv, в основном, или копирование множества разных каталогов. Смотрите https://pythonspeed.com/articles/multi-stage-docker-python /

  2. При этом вам может не понадобиться многоступенчатая сборка. Вы хотите его здесь, потому что используете компилятор. Но вам может понадобиться только компилятор, потому что вы используете Alpine Linux. Для обычных дистрибутивов Linux большинство пакетов Python имеют двоичные предварительно скомпилированные диски в PyPI, поэтому большую часть времени вам вообще не нужен компилятор.

Вполне возможно, что переключение на базовый образ на основе Debian ( python:3.8-slim-buster ) может позволить вам просто установить все без компилятора. Смотрите https://pythonspeed.com/articles/alpine-docker-python /

Комментарии:

1. Спасибо за понимание. Я просто продолжу использовать —user, поскольку не похоже, что есть разумный способ обойти это. Что касается многоступенчатой сборки, я попробовал ее с использованием образа на основе debian, и размер в 2 раза больше (162 МБ), но, в конце концов, я думаю, это того стоит, учитывая, что время сборки значительно сократилось.