2 回答

TA贡献1801条经验 获得超8个赞
我经常把COPY go.modDockerfile 放在开头,因为它不会经常更改。
FROM golang:1.14.3 as builder
WORKDIR /app
COPY go.mod .
COPY go.sum .
RUN go mod download
COPY . .
RUN go build -tags netgo -ldflags '-extldflags "-static"' -o app .
FROM centos:7
WORKDIR /root
COPY --from=builder /app/app .
所以,如果你去 mod 不改变,该行RUN go mod download只运行第一次。

TA贡献1869条经验 获得超4个赞
如果你运行 go get ./... 在你的 dockerfile 中,它会根据 go.mod 和 go.sum 将所有依赖项下载到你的 docker 镜像中。如果您正在处理内部自签名存储库,您还可以将 --insecure 标志添加到 go get 命令。非常类似于 go mod 下载。除此之外,您可以拥有一个实际启动 Go 测试 ./... 的 shell 脚本,并在允许的情况下将其报告给您的 CI 环境,我知道 Gitlab 允许这样做。
FROM golang:1.15-alpine AS builder
RUN apk add --update git gcc musl-dev
RUN apk update && apk add bash
COPY . /app
RUN go version
WORKDIR /app
ENV CGO_ENABLED=0
RUN git config --global http.sslVerify false
RUN go get ./...
WORKDIR /app
RUN chmod +x ./unitTest.sh
RUN ./unitTest.sh
WORKDIR /app/cmd/svr
RUN go build -o app
RUN chmod 700 app
FROM alpine:latest
WORKDIR /root/
ARG build_stamp
ARG git_commit
ARG build_number
ENV BUILD_STAMP=$build_stamp
ENV GIT_COMMIT=$git_commit
ENV BUILD_NUMBER=$build_number
COPY --from=builder /app/cmd/svr .
EXPOSE 8000
CMD ["./app"]
和脚本
#!/usr/bin/env bash
TESTS=$(go test -v -covermode=count -coverprofile=count.txt ./...)
echo "$TESTS"
if echo "$TESTS" | grep -q "FAIL" ; then
echo ""
echo "One or more Unit Tests for app have Failed. Build will now fail. Pipeline will also fail..."
echo ""
exit 1
else
echo ""
echo "All Unit Tests for application have passed!"
echo "Running Code Coverage..."
echo ""
COVERAGE=$(go tool cover -func=./count.txt)
echo "$COVERAGE"
exit 0
fi
- 2 回答
- 0 关注
- 85 浏览
添加回答
举报