作者主页: 正函数的个人主页
文章收录专栏: Docker
欢迎大家点赞 ?? 收藏 ? 加关注哦!
Docker Buildx
Docker Buildx 是一个 docker CLI 插件,其扩展了 docker 命令,支持
该功能仅适用于 Docker v19.03+ 版本
一、使用 BuildKit 构建镜像
BuildKit 是下一代的镜像构建组件,在 https://github.com/moby/buildkit 开源。
注意:如果您的镜像构建使用的是云服务商提供的镜像构建服务(腾讯云容器服务、阿里云容器服务等),由于上述服务提供商的 Docker 版本低于 18.09,BuildKit 无法使用,将造成镜像构建失败。建议使用 BuildKit 构建镜像时使用一个新的 Dockerfile 文件(例如 Dockerfile.buildkit)
目前,Docker Hub 自动构建已经支持 buildkit,具体请参考 https://github.com/docker-practice/docker-hub-buildx
Dockerfile 新增指令详解
启用
RUN --mount=type=cache
目前,几乎所有的程序都会使用依赖管理工具,例如
例如一个前端工程需要用到
FROM node:alpine as builder WORKDIR /app COPY package.json /app/ RUN npm i --registry=https://registry.npm.taobao.org && rm -rf ~/.npm COPY src /app/src RUN npm run build FROM nginx:alpine COPY --from=builder /app/dist /app/dist
使用多阶段构建,构建的镜像中只包含了目标文件夹
为解决这个问题,进一步的我们可以设想一个类似 数据卷 的功能,在镜像构建时把
# syntax = docker/dockerfile:experimental FROM node:alpine as builder WORKDIR /app COPY 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.org COPY src /app/src RUN --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 build FROM 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
由于
# syntax = docker/dockerfile:experimental
第一个
第二个
第三个
上面的
Option | Description |
---|---|
缓存的挂载目标文件夹。 | |
只读,缓存文件夹不能被写入。 | |
有 |
|
缓存来源(构建阶段),不填写时为空文件夹。 | |
来源的文件夹路径。 |
RUN --mount=type=bind
该指令可以将一个镜像(或上一构建阶段)的文件挂载到指定位置。
# syntax = docker/dockerfile:experimental 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
该指令可以将一个
# syntax = docker/dockerfile:experimental RUN --mount=type=tmpfs,target=/temp mount | grep /temp
RUN --mount=type=secret
该指令可以将一个文件(例如密钥)挂载到指定位置。
# syntax = docker/dockerfile:experimental RUN --mount=type=secret,id=aws,target=/root/.aws/credentials cat /root/.aws/credentials
$ docker build -t test --secret id=aws,src=$HOME/.aws/credentials .
RUN --mount=type=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 --mount=type=ssh ssh [email protected] | 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
设置
官方文档
- https://github.com/moby/buildkit/blob/master/frontend/dockerfile/docs/experimental.md
二、使用 Buildx 构建镜像
使用
你可以直接使用
$ docker buildx build . [+] Building 8.4s (23/32) => ...
Buildx 使用 BuildKit 引擎 进行构建,支持许多新的功能,具体参考 Buildkit 一节。
官方文档
- https://docs.docker.com/engine/reference/commandline/buildx/
三、使用 buildx 构建多种系统架构支持的 Docker 镜像
在之前的版本中构建多种系统架构支持的 Docker 镜像,要想使用统一的名字必须使用
在 Docker 19.03+ 版本中可以使用
新建 builder 实例
Docker for Linux 不支持构建
$ docker run --rm --privileged tonistiigi/binfmt:latest --install all
由于 Docker 默认的
如果你有私有的镜像加速器,可以基于 https://github.com/docker-practice/buildx 构建自己的 buildkit 镜像并使用它。
# 适用于国内环境 $ docker buildx create --use --name=mybuilder-cn --driver docker-container --driver-opt image=dockerpracticesig/buildkit:master # 适用于腾讯云环境(腾讯云主机、coding.net 持续集成) $ docker buildx create --use --name=mybuilder-cn --driver docker-container --driver-opt image=dockerpracticesig/buildkit:master-tencent # $ docker buildx create --name mybuilder --driver docker-container $ docker buildx use mybuilder
构建镜像
新建 Dockerfile 文件。
FROM --platform=$TARGETPLATFORM alpine RUN uname -a > /os.txt CMD cat /os.txt
使用
$ 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
架构相关变量
TARGETPLATFORM
构建镜像的目标平台,例如
TARGETOS
TARGETARCH
TARGETVARIANT
BUILDPLATFORM
构建镜像主机平台,例如
BUILDOS
BUILDARCH
BUILDVARIANT
使用举例
例如我们要构建支持
bin/dist-linux-arm bin/dist-linux-amd64
那么
FROM scratch # 使用变量必须申明 ARG TARGETOS ARG TARGETARCH COPY bin/dist-${TARGETOS}-${TARGETARCH} /dist ENTRYPOINT ["dist"]
作者主页: 正函数的个人主页
文章收录专栏: Docker
欢迎大家点赞 ?? 收藏 ? 加关注哦!
如果你认为这篇文章对你有帮助,请给正函数点个赞吧,如果发现什么问题,欢迎评论区留言!!