我想用这个 dockerize python 程序Dockerfile:
FROM python:3.7-alpine
COPY requirements.pip ./requirements.pip
RUN python3 -m pip install --upgrade pip
RUN pip install -U setuptools
RUN apk update
RUN apk add --no-cache --virtual .build-deps gcc python3-dev musl-dev openssl-dev libffi-dev g++ && \
python3 -m pip install -r requirements.pip --no-cache-dir && \
apk --purge del .build-deps
ARG APP_DIR=/app
RUN mkdir -p ${APP_DIR}
WORKDIR ${APP_DIR}
COPY app .
ENTRYPOINT [ "python3", "run.py" ]
这是我的requirements.pip文件:
pysher~=0.5.0
redis~=2.10.6
flake8~=3.5.0
pandas==0.23.4
因为pandas,docker镜像有461MB,没有pandas 131MB。
我在想如何让它更小,所以我从我的应用程序中构建二进制文件:
pyinstaller run.py --onefile
它构建了 38M 的二进制文件。当我运行它时,它工作正常。所以我从以下位置构建 docker 映像Dockerfile:
FROM alpine:3.4
ARG APP_DIR=/app
RUN mkdir -p ${APP_DIR}
WORKDIR ${APP_DIR}
COPY app/dist/run run
ENTRYPOINT [ "/bin/sh", "/app/run" ]
基本上,只是将我的run二进制文件复制到/app目录中。看起来不错,图像只有 48.8MB。当我运行容器时,我收到错误:
$ docker run --rm --name myapp myminimalimage:latest
/app/run: line 1: syntax error: unexpected "("
然后我在想,也许有问题sh,所以我安装了bash,所以我在其中添加了 3 行Dockerfile:
RUN apk update
RUN apk upgrade
RUN apk add bash
图像已构建,但当我运行它时再次出现错误:
$ $ docker run --rm --name myapp myminimalimage:latest
/app/run: /app/run: cannot execute binary file
我的问题:
为什么第一步的图像这么大?我可以以某种方式最小化尺寸吗?喜欢从 pandas 包中选择要安装的内容?
为什么我的二进制文件在我的系统(Kubuntu 18.10)上运行良好但我无法从中运行它alpine:3.4,我应该使用另一个图像还是安装一些东西来运行它?
使用我的应用程序构建简约图像的最佳方法是什么?上面提到的一种还是有其他方法?
慕妹3242003
四季花海
芜湖不芜
随时随地看视频慕课网APP
相关分类