懵了,构建一个 Docker 镜像花 60 分钟?如何提高效率?

789489dd3b90af8fe5403acaf34f04aa.gif

作者 | Andy

来源 | 进击云原生

最近,有一个需求:向镜像构建管道添加一个参数,以允许用户在构建时配置超时时间。

我们计划在构建时配置 10 分钟的默认超时,并且允许用户覆盖此配置,因为他们的某些镜像构建需要长达 60 分钟才能完成。而且每天都在进行多次构建。

为了便于阅读,我删除了一些内容,Dockerfile 看起来像这样:

FROM ubuntu:focal-20210119
RUN apt-get -y update && \
    apt-get -y upgrade && \
    apt-get install -y --no-install-recommends \
        dos2unix \
        jq \
        libpython3.10 \
        python3-pip \
        software-properties-common \
        tar \
        unzip \
        wget \
        zip && \
    echo "Cleaning up" && \
    rm -rf /var/lib/apt/lists/* && \
    apt-get clean
RUN pip3 install boto3 flask

RUN echo "Installing AWS CLIv2" && \
    TMPDIR=$(mktemp -d) && \
    wget -P $TMPDIR --no-check-certificate "https://awscli.amazonaws.com/awscli-exe-linux-x86_64.zip" && \
    unzip $TMPDIR/awscli-exe-linux-x86_64.zip -d $TMPDIR && \
    $TMPDIR/aws/install && \
    rm -rf /usr/local/aws-cli/v2/dist/awscli/examples/ && \
    rm -rf $TMPDIR
RUN echo "Installing kubectl" && \
    wget -P /usr/bin/ --no-check-certificate https://storage.googleapis.com/kubernetes-release/release/$(wget --no-check-certificate -O -    https://storage.googleapis.com/kubernetes-release/release/stable.txt)/bin/linux/amd64/kubectl && \
    chmod +x /usr/bin/kubectl
# Install the app
COPY dummyapp.py /app/

rebuild 的重点是应用程序更改,而不是对底层依赖项的更改。

由于 Dockerfile 已被精简,现在大约 5 分钟内构建完成。但讲真,这时间仍然很长,因为通常可能只要几秒钟。

这是我构建的部分输出:

# time docker build --no-cache --progress=plain -t test:test .
Sending build context to Docker daemon  3.072kB
Step 1/5 : FROM ubuntu:focal-20210119
 ---> f63181f19b2f
Step 2/5 : RUN apt-get -y update &&     apt-get -y upgrade &&     apt-get install -y --no-install-recommends         dos2unix         jq         libpython3.10         python3-pip         software-properties-common         tar         unzip         wget         zip &&     echo "Cleaning up" &&     rm -rf /var/lib/apt/lists/* &&     apt-get clean
 ---> Running in 37bff266446e
Get:1 http://security.ubuntu.com/ubuntu focal-security InRelease [114 kB]
Get:2 http://security.ubuntu.com/ubuntu focal-security/main amd64 Packages [1470 kB]
<snip>
45400K .......... .......... .......... .......... .......... 99% 2.31M 0s
 45450K .......... .......... .......... .......... ......    100% 8.05M=18s
2022-01-28 19:37:06 (2.40 MB/s) - '/usr/bin/kubectl' saved [46587904/46587904]
Removing intermediate container 86223b438cef
 ---> b8f9a2cc1d9a
Step 6/6 : COPY dummyapp.py /app/
 ---> b95d22cdca6f
Successfully built b95d22cdca6f
Successfully tagged test:test
real    5m11.679s
user    0m1.248s
sys     0m1.961s

怎样才能让这个构建更快?

每次构建这个 Dockerfile 时,都会重复很多处理,其结果不太可能经常改变。

  • 更新 ubuntu 软件包列表

  • 升级 ubuntu 软件包

  • 安装一些额外的软件包

  • 使用 pip3 安装一些 python 包

  • 安装 AWS CLI

  • 安装 kubectl

  • 安装应用程序

还 FROM 一个相当旧的 Ubuntu 版本,需要升级更多的包,因此升级步骤将花费更长的时间。

此镜像的大多数重新 build 的目的是合并应用程序更改(即仅 Dockerfile 中的最后一行)。因此,最明显的变化是将此 Dockerfile 拆分为 2 个(或更多)Dockerfile,并且将 FROM 语句更改为使用最新的 Ubuntu 基础镜像。

第一个 Dockerfile 看起来像这样:

FROM ubuntu:latest
RUN apt-get -y update && \
    apt-get -y upgrade && \
    apt-get install -y --no-install-recommends \
        dos2unix \
        jq \
        libpython3.10 \
        python3-pip \
        software-properties-common \
        tar \
        unzip \
        wget \
        zip && \
    echo "Cleaning up" && \
    rm -rf /var/lib/apt/lists/* && \
    apt-get clean
RUN pip3 install boto3 flask

RUN echo "Installing AWS CLIv2" && \
    TMPDIR=$(mktemp -d) && \
    wget -P $TMPDIR --no-check-certificate "https://awscli.amazonaws.com/awscli-exe-linux-x86_64.zip" && \
    unzip $TMPDIR/awscli-exe-linux-x86_64.zip -d $TMPDIR && \
    $TMPDIR/aws/install && \
    rm -rf /usr/local/aws-cli/v2/dist/awscli/examples/ && \
    rm -rf $TMPDIR
RUN echo "Installing kubectl" && \
    wget -P /usr/bin/ --no-check-certificate https://storage.googleapis.com/kubernetes-release/release/$(wget --no-check-certificate -O -    https://storage.googleapis.com/kubernetes-release/release/stable.txt)/bin/linux/amd64/kubectl && \
    chmod +x /usr/bin/kubectl

第二个 Dockerfile 可能看起来像这样:

FROM dummyapp-dependencies:latest
# Install the app
COPY dummyapp.py /app/

构建第一个 Dockerfile 并没有为我们节省任何时间,虽然需要大约 5 分钟,但只需要相对不频繁地构建第一个 Dockerfile。

然而,构建第二个 Dockerfile 的效果要好得多,只需要大约 2 秒:

# time docker build --no-cache --progress=plain -t tes
t:test -f Dockerfile.app .
Sending build context to Docker daemon   5.12kB
Step 1/2 : FROM dummyapp:1.0.0
pull access denied for dummyapp, repository does not exist or may require 'docker login': denied: requested access to the resource is denied
real    0m2.125s
user    0m0.043s
sys     0m0.030s

鉴于应用程序的更改比底层依赖项更频繁,刚刚节省了大量时间。

775bde6f647542d7b941e2ca42d8bb7a.gif

往期推荐

如何跨 Namespace 同步 Secret 和 ConfigMap?

掘地三尺搞定 Redis 与 MySQL 数据一致性问题

Redis 内存满了怎么办?这样置才正确!

云淘金时代,安全为王!

f0b0382b4d9c24ab3bac334a268237fa.gif

点分享

9fb389763b0ee35bc892c9e57a8825ea.gif

点收藏

d5d4b820db59222e7d514e8032d6c6d3.gif

点点赞

fb5837033725214232369e6ee9456c9e.gif

点在看

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
构建 Docker 镜像时,可以遵循以下原则: 1. 最小化镜像大小:尽量使用基于 Alpine Linux 或其他轻量级的基础镜像,避免将不必要的软件包和文件包含在镜像中。这样可以减小镜像的体积,提高构建和部署的效率。 2. 使用官方镜像或可信源:优先选择官方维护的镜像,因为这些镜像经过了广泛测试和验证,更新频率较高。如果需要使用第三方镜像,确保来源可信、活跃度高,并且有良好的维护记录。 3. 多阶段构建:对于复杂的应用程序,可以使用多阶段构建来减小最终镜像的大小。在第一个阶段构建中,可以使用包含构建工具的完整镜像来编译应用程序,并将编译好的结果复制到第二个阶段的最终镜像中,避免将构建工具包含在最终镜像中。 4. 使用缓存优化构建:在构建过程中,Docker 会使用缓存来提高构建速度。合理地安排构建步骤顺序,并使用适当的缓存指令(如 `COPY`、`ADD`)来最大程度地利用缓存,避免重复下载或编译相同的文件。 5. 清理不必要的文件和依赖:在构建过程中,删除不必要的临时文件、缓存和构建依赖,以减小最终镜像的大小。可以使用 Dockerfile 中的 `RUN` 命令执行清理操作,例如删除下载的软件包、编译时生成的临时文件等。 6. 适当设置容器化配置:在 Dockerfile 中可以通过环境变量、配置文件等方式,将应用程序的配置与镜像分离。这样可以使镜像更通用、更易于配置和管理。 7. 定期更新镜像:定期更新基础镜像和应用程序的依赖,以获取最新的安全补丁和功能更新。可以设置自动化的构建和部署流程,确保镜像和应用程序的持续集成和交付。 这些原则可以帮助您构建高效、安全、可靠的 Docker 镜像,并提升应用程序的开发和部署体验。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值