下面这个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是一种用于安装psycopg2C编译器

 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"]

image-20250622162012235

现在来进行Dockerfile的优化,让镜像变得更轻

gcc是一个软件包,唯一的作用是安装psycopg2。一旦安装完成,gcc就是镜像的负担

可以利用多阶段构建将环境安装在虚拟环境,在下一个阶段复制虚拟环境,这样就可以舍弃gcc等构建依赖,也不会将pip install拉下来的缓存放在最终镜像中

还有一个可以优化的点是apt下载的包列表缓存,用于 apt-get updateapt-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"]

image-20250622224642076

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