带有 psycopg2 的轻型 Alpline docker 容器
Light Alpline docker container with psycopg2
我有一些 运行 python 3.7 和 flask 的服务,只需要一些额外的库。其中之一是能够连接到 postgres 的 psycopg2。
就其本身而言,在 alpine 中安装 psycopg2 并不是一项非常困难的任务,但我在查找有关此事的文档时遇到了一些问题。我设法获得了 运行 没问题的 dockerfile。最大的缺点是它大约355MB,而且太重了。
这是我在任何优化之前的初始 dockerfile:
FROM python:3.7-alpine
ENV PATH /usr/local/bin:$PATH
ENV LANG C.UTF-8
RUN mkdir -p /usr/src/app
COPY requirements.txt /usr/src/app/
RUN apk update \
&& apk add postgresql-dev \
&& apk add --virtual temp1 gcc python3-dev musl-dev \
&& pip install --upgrade pip \
&& pip install psycopg2==2.8.4
RUN pip install -r /usr/src/app/requirements.txt
RUN apk del temp1
COPY . /usr/src/app
WORKDIR /usr/src/app
EXPOSE 6000
ENTRYPOINT ["python3"]
CMD ["-m", "server"]
还有我的requirements.txt
psycopg2 == 2.8.4
connexion == 1.1.15
python_dateutil == 2.6.0
loguru~=0.4.1
flask~=1.1.2
six~=1.14.0
Werkzeug==0.16.1
pymongo
PyYAML == 5.3
setuptools == 45.1.0
flask_testing == 0.7.1
mo-future>=3
pyparsing==2.3.1
mo_files
pycryptodomex
ldap3
做一些测试,我发现增加图像尺寸最多的步骤是:
- 正在安装 psycopg2 和 postgresql-dev:220MB 仅被这两个使用
- 安装要求:最多 60MB
- 升级 pip:将 15MB 添加到最终图像
我为减小其大小而尝试做的事情:
- 安装 postgresql-dev 作为构建依赖项,并在构建 psycopg2 后将其从映像中删除。删除 postgresql-dev 会引发错误,其中找不到文件 libpq.so.5。
- 删除升级 pip 语句。它不是工作所必需的,但我想让它保持最新
我将尝试回答这些问题:
- 首先如何安装psycopg2才不会浪费那么多space
- 关于容器的space减少和安全性,我应该应用于我的 dockerfile 的任何最佳实践
减少 psycopg2 安装大小
我想做的第一件事是从容器中删除 postgresql-dev 并且仍然能够使用 psycopg2。唯一似乎丢失的文件是 libpq.so.5。该文件在可用的高山包 libpq 中可用 here.
这样我们就可以构建 psycopg2 并且仍然保存它之前使用的几乎所有 space。
提高docker文件的步骤效率
我尽量减少 docker 文件中的步骤数,以便最终图像更亮。向 pip 和 apk 添加适当的标志,我们可以减少用于缓存的 space 的数量。此外,声明一个用于对所有构建依赖项进行分组的变量可以使事情变得更清晰。
另外我定义了一个写得比较仔细的。docker忽略更省事space。使用 tree 等工具可以帮助您在容器中找到不需要的文件。
添加基本安全性
基于 this fine article,我能够为我的容器指定一个没有修改容器能力的用户。
最终版本
这是我最终得到的 docker 文件。它从 355MB 下降到 135MB,虽然不是很完美,但是好多了。
FROM python:3.7-alpine
ENV PATH /usr/local/bin:$PATH
ENV LANG C.UTF-8
ENV USER=prodUser UID=12345 GID=23456
RUN mkdir -p /usr/src/app
COPY requirements.txt /usr/src/app/
RUN buildDeps='gcc python3-dev musl-dev postgresql-dev' \
&& apk update \
&& apk add --no-cache libpq \
&& apk add --virtual temp1 --no-cache $buildDeps \
&& pip install --no-cache-dir -r /usr/src/app/requirements.txt \
&& apk del temp1
COPY . /usr/src/app
WORKDIR /usr/src/app
RUN addgroup --gid "$GID" "$USER" \
&& adduser \
--disabled-password \
--gecos "" \
--ingroup "$USER" \
--uid "$UID" \
"$USER"
USER $USER
EXPOSE 6000
ENTRYPOINT ["python3"]
CMD ["-m", "server"]
后续步骤
- 正如前面提到的文章所建议的,我将对 gunicorn 和 gnix 进行一些研究以用于生产目的。
- 我将对 requirements.txt 文件安装的推荐包进行一些测试,并尝试删除我不需要的包。
- 我可以尝试进一步减少 docker 文件
中定义的步骤数
最后的笔记
我在使用 docker 方面还是个新手,所以欢迎您提出任何建议或更改!
我有一些 运行 python 3.7 和 flask 的服务,只需要一些额外的库。其中之一是能够连接到 postgres 的 psycopg2。
就其本身而言,在 alpine 中安装 psycopg2 并不是一项非常困难的任务,但我在查找有关此事的文档时遇到了一些问题。我设法获得了 运行 没问题的 dockerfile。最大的缺点是它大约355MB,而且太重了。
这是我在任何优化之前的初始 dockerfile:
FROM python:3.7-alpine
ENV PATH /usr/local/bin:$PATH
ENV LANG C.UTF-8
RUN mkdir -p /usr/src/app
COPY requirements.txt /usr/src/app/
RUN apk update \
&& apk add postgresql-dev \
&& apk add --virtual temp1 gcc python3-dev musl-dev \
&& pip install --upgrade pip \
&& pip install psycopg2==2.8.4
RUN pip install -r /usr/src/app/requirements.txt
RUN apk del temp1
COPY . /usr/src/app
WORKDIR /usr/src/app
EXPOSE 6000
ENTRYPOINT ["python3"]
CMD ["-m", "server"]
还有我的requirements.txt
psycopg2 == 2.8.4
connexion == 1.1.15
python_dateutil == 2.6.0
loguru~=0.4.1
flask~=1.1.2
six~=1.14.0
Werkzeug==0.16.1
pymongo
PyYAML == 5.3
setuptools == 45.1.0
flask_testing == 0.7.1
mo-future>=3
pyparsing==2.3.1
mo_files
pycryptodomex
ldap3
做一些测试,我发现增加图像尺寸最多的步骤是:
- 正在安装 psycopg2 和 postgresql-dev:220MB 仅被这两个使用
- 安装要求:最多 60MB
- 升级 pip:将 15MB 添加到最终图像
我为减小其大小而尝试做的事情:
- 安装 postgresql-dev 作为构建依赖项,并在构建 psycopg2 后将其从映像中删除。删除 postgresql-dev 会引发错误,其中找不到文件 libpq.so.5。
- 删除升级 pip 语句。它不是工作所必需的,但我想让它保持最新
我将尝试回答这些问题:
- 首先如何安装psycopg2才不会浪费那么多space
- 关于容器的space减少和安全性,我应该应用于我的 dockerfile 的任何最佳实践
减少 psycopg2 安装大小
我想做的第一件事是从容器中删除 postgresql-dev 并且仍然能够使用 psycopg2。唯一似乎丢失的文件是 libpq.so.5。该文件在可用的高山包 libpq 中可用 here.
这样我们就可以构建 psycopg2 并且仍然保存它之前使用的几乎所有 space。
提高docker文件的步骤效率
我尽量减少 docker 文件中的步骤数,以便最终图像更亮。向 pip 和 apk 添加适当的标志,我们可以减少用于缓存的 space 的数量。此外,声明一个用于对所有构建依赖项进行分组的变量可以使事情变得更清晰。
另外我定义了一个写得比较仔细的。docker忽略更省事space。使用 tree 等工具可以帮助您在容器中找到不需要的文件。
添加基本安全性
基于 this fine article,我能够为我的容器指定一个没有修改容器能力的用户。
最终版本
这是我最终得到的 docker 文件。它从 355MB 下降到 135MB,虽然不是很完美,但是好多了。
FROM python:3.7-alpine
ENV PATH /usr/local/bin:$PATH
ENV LANG C.UTF-8
ENV USER=prodUser UID=12345 GID=23456
RUN mkdir -p /usr/src/app
COPY requirements.txt /usr/src/app/
RUN buildDeps='gcc python3-dev musl-dev postgresql-dev' \
&& apk update \
&& apk add --no-cache libpq \
&& apk add --virtual temp1 --no-cache $buildDeps \
&& pip install --no-cache-dir -r /usr/src/app/requirements.txt \
&& apk del temp1
COPY . /usr/src/app
WORKDIR /usr/src/app
RUN addgroup --gid "$GID" "$USER" \
&& adduser \
--disabled-password \
--gecos "" \
--ingroup "$USER" \
--uid "$UID" \
"$USER"
USER $USER
EXPOSE 6000
ENTRYPOINT ["python3"]
CMD ["-m", "server"]
后续步骤
- 正如前面提到的文章所建议的,我将对 gunicorn 和 gnix 进行一些研究以用于生产目的。
- 我将对 requirements.txt 文件安装的推荐包进行一些测试,并尝试删除我不需要的包。
- 我可以尝试进一步减少 docker 文件 中定义的步骤数
最后的笔记
我在使用 docker 方面还是个新手,所以欢迎您提出任何建议或更改!