Создание небольших сервисов docker grpc с python - PullRequest
0 голосов
/ 25 апреля 2019

Я пытаюсь создать небольшие образы докеров с помощью сервисов grpc на Python.Чтобы получить представление о размере, я создал базовый привет-сервис Python grpc.Чтобы сохранить его «маленьким», я использовал многоэтапную сборку, где я начинаю с python: 3.7-alpine, а затем

1) создаю virtualenv для окончательной установки на python

2) добавить необходимые пакеты сборки для grpc и protobuf

3) скопировать virtualenv в базовую установку

4) скопировать файлы приложения

Файл Docker выглядит следующим образом:

FROM python:3.7-alpine as base

FROM base as builder

RUN adduser -D webuser
WORKDIR /home/webuser

RUN apk add --update \
    gcc \
    g++ \
    make \
    musl-dev \
    python3-dev \
    libc6-compat \  
    && rm -rf /var/cache/apk/*

# create a virtual env
RUN python -m venv env

# install all requirements
RUN env/bin/pip install protobuf grpcio

FROM base

RUN adduser -D webuser
WORKDIR /home/webuser

COPY --from=builder /home/webuser/env/ env/ 

# copy the app files
COPY hello/gen-py/ ./
COPY hello/hello.py ./
COPY boot.sh ./

# make webuser the owner of the main folder
RUN chown -R webuser:webuser ./

# activate webuser
USER webuser

# boot.sh is the executable script that basically runs python
# from the env with the grpc server hello.py
RUN chmod +x boot.sh

EXPOSE 50051

ENTRYPOINT ["./boot.sh"]

По размерам у меня есть:

python:3.7-alpine  87MB
"builder"         396MB
hello_app:latest  188MB

Это все еще очень большое приложение Hello World.Я построил аналогичный в C ++, который составляет всего 12,4 МБ.Я не понимаю несколько вещей с точки зрения размера

Мой env достигает 51,1 МБ, базовый питон - 93,5 МБ (на основе du -sh in / on python: 3.7-alpine. Это неМне понятно, почему это больше, чем 87 МБ, указанный в образе док-станции ls).В общей сложности это 144,6 МБ, но, тем не менее, сообщается, что оно составляет 188 МБ.

Мой главный вопрос: как я могу создавать Python GRPC-сервисы с минимальными издержками?Другие вопросы: Кто-нибудь может объяснить размеры докера?Почему докер сообщает + 100 МБ к базовому образу, когда добавляется только 50 МБ виртуального env.

1 Ответ

3 голосов
/ 25 апреля 2019

Я могу сказать вам, откуда берутся дополнительные 50 МБ. Если вы позвоните docker image history hello_app:latest, вы увидите, что вызов chown создает слой, занимающий около 50 МБ. Очевидно, докер не может сохранить измененного владельца в компактном виде.

Вместо этого используйте флаг --chown для COPY. E.g.:
COPY --chown=webuser:webuser --from=builder /home/webuser/env/ env/.
Таким образом, файлы создаются с правильным владельцем, и вы можете удалить RUN chown ….

...