#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:
-
Когда вы устанавливаете пакеты Python, код распространяется повсюду. Например, библиотеки попадают в пакеты сайта, скрипты попадают в bin / и т. Д.. Итак, вам нужно установить все в одном месте, чтобы упростить копирование. Ваши варианты —
--user
или virtualenv, в основном, или копирование множества разных каталогов. Смотрите https://pythonspeed.com/articles/multi-stage-docker-python / -
При этом вам может не понадобиться многоступенчатая сборка. Вы хотите его здесь, потому что используете компилятор. Но вам может понадобиться только компилятор, потому что вы используете Alpine Linux. Для обычных дистрибутивов Linux большинство пакетов Python имеют двоичные предварительно скомпилированные диски в PyPI, поэтому большую часть времени вам вообще не нужен компилятор.
Вполне возможно, что переключение на базовый образ на основе Debian ( python:3.8-slim-buster
) может позволить вам просто установить все без компилятора. Смотрите https://pythonspeed.com/articles/alpine-docker-python /
Комментарии:
1. Спасибо за понимание. Я просто продолжу использовать —user, поскольку не похоже, что есть разумный способ обойти это. Что касается многоступенчатой сборки, я попробовал ее с использованием образа на основе debian, и размер в 2 раза больше (162 МБ), но, в конце концов, я думаю, это того стоит, учитывая, что время сборки значительно сократилось.