使用 python 创建小型 docker grpc 服务
Creating small size docker grpc services with python
我正在尝试在 Python 中使用 grpc 服务创建小的 docker 图像。为了了解大小,我构建了一个基本的 hello-world Python grpc 服务。为了保持它 "small" 我使用了多阶段构建,我从 python:3.7-alpine 开始,然后是
1) 为最终 python 安装创建一个 virtualenv
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.4MB。我不明白尺寸方面的一些事情
我的环境达到 51.1 MB,基本 python 达到 93.5MB(基于 python:3.7-alpine 上的 du -sh。我不清楚为什么会这样大于 docker 图片 ls 中报告的 87MB)。总共是 144.6MB,但仍报告为 188MB。
我的主要问题:如何以尽可能少的开销创建 Python GRPC 服务?
其他问题:任何人都可以解释 docker 尺寸吗?为什么 docker 在仅添加 50MB 虚拟环境时向基本映像报告 +100MB。
我可以告诉你额外的 50MB 是从哪里来的。如果您调用 docker image history hello_app:latest
,您将看到 chown
调用创建了一个消耗大约 50 MB 的图层。显然docker无法以紧凑的方式保存更改的所有者。
改为使用 --chown
标志作为 COPY
。例如:
COPY --chown=webuser:webuser --from=builder /home/webuser/env/ env/
.
通过这种方式,可以使用正确的所有者创建文件,您可以删除 RUN chown …
.
我正在尝试在 Python 中使用 grpc 服务创建小的 docker 图像。为了了解大小,我构建了一个基本的 hello-world Python grpc 服务。为了保持它 "small" 我使用了多阶段构建,我从 python:3.7-alpine 开始,然后是
1) 为最终 python 安装创建一个 virtualenv
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.4MB。我不明白尺寸方面的一些事情
我的环境达到 51.1 MB,基本 python 达到 93.5MB(基于 python:3.7-alpine 上的 du -sh。我不清楚为什么会这样大于 docker 图片 ls 中报告的 87MB)。总共是 144.6MB,但仍报告为 188MB。
我的主要问题:如何以尽可能少的开销创建 Python GRPC 服务? 其他问题:任何人都可以解释 docker 尺寸吗?为什么 docker 在仅添加 50MB 虚拟环境时向基本映像报告 +100MB。
我可以告诉你额外的 50MB 是从哪里来的。如果您调用 docker image history hello_app:latest
,您将看到 chown
调用创建了一个消耗大约 50 MB 的图层。显然docker无法以紧凑的方式保存更改的所有者。
改为使用 --chown
标志作为 COPY
。例如:
COPY --chown=webuser:webuser --from=builder /home/webuser/env/ env/
.
通过这种方式,可以使用正确的所有者创建文件,您可以删除 RUN chown …
.