sigs.k8s.io/kubebuilder/v3@v3.14.0/pkg/plugins/golang/v4/scaffolds/internal/templates/dockerfile.go (about) 1 /* 2 Copyright 2022 The Kubernetes Authors. 3 4 Licensed under the Apache License, Version 2.0 (the "License"); 5 you may not use this file except in compliance with the License. 6 You may obtain a copy of the License at 7 8 http://www.apache.org/licenses/LICENSE-2.0 9 10 Unless required by applicable law or agreed to in writing, software 11 distributed under the License is distributed on an "AS IS" BASIS, 12 WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 See the License for the specific language governing permissions and 14 limitations under the License. 15 */ 16 17 package templates 18 19 import ( 20 "sigs.k8s.io/kubebuilder/v3/pkg/machinery" 21 ) 22 23 var _ machinery.Template = &Dockerfile{} 24 25 // Dockerfile scaffolds a file that defines the containerized build process 26 type Dockerfile struct { 27 machinery.TemplateMixin 28 } 29 30 // SetTemplateDefaults implements file.Template 31 func (f *Dockerfile) SetTemplateDefaults() error { 32 if f.Path == "" { 33 f.Path = "Dockerfile" 34 } 35 36 f.TemplateBody = dockerfileTemplate 37 38 return nil 39 } 40 41 const dockerfileTemplate = `# Build the manager binary 42 FROM golang:1.21 AS builder 43 ARG TARGETOS 44 ARG TARGETARCH 45 46 WORKDIR /workspace 47 # Copy the Go Modules manifests 48 COPY go.mod go.mod 49 COPY go.sum go.sum 50 # cache deps before building and copying source so that we don't need to re-download as much 51 # and so that source changes don't invalidate our downloaded layer 52 RUN go mod download 53 54 # Copy the go source 55 COPY cmd/main.go cmd/main.go 56 COPY api/ api/ 57 COPY internal/controller/ internal/controller/ 58 59 # Build 60 # the GOARCH has not a default value to allow the binary be built according to the host where the command 61 # was called. For example, if we call make docker-build in a local env which has the Apple Silicon M1 SO 62 # the docker BUILDPLATFORM arg will be linux/arm64 when for Apple x86 it will be linux/amd64. Therefore, 63 # by leaving it empty we can ensure that the container and binary shipped on it will have the same platform. 64 RUN CGO_ENABLED=0 GOOS=${TARGETOS:-linux} GOARCH=${TARGETARCH} go build -a -o manager cmd/main.go 65 66 # Use distroless as minimal base image to package the manager binary 67 # Refer to https://github.com/GoogleContainerTools/distroless for more details 68 FROM gcr.io/distroless/static:nonroot 69 WORKDIR / 70 COPY --from=builder /workspace/manager . 71 USER 65532:65532 72 73 ENTRYPOINT ["/manager"] 74 `