Dockerfile 1.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566
  1. # syntax = docker/dockerfile:experimental
  2. ARG GO_VERSION=1.14.3-alpine
  3. ARG GOLANGCI_LINT_VERSION=1.27.0
  4. FROM golang:${GO_VERSION} AS base
  5. ARG TARGET_OS=unknown
  6. ARG TARGET_ARCH=unknown
  7. ARG PWD=/api
  8. ENV GO111MODULE=on
  9. RUN apk update && apk add -U docker make
  10. WORKDIR ${PWD}
  11. ADD go.* ${PWD}
  12. RUN go mod download
  13. ADD . ${PWD}
  14. FROM golang:${GO_VERSION} AS protos-base
  15. ARG TARGET_OS=unknown
  16. ARG TARGET_ARCH=unknown
  17. ARG PWD=/api
  18. ENV GO111MODULE=on
  19. RUN apk update && apk add protoc make
  20. RUN go get github.com/golang/protobuf/[email protected]
  21. WORKDIR ${PWD}
  22. ADD go.* ${PWD}
  23. ADD . ${PWD}
  24. FROM protos-base AS make-protos
  25. RUN make -f builder.Makefile protos
  26. FROM golangci/golangci-lint:v${GOLANGCI_LINT_VERSION}-alpine AS lint-base
  27. FROM base AS lint
  28. COPY --from=lint-base /usr/bin/golangci-lint /usr/bin/golangci-lint
  29. ENV CGO_ENABLED=0
  30. RUN --mount=id=build,type=cache,target=/root/.cache/go-build \
  31. --mount=id=lint,type=cache,target=/root/.cache/golangci-lint \
  32. make -f builder.Makefile lint
  33. FROM base AS make-cli
  34. RUN --mount=id=build,type=cache,target=/root/.cache/go-build \
  35. GOOS=${TARGET_OS} \
  36. GOARCH=${TARGET_ARCH} \
  37. make -f builder.Makefile cli
  38. FROM base AS make-cross
  39. RUN --mount=id=build,type=cache,target=/root/.cache/go-build \
  40. make -f builder.Makefile cross
  41. FROM scratch AS protos
  42. COPY --from=make-protos /api/protos .
  43. FROM scratch AS cli
  44. COPY --from=make-cli /api/bin/* .
  45. FROM scratch AS cross
  46. COPY --from=make-cross /api/bin/* .
  47. FROM base as test
  48. ENV CGO_ENABLED=0
  49. RUN --mount=id=build,type=cache,target=/root/.cache/go-build \
  50. make -f builder.Makefile test