Skip to content

测试

原文:https://docs.docker.com/build/guide/test/

本节关注测试。本节的示例聚焦于代码检查(linting),但同样的原则也适用于其他类型的测试,如单元测试。代码检查是对代码进行静态分析,帮助您检测错误、风格违规和反模式。

根据您使用的编程语言或框架,测试代码的具体步骤可能会有很大差异。本指南中使用的示例应用是用 Go 编写的。您将添加一个构建步骤,使用 golangci-lint,这是一个流行的 Go 语言检查工具。

运行测试

golangci-lint 工具可以在 Docker Hub 上找到。在您将检查步骤添加到 Dockerfile 之前,您可以使用 docker run 命令试用它。

console
docker run -v $PWD:/test -w /test \
  golangci/golangci-lint golangci-lint run

您会注意到 golangci-lint 的作用:它发现了代码中缺少错误检查的问题。

text
cmd/server/main.go:23:10: Error return value of `w.Write` is not checked (errcheck)
        w.Write([]byte(translated))
              ^

现在您可以将这个步骤添加到 Dockerfile 中。

diff
  # syntax=docker/dockerfile:1
  ARG GO_VERSION=1.21
+ ARG GOLANGCI_LINT_VERSION=v1.52
  FROM golang:${GO_VERSION}-alpine AS base
  WORKDIR /src
  RUN --mount=type=cache,target=/go/pkg/mod/ \
      --mount=type=bind,source=go.sum,target=go.sum \
      --mount=type=bind,source=go.mod,target=go.mod \
      go mod download -x

  FROM base AS build-client
  RUN --mount=type=cache,target=/go/pkg/mod/ \
      --mount=type=bind,target=. \
      go build -o /bin/client ./cmd/client

  FROM base AS build-server
  ARG APP_VERSION="0.0.0+unknown"
  RUN --mount=type=cache,target=/go/pkg/mod/ \
      --mount=type=bind,target=. \
      go build -ldflags "-X main.version=$APP_VERSION" -o /bin/server ./cmd/server

  FROM scratch AS client
  COPY --from=build-client /bin/client /bin/
  ENTRYPOINT [ "/bin/client" ]

  FROM scratch AS server
  COPY --from=build-server /bin/server /bin/
  ENTRYPOINT [ "/bin/server" ]

  FROM scratch AS binaries
  COPY --from=build-client /bin/client /
  COPY --from=build-server /bin/server /
+
+ FROM golangci/golangci-lint:${GOLANGCI_LINT_VERSION} as lint
+ WORKDIR /test
+ RUN --mount=type=bind,target=. \
+     golangci-lint run

新增的 lint 阶段使用 Docker Hub 上的 golangci/golangci-lint 镜像来调用 golangci-lint run 命令,通过绑定挂载的方式挂载构建上下文。

lint 阶段独立于 Dockerfile 中的任何其他阶段。因此,执行常规构建不会触发 lint 步骤。要检查代码,您必须指定 lint 阶段:

console
docker build --target=lint .

导出测试结果

除了运行测试外,有时将测试结果导出到测试报告中也是有用的。

导出测试结果与前一节指南中展示的导出二进制文件没有什么不同:

  1. 将测试结果保存到文件。
  2. 在您的 Dockerfile 中创建一个使用 scratch 基础镜像的新阶段。
  3. 使用 local 导出器导出该阶段。

如何执行这些步骤留给读者作为练习 😃

总结

本节展示了如何使用 Docker 构建来运行测试(或如本节所示,运行代码检查器)。

下一步

本指南的下一个主题是多平台构建,使用仿真和跨平台编译。