仅复制2个配置文件且挂载所有代码时如何加速Docker构建?
Docker构建Odoo镜像速度慢优化方案
核心问题原因
你当前每次构建都需要全量执行步骤耗时久,是因为Docker层缓存未命中,结合你提供的Dockerfile,具体触发点如下:
RUN pip3 install --upgrade pip未指定固定版本,每次执行都会检查最新版本,容易触发缓存失效,后续所有步骤都会跟着重跑- apt更新和安装操作没有合并,每次重跑都要重新拉取软件源索引,同时遗留大量缓存文件增大镜像体积
- pip安装时使用
--ignore-installed参数强制全量重装所有依赖,哪怕依赖已经存在于基础镜像中,也会重新下载编译,耗费大量时间 - 指令顺序不合理,配置文件、依赖文件的复制位置靠前,若有相关变动会触发后续所有步骤重跑;若未配置
.dockerignore,构建上下文的冗余文件也可能导致COPY步骤缓存失效 - 系统包安装步骤放在pip依赖安装之后,只要pip相关步骤缓存失效,系统包也要跟着重新安装
优化方案
1. 调整Dockerfile指令顺序,优化安装逻辑
遵循变动频率越低的指令越靠前的原则,把系统安装、pip版本升级等不易变动的步骤放在最前面,依赖安装、配置复制等易变动步骤靠后,最大化利用Docker层缓存。同时将--ignore-installed参数的作用范围缩小到仅冲突的docutils包,避免全量重装依赖。
优化后Dockerfile参考:
FROM odoo:14.0@sha256:04384b61e1ef32f4814c443599bb8252c368270ce9c3f86e368c6510396c291e USER root # 合并系统包安装操作,安装完成后清理缓存,减少镜像体积同时保证层可缓存 RUN apt-get update && apt-get install -y --no-install-recommends htop vim \ && rm -rf /var/lib/apt/lists/* # 指定固定pip版本升级,避免每次检查最新版本导致缓存失效 RUN pip3 install --upgrade pip==23.3.1 # 仅复制依赖声明文件,只要requirements.txt不变,这层和后续pip安装层都会命中缓存 COPY ./requirements.txt /etc/odoo/ # 仅对冲突的docutils包单独忽略安装,其余依赖复用已有版本,避免全量重装 RUN pip3 install --ignore-installed docutils -r /etc/odoo/requirements.txt # 配置文件放在最后,修改配置不会触发前面的依赖、系统包安装步骤重跑 COPY ./odoo.conf /etc/odoo/ RUN chown www-data /etc/odoo/odoo.conf
2. 添加上下文过滤规则
在你执行docker build的目录下新建.dockerignore文件,过滤不需要进入构建上下文的冗余文件,避免无关文件变动导致COPY步骤缓存失效:
# 先排除所有文件 * # 仅保留构建必需的文件 !requirements.txt !odoo.conf
3. 额外加速技巧
- 国内服务器可在pip安装命令后添加国内PyPI源参数,大幅提升依赖下载速度,示例:
pip3 install --ignore-installed docutils -r /etc/odoo/requirements.txt -i https://pypi.tuna.tsinghua.edu.cn/simple - 开启Docker BuildKit构建缓存,执行构建命令时添加参数:
DOCKER_BUILDKIT=1 docker build .
内容的提问来源于stack exchange,提问作者tom10271
相关产品推荐
相关产品推荐

