测试
原文: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 .
导出测试结果
除了运行测试外,有时将测试结果导出到测试报告中也是有用的。
导出测试结果与前一节指南中展示的导出二进制文件没有什么不同:
- 将测试结果保存到文件。
- 在您的 Dockerfile 中创建一个使用
scratch
基础镜像的新阶段。 - 使用
local
导出器导出该阶段。
如何执行这些步骤留给读者作为练习 😃
总结
本节展示了如何使用 Docker 构建来运行测试(或如本节所示,运行代码检查器)。
下一步
本指南的下一个主题是多平台构建,使用仿真和跨平台编译。