Dockerfile 1.6 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667
  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. go get golang.org/x/tools/cmd/goimports
  22. WORKDIR ${PWD}
  23. ADD go.* ${PWD}
  24. ADD . ${PWD}
  25. FROM protos-base AS make-protos
  26. RUN make -f builder.Makefile protos
  27. FROM golangci/golangci-lint:v${GOLANGCI_LINT_VERSION}-alpine AS lint-base
  28. FROM base AS lint
  29. COPY --from=lint-base /usr/bin/golangci-lint /usr/bin/golangci-lint
  30. ENV CGO_ENABLED=0
  31. RUN --mount=id=build,type=cache,target=/root/.cache/go-build \
  32. --mount=id=lint,type=cache,target=/root/.cache/golangci-lint \
  33. make -f builder.Makefile lint
  34. FROM base AS make-cli
  35. RUN --mount=id=build,type=cache,target=/root/.cache/go-build \
  36. GOOS=${TARGET_OS} \
  37. GOARCH=${TARGET_ARCH} \
  38. make -f builder.Makefile cli
  39. FROM base AS make-cross
  40. RUN --mount=id=build,type=cache,target=/root/.cache/go-build \
  41. make -f builder.Makefile cross
  42. FROM scratch AS protos
  43. COPY --from=make-protos /api .
  44. FROM scratch AS cli
  45. COPY --from=make-cli /api/bin/* .
  46. FROM scratch AS cross
  47. COPY --from=make-cross /api/bin/* .
  48. FROM base as test
  49. ENV CGO_ENABLED=0
  50. RUN --mount=id=build,type=cache,target=/root/.cache/go-build \
  51. make -f builder.Makefile test