我可以通过以下简单的操作为我的 python 应用程序生成工作图像Dockerfile
:
FROM python:3.7
WORKDIR /myapp
COPY Pipfile* ./
RUN pip install pipenv
RUN pipenv install --system --deploy
COPY src .
CMD ["python3", "app.py"]
但是,它将生成约 1 GB 的映像,其中可能包含临时文件,并且部署起来很繁重。我只需要完整的 python 图像来构建目的。我的应用程序可以在高山版本上成功运行,因此我可以进行两次传递Dockerfile
:
FROM python:3.7 as builder
COPY Pipfile* ./
RUN pipenv lock --requirements > requirements.txt
RUN python3 -m venv /venv
RUN /venv/bin/pip install --upgrade pip
RUN /venv/bin/pip install -r requirements.txt
FROM python:3.7-alpine
COPY --from=builder /venv /venv
WORKDIR /myapp
COPY src .
CMD ["/venv/bin/python3", "app.py"]
到目前为止一切顺利,它也能工作,尺寸缩小了 6 倍。但这个方案被认为是一些“存根”,有一些缺点:
- 它有不必要的额外
COPY --from=builder
step
- 它不利用
pipenv
但还需要pip
用于安装(+1 个额外步骤,pipenv lock
+pip install
总是比刚刚慢pipenv install
)
- 它不会安装在系统范围内,而是安装到
/venv
,在容器内应避免
- 次要:构建会更多地污染中间图像缓存,并且需要下载两个图像变体。
如何结合这两种方法来获得轻量级的基于高山的图像pipenv
,缺少提到的缺点吗?
或者你能提供你的产品吗Dockerfile
ideas?
当你需要类似的东西时,问题就来了ciso8601
,或一些库,需要构建过程。构建工具没有“合并”到两者中slim
and alpine
变体,用于小尺寸占地面积。
因此要安装 deps,您必须:
- 安装构建工具
- 在系统范围内部署 Pipfile.lock 的依赖项
- 卸载构建工具并清理缓存
并在单个操作中执行 3 个操作RUN
层,如下所示:
FROM python:3.7-slim
WORKDIR /app
# both files are explicitly required!
COPY Pipfile Pipfile.lock ./
RUN pip install pipenv && \
apt-get update && \
apt-get install -y --no-install-recommends gcc python3-dev libssl-dev && \
pipenv install --deploy --system && \
apt-get remove -y gcc python3-dev libssl-dev && \
apt-get autoremove -y && \
pip uninstall pipenv -y
COPY app ./
CMD ["python", "app.py"]
- 操作构建系统将花费您大约 300MiB 和一些额外时间
- 卸载 Pipenv 将另外节省 20MiB(即结果大小的 10%)。
- 分离
RUN
命令不会删除图层中的数据,并且会生成约 500MiB 的图像。这是 docker 的具体情况。
这样就可以完美地生成约 200MiB 大小的图像,即
- 比原来少5倍
python:3.7
,(即 >1.0GiB)
- 没有高山不兼容(这些通常与 glibc 替换有关)
那时,我们很好slim
(Debianbuster
)构建变体,首选slim
over alpine
(对于大多数兼容性)。如果您真的想进一步优化尺寸,我建议您看看这些人的一些出色的构建:
- 高山蟒蛇 https://hub.docker.com/r/jfloff/alpine-python/#why
- 12.7MiB 玛丽亚数据库 https://hub.docker.com/r/jbergstroem/mariadb-alpine/
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)