如何加速Docker构建

Eri*_*mer 8 docker

我正在尝试为我正在处理的项目创建一个Dockerfile.安装所有必需的包apt,pip需要几分钟.由于所需的包不会改变,有没有办法让我可以跳到改变的步骤?

我在OS X上运行Docker CE(版本17.06.2-ce-mac27).

Tar*_*ani 14

是的你可以.创建两个图像

Dockerfile基

FROM python:3.6
RUN pip install selenium
Run Code Online (Sandbox Code Playgroud)

然后使用下面的构建

docker build -f Dockerfile-base -t base .
Run Code Online (Sandbox Code Playgroud)

Dockerfile

FROM base
COPY . .
Run Code Online (Sandbox Code Playgroud)

所以你不会重建基地.并继续处理主Dockerfile.还有其他可能的解决方案,例如部署本地Nexus包管理器并使用它来本地缓存包.但是对于开发人员机器而言需要付出太多努力


Jit*_*ite 6

如果使用docker缓存,则只有在图像更改或上面的图层发生更改时才会重建图像的每个图层.

FROM alpine:latest          # First layer
RUN apk add git gcc         # Second layer
RUN apk add another-package # Third layer
Run Code Online (Sandbox Code Playgroud)

如果更改了第一层或第二层(例如,您将openssl添加到第二行),则将重建第二层和第三层,而不使用缓存.
但是,如果仅更改第三层,则只有该层必须重建,而第一层和第二层是从缓存构建的.
因此,有时您可以将所有应该构建的内容很少移动到文件的顶部,然后让重建的内容经常在其自己的层中进一步向下(即使更多层增加了图像大小).

如果您更愿意将其移动到多个图像中,您绝对可以像Tarun上面所说的那样做.如果只是您希望从一个图像移动到另一个图像的数据(即,未安装的软件包等),您可以检查多阶段构建,这允许您在单个文件中定义多个图像并让它们从中复制数据在文件中之前构建的那个.

要获得有关构建缓存如何工作的更多信息,请查看文档!