原材料价格查询网站,有什么做衣服的网站吗,织梦做淘宝客网站视频,佛山便宜网站建设作者主页#xff1a; 正函数的个人主页 文章收录专栏#xff1a; Docker 欢迎大家点赞 #x1f44d; 收藏 ⭐ 加关注哦#xff01; Docker Buildx
Docker Buildx 是一个 docker CLI 插件#xff0c;其扩展了 docker 命令#xff0c;支持 [Moby BuildKit] 提供的功能。提… 作者主页 正函数的个人主页 文章收录专栏 Docker 欢迎大家点赞 收藏 ⭐ 加关注哦 Docker Buildx
Docker Buildx 是一个 docker CLI 插件其扩展了 docker 命令支持 [Moby BuildKit] 提供的功能。提供了与 docker build 相同的用户体验并增加了许多新功能。 该功能仅适用于 Docker v19.03 版本 一、使用 BuildKit 构建镜像
BuildKit 是下一代的镜像构建组件在 https://github.com/moby/buildkit 开源。
注意如果您的镜像构建使用的是云服务商提供的镜像构建服务腾讯云容器服务、阿里云容器服务等由于上述服务提供商的 Docker 版本低于 18.09BuildKit 无法使用将造成镜像构建失败。建议使用 BuildKit 构建镜像时使用一个新的 Dockerfile 文件例如 Dockerfile.buildkit
目前Docker Hub 自动构建已经支持 buildkit具体请参考 https://github.com/docker-practice/docker-hub-buildx
Dockerfile 新增指令详解
启用 BuildKit 之后我们可以使用下面几个新的 Dockerfile 指令来加快镜像构建。
RUN --mounttypecache
目前几乎所有的程序都会使用依赖管理工具例如 Go 中的 go mod、Node.js 中的 npm 等等当我们构建一个镜像时往往会重复的从互联网中获取依赖包难以缓存大大降低了镜像的构建效率。
例如一个前端工程需要用到 npm
FROM node:alpine as builderWORKDIR /appCOPY package.json /app/RUN npm i --registryhttps://registry.npm.taobao.org \ rm -rf ~/.npmCOPY src /app/srcRUN npm run buildFROM nginx:alpineCOPY --frombuilder /app/dist /app/dist使用多阶段构建构建的镜像中只包含了目标文件夹 dist但仍然存在一些问题当 package.json 文件变动时RUN npm i rm -rf ~/.npm 这一层会重新执行变更多次后生成了大量的中间层镜像。
为解决这个问题进一步的我们可以设想一个类似 数据卷 的功能在镜像构建时把 node_modules 文件夹挂载上去在构建完成后这个 node_modules 文件夹会自动卸载实际的镜像中并不包含 node_modules 这个文件夹这样我们就省去了每次获取依赖的时间大大增加了镜像构建效率同时也避免了生成了大量的中间层镜像。
BuildKit 提供了 RUN --mounttypecache 指令可以实现上边的设想。
# syntax docker/dockerfile:experimental
FROM node:alpine as builderWORKDIR /appCOPY package.json /app/RUN --mounttypecache,target/app/node_modules,idmy_app_npm_module,sharinglocked \--mounttypecache,target/root/.npm,idnpm_cache \npm i --registryhttps://registry.npm.taobao.orgCOPY src /app/srcRUN --mounttypecache,target/app/node_modules,idmy_app_npm_module,sharinglocked \
# --mounttypecache,target/app/dist,idmy_app_dist,sharinglocked \npm run buildFROM nginx:alpine# COPY --frombuilder /app/dist /app/dist# 为了更直观的说明 from 和 source 指令这里使用 RUN 指令
RUN --mounttypecache,target/tmp/dist,frombuilder,source/app/dist \# --mounttypecache,target/tmp/dist,frommy_app_dist,sharinglocked \mkdir -p /app/dist cp -r /tmp/dist/* /app/dist由于 BuildKit 为实验特性每个 Dockerfile 文件开头都必须加上如下指令
# syntax docker/dockerfile:experimental第一个 RUN 指令执行后id 为 my_app_npm_module 的缓存文件夹挂载到了 /app/node_modules 文件夹中。多次执行也不会产生多个中间层镜像。
第二个 RUN 指令执行时需要用到 node_modules 文件夹node_modules 已经挂载命令也可以正确执行。
第三个 RUN 指令将上一阶段产生的文件复制到指定位置from 指明缓存的来源这里 builder 表示缓存来源于构建的第一阶段source 指明缓存来源的文件夹。
上面的 Dockerfile 中 --mounttypecache,... 中指令作用如下
OptionDescriptionidid 设置一个标志以便区分缓存。target (必填项)缓存的挂载目标文件夹。ro,readonly只读缓存文件夹不能被写入。sharing有 shared private locked 值可供选择。sharing 设置当一个缓存被多次使用时的表现由于 BuildKit 支持并行构建当多个步骤使用同一缓存时同一 id会发生冲突。shared 表示多个步骤可以同时读写private 表示当多个步骤使用同一缓存时每个步骤使用不同的缓存locked 表示当一个步骤完成释放缓存后后一个步骤才能继续使用该缓存。from缓存来源构建阶段不填写时为空文件夹。source来源的文件夹路径。
RUN --mounttypebind
该指令可以将一个镜像或上一构建阶段的文件挂载到指定位置。
# syntax docker/dockerfile:experimental
RUN --mounttypebind,fromphp:alpine,source/usr/local/bin/docker-php-entrypoint,target/docker-php-entrypoint \cat /docker-php-entrypointRUN --mounttypetmpfs
该指令可以将一个 tmpfs 文件系统挂载到指定位置。
# syntax docker/dockerfile:experimental
RUN --mounttypetmpfs,target/temp \mount | grep /tempRUN --mounttypesecret
该指令可以将一个文件(例如密钥)挂载到指定位置。
# syntax docker/dockerfile:experimental
RUN --mounttypesecret,idaws,target/root/.aws/credentials \cat /root/.aws/credentials$ docker build -t test --secret idaws,src$HOME/.aws/credentials .RUN --mounttypessh
该指令可以挂载 ssh 密钥。
# syntax docker/dockerfile:experimental
FROM alpine
RUN apk add --no-cache openssh-client
RUN mkdir -p -m 0700 ~/.ssh ssh-keyscan gitlab.com ~/.ssh/known_hosts
RUN --mounttypessh ssh gitgitlab.com | tee /hello$ eval $(ssh-agent)
$ ssh-add ~/.ssh/id_rsa
(Input your passphrase here)
$ docker build -t test --ssh default$SSH_AUTH_SOCK .docker-compose build 使用 Buildkit
设置 COMPOSE_DOCKER_CLI_BUILD1 环境变量即可使用。
官方文档
https://github.com/moby/buildkit/blob/master/frontend/dockerfile/docs/experimental.md 二、使用 Buildx 构建镜像
使用
你可以直接使用 docker buildx build 命令构建镜像。
$ docker buildx build .
[] Building 8.4s (23/32) ...Buildx 使用 BuildKit 引擎 进行构建支持许多新的功能具体参考 Buildkit 一节。
官方文档
https://docs.docker.com/engine/reference/commandline/buildx/ 三、使用 buildx 构建多种系统架构支持的 Docker 镜像
在之前的版本中构建多种系统架构支持的 Docker 镜像要想使用统一的名字必须使用 $ docker manifest 命令。
在 Docker 19.03 版本中可以使用 $ docker buildx build 命令使用 BuildKit 构建镜像。该命令支持 --platform 参数可以同时构建支持多种系统架构的 Docker 镜像大大简化了构建步骤。
新建 builder 实例
Docker for Linux 不支持构建 arm 架构镜像我们可以运行一个新的容器让其支持该特性Docker 桌面版无需进行此项设置。
$ docker run --rm --privileged tonistiigi/binfmt:latest --install all由于 Docker 默认的 builder 实例不支持同时指定多个 --platform我们必须首先创建一个新的 builder 实例。同时由于国内拉取镜像较缓慢我们可以使用配置了 镜像加速地址 的 dockerpracticesig/buildkit:master 镜像替换官方镜像。 如果你有私有的镜像加速器可以基于 https://github.com/docker-practice/buildx 构建自己的 buildkit 镜像并使用它。 # 适用于国内环境
$ docker buildx create --use --namemybuilder-cn --driver docker-container --driver-opt imagedockerpracticesig/buildkit:master# 适用于腾讯云环境(腾讯云主机、coding.net 持续集成)
$ docker buildx create --use --namemybuilder-cn --driver docker-container --driver-opt imagedockerpracticesig/buildkit:master-tencent# $ docker buildx create --name mybuilder --driver docker-container$ docker buildx use mybuilder构建镜像
新建 Dockerfile 文件。
FROM --platform$TARGETPLATFORM alpineRUN uname -a /os.txtCMD cat /os.txt使用 $ docker buildx build 命令构建镜像注意将 myusername 替换为自己的 Docker Hub 用户名。
--push 参数表示将构建好的镜像推送到 Docker 仓库。
$ docker buildx build --platform linux/arm,linux/arm64,linux/amd64 -t myusername/hello . --push# 查看镜像信息
$ docker buildx imagetools inspect myusername/hello在不同架构运行该镜像可以得到该架构的信息。
# arm
$ docker run -it --rm myusername/hello
Linux buildkitsandbox 4.9.125-linuxkit #1 SMP Fri Sep 7 08:20:28 UTC 2018 armv7l Linux# arm64
$ docker run -it --rm myusername/hello
Linux buildkitsandbox 4.9.125-linuxkit #1 SMP Fri Sep 7 08:20:28 UTC 2018 aarch64 Linux# amd64
$ docker run -it --rm myusername/hello
Linux buildkitsandbox 4.9.125-linuxkit #1 SMP Fri Sep 7 08:20:28 UTC 2018 x86_64 Linux架构相关变量
Dockerfile 支持如下架构相关的变量
TARGETPLATFORM
构建镜像的目标平台例如 linux/amd64, linux/arm/v7, windows/amd64。
TARGETOS
TARGETPLATFORM 的 OS 类型例如 linux, windows
TARGETARCH
TARGETPLATFORM 的架构类型例如 amd64, arm
TARGETVARIANT
TARGETPLATFORM 的变种该变量可能为空例如 v7
BUILDPLATFORM
构建镜像主机平台例如 linux/amd64
BUILDOS
BUILDPLATFORM 的 OS 类型例如 linux
BUILDARCH
BUILDPLATFORM 的架构类型例如 amd64
BUILDVARIANT
BUILDPLATFORM 的变种该变量可能为空例如 v7
使用举例
例如我们要构建支持 linux/arm/v7 和 linux/amd64 两种架构的镜像。假设已经生成了两个平台对应的二进制文件
bin/dist-linux-armbin/dist-linux-amd64
那么 Dockerfile 可以这样书写
FROM scratch# 使用变量必须申明
ARG TARGETOSARG TARGETARCHCOPY bin/dist-${TARGETOS}-${TARGETARCH} /distENTRYPOINT [dist]作者主页 正函数的个人主页 文章收录专栏 Docker 欢迎大家点赞 收藏 ⭐ 加关注哦 如果你认为这篇文章对你有帮助请给正函数点个赞吧如果发现什么问题欢迎评论区留言