下面这个Dockerfile是程序原本的Dockerfile
1
2
3
4
5
6
7
8
9
10
11
|
FROM python:3.10-slim-buster
WORKDIR /app
COPY requirements.txt requirements.txt
RUN pip3 install -r requirements.txt -i https://pypi.tuna.tsinghua.edu.cn/simple --no-cache-dir \
&& pip3 install torch==2.3.1+cpu --no-cache-dir -f https://download.pytorch.org/whl/torch_stable.html
COPY . .
CMD ["python3", "main.py", "web"]
|
现在要在镜像中安装psycopg2
来使用postgresql
使用slim版本的python,直接安装psycopg2
会报错,需要安装psycopg2
所需的安装包。虽然python镜像表明只提供python,但其实是有一个源自Debian的超轻量级系统在后台运行,因此可以使用linux命令来安装我们需要的软件包:libpq-dev
,这是用于与postgresql
数据库和gcc
交互的轻量级软件包,gcc
是一种用于安装psycopg2
的C
编译器
1
2
3
4
5
6
7
8
9
10
11
12
13
14
|
FROM python:3.10-slim-buster
WORKDIR /app
RUN apt-get update && apt-get install -y \
libpq-dev \
gcc
COPY requirements.txt requirements.txt
RUN pip3 install -r requirements.txt -i https://pypi.tuna.tsinghua.edu.cn/simple --no-cache-dir \
&& pip3 install torch==2.3.1+cpu --no-cache-dir -f https://download.pytorch.org/whl/torch_stable.html
COPY . .
CMD ["python3", "main.py", "web"]
|

现在来进行Dockerfile
的优化,让镜像变得更轻
gcc
是一个软件包,唯一的作用是安装psycopg2
。一旦安装完成,gcc
就是镜像的负担
可以利用多阶段构建将环境安装在虚拟环境,在下一个阶段复制虚拟环境,这样就可以舍弃gcc
等构建依赖,也不会将pip install拉下来的缓存放在最终镜像中
还有一个可以优化的点是apt下载的包列表缓存,用于 apt-get update
和 apt-get install
时的依赖解析。安装完成之后,缓存也就没用了,可以使用rm -rf /var/lib/apt/lists/*
删除,下面是最终的Dockerfile
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
|
FROM python:3.10-slim-buster AS builder
RUN apt-get update && apt-get install -y \
libpq-dev \
gcc && \
rm -rf /var/lib/apt/lists/*
RUN python -m venv /opt/venv
ENV PATH="/opt/venv/bin:$PATH"
COPY requirements.txt requirements.txt
RUN pip3 install -r requirements.txt -i https://pypi.tuna.tsinghua.edu.cn/simple --no-cache-dir \
&& pip3 install torch==2.3.1+cpu --no-cache-dir -f https://download.pytorch.org/whl/torch_stable.html
FROM python:3.10-slim-buster
WORKDIR /app
RUN apt-get update && apt-get install -y \
libpq-dev && \
rm -rf /var/lib/apt/lists/*
COPY --from=builder /opt/venv /opt/venv
ENV PATH="/opt/venv/bin:$PATH"
#COPY放在下面,docker构建缓存机制,变化频率最高的放在最后,避免重复复制等操作
COPY . .
CMD ["python3","main.py","web"]
|

ref:https://wbarillon.medium.com/docker-python-image-with-psycopg2-installed-c10afa228016