简介
要根据不同的要求扩展功能。因此,为了实现这一点,可以使用第三方docker 插件[1]
。
例如,如果希望数据跨不同主机持久化数据,可以使用卷插件。另一个常用的插件是 Docker buildx[2]
。它通过使用 BuildKit builder 扩展了镜像的构建能力。因此,使用该插件,我们可以为不同的平台和架构构建镜像。此外,它支持使用自定义上下文进行并行多阶段制作。
在本教程中,我们将介绍 Docker buildx。
安装 buildx
首先,要运行 buildx ,我们需要安装 Docker。对 Docker buildx 的支持从 19.00 开始可用。
首先检查 Docker 版本:
代码语言:javascript复制$ docker --version
Docker version 19.03.8, build afacb8b
接下来,通过设置环境变量启用 Docker 实验性功能:
代码语言:javascript复制$ export DOCKER_CLI_EXPERIMENTAL=enabled
为了确保我们的设置在会话结束后仍然存在,我们将变量添加到$HOME/.bashrc
,现在应该可以访问 buildx:
$ docker buildx
Usage: docker buildx COMMAND
Build with BuildKit
Management Commands:
imagetools Commands to work on images in registry
Commands:
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 information
Run 'docker buildx COMMAND --help' for more information on a command.
这显示了常用命令和每个命令的语法。
使用 buildx 构建
buildx 执行所有Docker 构建[3]
功能。因此,可以轻松地运行并执行它们。例如,指定目标平台、构建缓存和输出配置。除此之外, buildx 还提供了额外的功能。
首先是同时为多个平台构建镜像的能力。其次,在单个 dockerfile 中为较小的镜像进行多阶段构建。最后,在构建过程中自定义输入、参数或变量的能力。
让我们通过创建一个实例来深入研究一个例子:
代码语言:javascript复制$ docker buildx create --name ourbuilder
ourbuilder
这将创建一个名为 ourbuilder 的构建实例。
接下来,将其设置为活动目录:
代码语言:javascript复制$ docker buildx use ourbuilder
接下来,创建一个 dockerfile 来运行一个简单的 node 应用程序:
代码语言:javascript复制# Base image
FROM node:14-alpine
# Set working directory
WORKDIR /app
# Copy application files
COPY . .
# Install dependencies
RUN npm install --production
# Expose the port
EXPOSE 3000
# Start the application
CMD ["node", "app.js"]
这里使用 node.js 基础镜像并将工作目录设置为/app。然后将应用程序文件复制到容器中。然后安装所有依赖项,暴露端口 3000 并启动应用程序:
代码语言:javascript复制$ 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 处理多平台构建并为每个目标架构生成单独的镜像。
结论
在本教程中,我们探索了 Docker buildx,这是一种扩展 Docker 镜像构建和管理能力的工具。它通过支持并行构建、自定义构建上下文和多阶段构建来简化流程。
来源(版权归原作者所有):https://www.baeldung.com/ops/docker-buildx