Docker化Django应用本地构建耗时过长问题排查求助
解决Docker构建Django应用耗时过长的方案
核心问题分析
构建慢的主要原因是Alpine镜像下编译psycopg2耗时极长,加上Dockerfile构建缓存利用不合理,导致每次修改代码都要重新执行依赖安装步骤。
具体优化方案
1. 替换psycopg2为预编译包
将requirements.txt中的psycopg2 == 2.9.7替换为psycopg2-binary == 2.9.7,跳过编译过程:
Django == 4.2.4 djangorestframework == 3.14.0 psycopg2-binary == 2.9.7 drf_spectacular == 0.26.4
2. 优化Dockerfile构建缓存顺序
调整文件复制顺序,让依赖安装步骤能复用缓存,只有当requirements文件变化时才重新安装依赖:
FROM python:3-alpine LABEL maintainer="joyalcs2@gmail.com" ENV PYTHONUNBUFFERED=1 # 先复制requirements文件,优先利用缓存 COPY ./requirements.txt /tmp/requirements.txt COPY ./requirements.dev.txt /tmp/requirements.dev.txt ARG DEV=false RUN python -m venv /py && \ apk add --update --no-cache postgresql-client && \ apk add --update --no-cache --virtual .tmp-build-deps \ build-base postgresql-dev musl-dev && \ /py/bin/pip install --upgrade pip && \ /py/bin/pip install -r /tmp/requirements.txt && \ if [ $DEV = "true" ]; \ then /py/bin/pip install -r /tmp/requirements.dev.txt; \ fi && \ rm -rf /tmp && \ apk del .tmp-build-deps && \ adduser \ --disabled-password \ --no-create-home \ django-user # 最后复制应用代码,代码变化不影响依赖缓存 COPY ./app /app WORKDIR /app EXPOSE 8000 ENV PATH="/py/bin:$PATH" USER django-user
注:增加apk del .tmp-build-deps清理构建依赖,同时减小镜像体积
3. 替换为Debian基础镜像(可选,进一步提速)
Alpine的musl libc会导致很多Python包需要编译,换成python:3.11-slim(Debian基础),预编译包支持更好,安装速度更快:
FROM python:3.11-slim LABEL maintainer="joyalcs2@gmail.com" ENV PYTHONUNBUFFERED=1 COPY ./requirements.txt /tmp/requirements.txt COPY ./requirements.dev.txt /tmp/requirements.dev.txt ARG DEV=false RUN python -m venv /py && \ apt-get update && \ apt-get install -y --no-install-recommends postgresql-client && \ apt-get install -y --no-install-recommends build-essential libpq-dev && \ /py/bin/pip install --upgrade pip && \ /py/bin/pip install -r /tmp/requirements.txt && \ if [ $DEV = "true" ]; \ then /py/bin/pip install -r /tmp/requirements.dev.txt; \ fi && \ rm -rf /tmp && \ apt-get purge -y --auto-remove build-essential libpq-dev && \ rm -rf /var/lib/apt/lists/* && \ useradd --create-home --shell /bin/bash django-user COPY ./app /app WORKDIR /app EXPOSE 8000 ENV PATH="/py/bin:$PATH" USER django-user
内容的提问来源于stack exchange,提问作者joyal
相关产品推荐
相关产品推荐

