• Docker Buildkit(新增 --mount、--security、--network 等特性)


    BuildKit是Docker官方社区推出的下一代镜像构建神器。
    可以更加快速,有效,安全地构建docker 镜像,自 docker v18.09 版本起已经集成了该组件。

    Buildkit 是下一代 docker 构建组件,拥有众多特性:

    • 自动垃圾收集
    • 可扩展的前端格式
    • 并发依赖项解析
    • 高效的指令缓存
    • 构建缓存导入/导出
    • 嵌套的构建作业调用
    • 可配置的构建底层,包括 OCI (runc)和 containerd,未来将加入更多的构建底层
    • 多种输出格式
    • 可插拔架构
    • 无需 root 权限

    其中增加了一个很实用的新语法 RUN --mount,顾名思义用来文件挂载使用。

    RUN --mount 允许您创建 mount,该 mount 作为构建期间可以访问的一部分。该特性可用于从构建的其他部分绑定文件,而无需复制、访问构建 secrets 或 ssh-agent 套接字,或者创建缓存位置从而加速构建。

    打开 https://docs.docker.com/engine/reference/builder/#syntax 搜索 --mount 有官方详细的说明。

    要特别注意的是,预启用 --mount 语法,需要在 dockerfile 中添加如下魔术注释,确保放在 dockerfile 文件的第一行

    # syntax=docker/dockerfile:1.2
    
    • 1

    更多版本官方地址:https://hub.docker.com/r/docker/dockerfile

    在这里插入图片描述

    注意:就目前版本来讲,–mount 只能挂在已经存在的镜像中的目录或者构建dockerfile的当前上下文目录(from是一个已经存在的镜像的名字),不能挂在宿主机目录。

    示例:

    # syntax=docker/dockerfile:experimental
    FROM centos AS centos
    FROM alpine
    RUN --mount=type=bind,from=centos,source=/,target=/centos ls /centos > /root/centos.txt
    
    • 1
    • 2
    • 3
    • 4

    不提供 from 则默认挂载 dockerfile 当前上下文目录

    关于 --mount=type=cache 的特殊应用:

    –mount 的 cache 类型可以很好的用来解决 maven、npm 等有构建缓存,且希望缓存复用的场景,它可以在多次构建(只要参数 id 相同)过程中读写的文件进行共享,不会因为单次构建后输出的文件丢失,如下为一个示例:

    # syntax=harbor.goodcol.com/dockerhub_proxy/docker/dockerfile:1.4
    FROM harbor.goodcol.com/dockerhub_proxy/library/maven:3.8.6-openjdk-8-slim
    WORKDIR /workspace/
    
    RUN --mount=type=cache,target=/maven-repo,id=maven-repo echo shanhy > /maven-repo2/shanhy1.log && ls /maven-repo2/* > filelist.log
    
    • 1
    • 2
    • 3
    • 4
    • 5

    你可以进行多次build构建,在每次构建时修改一下输出的文件名(例如 shanhy1.log、shanhy2.log、shanhy3.log)看看最后一次构建后的 filelist.log 内容。

    注意这里建议设定 id 参数,因为不提供 id 参数的话,id 的默认值为 target 的值,这样一旦我们以后想修改 taget 路径,就很麻烦。指定 id 后,target 的路径随意修改扔不会影响结果。

    参数--mount=type=cache 参数说明
    idid 设置一个标志,以便区分缓存。
    target(必填项) 缓存的挂载目标文件夹。
    ro,readonly只读,缓存文件夹不能被写入。
    sharing有 sharedprivatelocked 值可供选择。sharing 设置当一个缓存被多次使用时的表现,由于 BuildKit 支持并行构建,当多个步骤使用同一缓存时(同一 id)会发生冲突。shared 表示多个步骤可以同时读写,private 表示当多个步骤使用同一缓存时,每个步骤使用不同的缓存,locked 表示当一个步骤完成释放缓存后,后一个步骤才能继续使用该缓存。
    from缓存来源(构建阶段),不填写时为空文件夹。
    source来源的文件夹路径。

    启用 Buildkit 的方式有两种:

    1、在原来的 docker build 命令之前增加指令,如下所示:

    # 原构建命令
    docker build -f Dockerfile -t test_name .
    
    # 增加DOCKER_BUILDKIT=1后的命令
    DOCKER_BUILDKIT=1 docker build -f Dockerfile -t test_name .
    
    • 1
    • 2
    • 3
    • 4
    • 5

    2、修改 /etc/docker/daemon.json 文件,添加内容如下所示:

    {
      "features": {
        "buildkit" : true
      }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5

    然后重启 docker 服务

    systemctl daemon-reload
    systemctl restart docker
    
    • 1
    • 2

    使用 Buildket 后,命令 docker system df 可以查看到 Build Cache 空间占用,需要清理 Build Cache 空间可以使用 docker builder prune 命令。

    相关参考资料:
    https://github.com/moby/buildkit/blob/master/frontend/dockerfile/docs/reference.md
    https://docs.docker.com/build/buildkit/
    https://blog.51cto.com/u_15127521/2658074
    buildx 资料


    (END)

  • 相关阅读:
    资深大牛纯手写RabbitMQ 核心笔记,还有谁?
    Python图像处理丨基于OpenCV和像素处理的图像灰度化处理
    数据结构-复杂度(一)
    Open3D 点云最小二乘法拟合空间直线
    【Spark NLP】第 9 章:信息提取
    C++算法:最少翻转操作数
    python消消乐 美轮美奂的界面效果【完整源码+详细流程】
    笔试题【day30】
    RestFul和控制器
    聊聊自动驾驶必须解决哪些感知问题?交通标志识别技术详解
  • 原文地址:https://blog.csdn.net/catoop/article/details/127950416