## 1. choose a simple linux image For example `alpine`, it's only about 5MB. ## 2. set timezone if necessary ```dockerfile RUN apk add --no-cache tzdata ENV TZ America/New_York ``` ## 3. multi-stage build * the first stage to build the binary, ensure the binary is dev box independent * use the binary in the first stage to build the final image ## 4. the simplest way to write `Dockerfile` * first of all, install the tool `goctl` `GO111MODULE=on go get -u github.com/tal-tech/go-zero/tools/goctl` * in project `greet`, create a service called `hello` `goctl api new hello` file structure listed below: ``` greet ├── go.mod ├── go.sum └── service └── hello ├── etc │ └── hello-api.yaml ├── hello.api ├── hello.go └── internal ├── config │ └── config.go ├── handler │ ├── hellohandler.go │ └── routes.go ├── logic │ └── hellologic.go ├── svc │ └── servicecontext.go └── types └── types.go ``` * in dir `hello`, one shot to generate `Dockerfile` `goctl docker -go hello.go` the content of `Dockerfile` like: ```dockerfile FROM golang:alpine AS builder LABEL stage=gobuilder ENV CGO_ENABLED 0 ENV GOOS linux WORKDIR /build/zero ADD go.mod . ADD go.sum . RUN go mod download COPY . . COPY service/hello/etc /app/etc RUN go build -ldflags="-s -w" -o /app/hello service/hello/hello.go FROM alpine RUN apk update --no-cache RUN apk add --no-cache ca-certificates RUN apk add --no-cache tzdata ENV TZ America/New_York WORKDIR /app COPY --from=builder /app/hello /app/hello COPY --from=builder /app/etc /app/etc CMD ["./hello", "-f", "etc/hello-api.yaml"] ``` * in dir `greet`, `build` the final image `docker build -t hello:v1 -f service/hello/Dockerfile .` * check the image `hello v1 5455f2eaea6b 7 minutes ago 18.1MB` the image size is like 18MB. * start the service `docker run --rm -it -p 8888:8888 hello:v1` * test the service ```shell $ curl -i http://localhost:8888/from/you HTTP/1.1 200 OK Content-Type: application/json Date: Thu, 10 Dec 2020 06:03:02 GMT Content-Length: 14 {"message":""} ``` ## 5. conclusion `goctl` greatly simplifies the writing of `Dockerfile`. The generated `Dockerfile` is state-of-art and can be used directly. Also, you can customized the `Dockerfile` template in `$HOME/.goctl/docker` if necessary. If it helps, welcome to **star** the project. 🤝 ## 6. go-zero [https://github.com/tal-tech/go-zero](https://github.com/tal-tech/go-zero/blob/master/readme-en.md)