容器镜像构建神器Buildx,支持多平台

程序员咋不秃头 2024-04-27 01:39:28

1.简介

Docker 是一种流行的部署工具,使我们能够打包和运行应用程序。由于采用率很高,因此需要根据不同的要求扩展功能。因此,为了实现这一点,可以使用第三方docker 插件[1]。

例如,如果希望数据跨不同主机持久化数据,可以使用卷插件。另一个常用的插件是 Docker buildx[2] 。它通过使用 BuildKit builder 扩展了镜像的构建能力。因此,使用该插件,我们可以为不同的平台和架构构建镜像。此外,它支持使用自定义上下文进行并行多阶段制作。

在本教程中,我们将介绍 Docker buildx。

2.安装 buildx

首先,要运行 buildx ,我们需要安装 Docker。对 Docker buildx 的支持从 19.00 开始可用。

首先检查 Docker 版本:

$ docker --versionDocker version 19.03.8, build afacb8b

接下来,通过设置环境变量启用 Docker 实验性功能:

$ export DOCKER_CLI_EXPERIMENTAL=enabled

为了确保我们的设置在会话结束后仍然存在,我们将变量添加到$HOME/.bashrc,现在应该可以访问 buildx:

$ docker buildxUsage: docker buildx COMMANDBuild with BuildKitManagement Commands: imagetools Commands to work on images in registryCommands: bake Build from a file build Start a build create Create a new builder instance inspect Inspect current builder instance ls List builder instances rm Remove a builder instance stop Stop builder instance use Set the current builder instance version Show buildx version informationRun 'docker buildx COMMAND --help' for more information on a command.

这显示了常用命令和每个命令的语法。

3.使用 buildx 构建

buildx 执行所有Docker 构建[3]功能。因此,可以轻松地运行并执行它们。例如,指定目标平台、构建缓存和输出配置。除此之外, buildx 还提供了额外的功能。

首先是同时为多个平台构建镜像的能力。其次,在单个 dockerfile 中为较小的镜像进行多阶段构建。最后,在构建过程中自定义输入、参数或变量的能力。

让我们通过创建一个实例来深入研究一个例子:

$ docker buildx create --name ourbuilderourbuilder

这将创建一个名为 ourbuilder 的构建实例。

接下来,将其设置为活动目录:

$ docker buildx use ourbuilder

接下来,创建一个 dockerfile 来运行一个简单的 node 应用程序:

# Base imageFROM node:14-alpine# Set working directoryWORKDIR /app# Copy application filesCOPY . .# Install dependenciesRUN npm install --production# Expose the portEXPOSE 3000# Start the applicationCMD ["node", "app.js"]

这里使用 node.js 基础镜像并将工作目录设置为/app。然后将应用程序文件复制到容器中。然后安装所有依赖项,暴露端口 3000 并启动应用程序:

$ docker buildx build --platform linux/amd64,linux/arm64 -t ourapp:latest .time="2023-06-01T07:13:20+03:00" level=warning msg="No output specified for docker-container driver. Build result will only remain in the build cache. To push result image into registry use --push or to load image into docker use --load"#1 [internal] booting buildkit#1 pulling image moby/buildkit:buildx-stable-1#1 pulling image moby/buildkit:buildx-stable-1 73.2s done#1 creating container buildx_buildkit_ourbuilder0#1 creating container buildx_buildkit_ourbuilder0 2.1s done#1 DONE 75.4s#3 [internal] load .dockerignore#3 transferring context: 0.0s#3 transferring context: 2B 0.1s done#3 DONE 0.3s#2 [internal] load build definition from Dockerfile#2 transferring dockerfile: 294B 0.0s done#2 DONE 0.4s#4 [linux/amd64 internal] load metadata for docker.io/library/node:14-alpin...#4 DONE 4.7s.... truncated .....

使用 –platform 标志指定目标平台。在这种情况下,目标是 x86 (Linux/amd64) 和 ARM (Linux/arm64) 架构。我们还提供了标签-t ourapp:latest 以使用名称 ourapp 和 latest 标签来标记构建的镜像。指定构建上下文,即当前目录。

Docker buildx auto 处理多平台构建并为每个目标架构生成单独的镜像。

4、结论

在本教程中,我们探索了 Docker buildx,这是一种扩展 Docker 镜像构建和管理能力的工具。它通过支持并行构建、自定义构建上下文和多阶段构建来简化流程。

0 阅读:121

程序员咋不秃头

简介:感谢大家的关注