- Docker 简介
- 什么是 Docker
- 为什么要用 Docker
- 基本概念
- 镜像
- 容器
- 仓库
- 安装 Docker
- Ubuntu
- Debian
- Fedora
- CentOS
- Raspberry Pi
- macOS 安装 Docker Desktop CE
- Windows 10
- 镜像加速器
- 使用镜像
- 获取镜像
- 列出镜像
- 删除本地镜像
- 利用 commit 理解镜像构成
- 使用 Dockerfile 定制镜像
- Dockerfile 指令详解
- COPY 复制文件
- ADD 更高级的复制文件
- CMD 容器启动命令
- ENTRYPOINT 入口点
- ENV 设置环境变量
- ARG 构建参数
- VOLUME 定义匿名卷
- EXPOSE 暴露端口
- WORKDIR 指定工作目录
- USER 指定当前用户
- HEALTHCHECK 健康检查
- ONBUILD 为他人作嫁衣裳
- 参考文档
- Dockerfile 多阶段构建
- 实战多阶段构建 Laravel 镜像
- 构建多种系统架构支持的 Docker 镜像
- 使用 buildx 构建多种系统架构支持的 Docker 镜像
- Docker v18.09 版本使用 BuildKit 构建镜像
- Docker v19.03 版本使用 BuildKit 构建镜像
- 其它制作镜像的方式
- 实现原理
- 操作容器
- 启动
- 守护态运行
- 终止
- 进入容器
- 导出和导入
- 删除
- 访问仓库
- Docker Hub
- 私有仓库
- 私有仓库高级配置
- Nexus 3
- 数据管理
- 数据卷
- 挂载主机目录
- 使用网络
- 外部访问容器
- 容器互联
- 配置 DNS
- 高级网络配置
- 快速配置指南
- 容器访问控制
- 端口映射实现
- 配置 docker0 网桥
- 自定义网桥
- 工具和示例
- 编辑网络配置文件
- 实例:创建一个点到点连接
- Docker Compose
- 简介
- 安装与卸载
- 使用
- 命令说明
- Compose 模板文件
- 实战 Django
- 实战 Rails
- 实战 WordPress
- Swarm mode
- 基本概念
- 创建 Swarm 集群
- 部署服务
- 使用 compose 文件
- 管理密钥
- 管理配置信息
- 滚动升级
- 安全
- 内核命名空间
- 控制组
- 服务端防护
- 内核能力机制
- 其它安全特性
- 总结
- 底层实现
- 基本架构
- 命名空间
- 控制组
- 联合文件系统
- 容器格式
- 网络
- Etcd 项目
- 简介
- 安装
- 集群
- 使用 etcdctl
- CoreOS 项目
- 简介
- 工具
- Kubernetes 项目
- 简介
- 快速上手
- 基本概念
- kubectl 使用
- 架构设计
- 容器与云计算
- 简介
- 亚马逊云
- 腾讯云
- 阿里云
- 小结
- 实战案例-操作系统
- Busybox
- Alpine
- Debian Ubuntu
- CentOS Fedora
- 本章小结
- 实战案例-CI/CD
- GitHub Actions
- Drone
- 部署 Drone
- Travis CI
- Docker 开源项目
- LinuxKit
- 附录
- 附录一:常见问题总结
- 附录二:热门镜像介绍
- Ubuntu
- CentOS
- Nginx
- PHP
- Node.js
- MySQL
- WordPress
- MongoDB
- Redis
- 附录三:Docker 命令查询
- 附录四:Dockerfile 最佳实践
- 附录五:如何调试 Docker
- 附录六:资源链接
- 归档
- Mesos - 优秀的集群资源调度平台
- Mesos 简介
- 安装与使用
- 原理与架构
- Mesos 配置项解析
- 日志与监控
- 常见应用框架
- 本章小结
- Docker Machine
- 安装
- 使用
- Docker Swarm
Docker v19.03 版本使用 BuildKit 构建镜像
使用 Buildx
构建镜像
BuildKit 是下一代的镜像构建组件,在 https://github.com/moby/buildkit 开源。
注意:如果您的镜像构建使用的是云服务商提供的镜像构建服务(Docker Hub 自动构建、腾讯云容器服务、阿里云容器服务等),由于上述服务提供商的 Docker 版本低于 18.09,BuildKit 无法使用,将造成镜像构建失败。建议使用 BuildKit 构建镜像时使用一个新的 Dockerfile 文件(例如 Dockerfile.buildkit)
下面介绍如何在 Docker CE 19.03+ 版本中使用 BuildKit
提供的 Dockerfile
新指令来更快、更安全的构建 Docker 镜像。
Dockerfile
新增指令详解
启用 BuildKit
之后,我们可以使用下面几个新的指令来加快镜像构建。为了使用 BuildKit
我们 必须 使用新的 $ docker buildx build
命令来构建 Docker 镜像。
RUN --mount=type=cache
目前,几乎所有的程序都会使用依赖管理工具,例如 Go
中的 go mod
、Node.js
中的 npm
等等,当我们构建一个镜像时,往往会重复的从互联网中获取依赖包,难以缓存,大大降低了镜像的构建效率。
例如一个前端工程需要用到 npm
:
FROM node:alpine as builderWORKDIR /appCOPY package.json /app/RUN npm i --registry=https://registry.npm.taobao.org \ && rm -rf ~/.npmCOPY src /app/srcRUN npm run buildFROM nginx:alpineCOPY --from=builder /app/dist /app/dist
使用多阶段构建,构建的镜像中只包含了目标文件夹 dist
,但仍然存在一些问题,当 package.json
文件变动时,RUN npm i && rm -rf ~/.npm
这一层会重新执行,变更多次后,生成了大量的中间层镜像。
为解决这个问题,进一步的我们可以设想一个类似 数据卷 的功能,在镜像构建时把 node_modules
文件夹挂载上去,在构建完成后,这个 node_modules
文件夹会自动卸载,实际的镜像中并不包含 node_modules
这个文件夹,这样我们就省去了每次获取依赖的时间,大大增加了镜像构建效率,同时也避免了生成了大量的中间层镜像。
BuildKit
提供了 RUN --mount=type=cache
指令,可以实现上边的设想。
FROM node:alpine as builderWORKDIR /appCOPY package.json /app/RUN --mount=type=cache,target=/app/node_modules,id=my_app_npm_module,sharing=locked \ --mount=type=cache,target=/root/.npm,id=npm_cache \ npm i --registry=https://registry.npm.taobao.orgCOPY src /app/srcRUN --mount=type=cache,target=/app/node_modules,id=my_app_npm_module,sharing=locked \# --mount=type=cache,target=/app/dist,id=my_app_dist,sharing=locked \ npm run buildFROM nginx:alpine# COPY --from=builder /app/dist /app/dist# 为了更直观的说明 from 和 source 指令,这里使用 RUN 指令RUN --mount=type=cache,target=/tmp/dist,from=builder,source=/app/dist \ # --mount=type=cache,target/tmp/dist,from=my_app_dist,sharing=locked \ mkdir -p /app/dist && cp -r /tmp/dist/* /app/dist
第一个 RUN
指令执行后,id
为 my_app_npm_module
的缓存文件夹挂载到了 /app/node_modules
文件夹中。多次执行也不会产生多个中间层镜像。
第二个 RUN
指令执行时需要用到 node_modules
文件夹,node_modules
已经挂载,命令也可以正确执行。
第三个 RUN
指令将上一阶段产生的文件复制到指定位置,from
指明缓存的来源,这里 builder
表示缓存来源于构建的第一阶段,source
指明缓存来源的文件夹。
上面的 Dockerfile
中 --mount=type=cache,...
中指令作用如下:
Option | Description |
---|---|
id | id 设置一个标志,以便区分缓存。 |
target (必填项) | 缓存的挂载目标文件夹。 |
ro ,readonly | 只读,缓存文件夹不能被写入。 |
sharing | 有 shared private locked 值可供选择。sharing 设置当一个缓存被多次使用时的表现,由于 BuildKit 支持并行构建,当多个步骤使用同一缓存时(同一 id )会发生冲突。shared 表示多个步骤可以同时读写,private 表示当多个步骤使用同一缓存时,每个步骤使用不同的缓存,locked 表示当一个步骤完成释放缓存后,后一个步骤才能继续使用该缓存。 |
from | 缓存来源(构建阶段),不填写时为空文件夹。 |
source | 来源的文件夹路径。 |
RUN --mount=type=bind
该指令可以将一个镜像(或上一构建阶段)的文件挂载到指定位置。
RUN --mount=type=bind,from=php:alpine,source=/usr/local/bin/docker-php-entrypoint,target=/docker-php-entrypoint \ cat /docker-php-entrypoint
RUN --mount=type=tmpfs
该指令可以将一个 tmpfs
文件系统挂载到指定位置。
RUN --mount=type=tmpfs,target=/temp \ mount | grep /temp
RUN --mount=type=secret
该指令可以将一个文件挂载到指定位置。
RUN --mount=type=secret,id=aws,target=/root/.aws/credentials \ cat /root/.aws/credentials
$ docker buildx build -t test --secret id=aws,src=$HOME/.aws/credentials .
RUN --mount=type=ssh
该指令可以挂载 ssh
密钥。
FROM alpineRUN apk add --no-cache openssh-clientRUN mkdir -p -m 0700 ~/.ssh && ssh-keyscan gitlab.com >> ~/.ssh/known_hostsRUN --mount=type=ssh ssh git@gitlab.com | tee /hello
$ eval $(ssh-agent)$ ssh-add ~/.ssh/id_rsa(Input your passphrase here)$ docker buildx build -t test --ssh default=$SSH_AUTH_SOCK .
清理构建缓存
执行以下命令清理构建缓存
$ docker builder prune
官方文档
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论