Pārlūkot izejas kodu

chore: reduce the docker image size (#1633)

* chore: reduce the docker image size

* chore: format dockerfile
Kevin Wan 3 gadi atpakaļ
vecāks
revīzija
d6a692971f
3 mainītis faili ar 35 papildinājumiem un 22 dzēšanām
  1. 24 19
      tools/goctl/docker/docker.go
  2. 6 3
      tools/goctl/docker/template.go
  3. 5 0
      tools/goctl/goctl.go

+ 24 - 19
tools/goctl/docker/docker.go

@@ -24,14 +24,16 @@ const (
 
 // Docker describes a dockerfile
 type Docker struct {
-	Chinese   bool
-	GoRelPath string
-	GoFile    string
-	ExeFile   string
-	HasPort   bool
-	Port      int
-	Argument  string
-	Version   string
+	Chinese     bool
+	GoRelPath   string
+	GoFile      string
+	ExeFile     string
+	HasPort     bool
+	Port        int
+	Argument    string
+	Version     string
+	HasTimezone bool
+	Timezone    string
 }
 
 // DockerCommand provides the entry for goctl docker
@@ -47,6 +49,7 @@ func DockerCommand(c *cli.Context) (err error) {
 	version := c.String("version")
 	remote := c.String("remote")
 	branch := c.String("branch")
+	timezone := c.String("tz")
 	if len(remote) > 0 {
 		repo, _ := util.CloneIntoGitHome(remote, branch)
 		if len(repo) > 0 {
@@ -72,7 +75,7 @@ func DockerCommand(c *cli.Context) (err error) {
 
 	port := c.Int("port")
 	if _, err := os.Stat(etcDir); os.IsNotExist(err) {
-		return generateDockerfile(goFile, port, version)
+		return generateDockerfile(goFile, port, version, timezone)
 	}
 
 	cfg, err := findConfig(goFile, etcDir)
@@ -80,7 +83,7 @@ func DockerCommand(c *cli.Context) (err error) {
 		return err
 	}
 
-	if err := generateDockerfile(goFile, port, version, "-f", "etc/"+cfg); err != nil {
+	if err := generateDockerfile(goFile, port, version, timezone, "-f", "etc/"+cfg); err != nil {
 		return err
 	}
 
@@ -121,7 +124,7 @@ func findConfig(file, dir string) (string, error) {
 	return files[0], nil
 }
 
-func generateDockerfile(goFile string, port int, version string, args ...string) error {
+func generateDockerfile(goFile string, port int, version, timezone string, args ...string) error {
 	projPath, err := getFilePath(filepath.Dir(goFile))
 	if err != nil {
 		return err
@@ -150,14 +153,16 @@ func generateDockerfile(goFile string, port int, version string, args ...string)
 	_, offset := time.Now().Zone()
 	t := template.Must(template.New("dockerfile").Parse(text))
 	return t.Execute(out, Docker{
-		Chinese:   offset == cstOffset,
-		GoRelPath: projPath,
-		GoFile:    goFile,
-		ExeFile:   pathx.FileNameWithoutExt(filepath.Base(goFile)),
-		HasPort:   port > 0,
-		Port:      port,
-		Argument:  builder.String(),
-		Version:   version,
+		Chinese:     offset == cstOffset,
+		GoRelPath:   projPath,
+		GoFile:      goFile,
+		ExeFile:     pathx.FileNameWithoutExt(filepath.Base(goFile)),
+		HasPort:     port > 0,
+		Port:        port,
+		Argument:    builder.String(),
+		Version:     version,
+		HasTimezone: len(timezone) > 0,
+		Timezone:    timezone,
 	})
 }
 

+ 6 - 3
tools/goctl/docker/template.go

@@ -15,6 +15,8 @@ LABEL stage=gobuilder
 ENV CGO_ENABLED 0
 ENV GOOS linux
 {{if .Chinese}}ENV GOPROXY https://goproxy.cn,direct
+{{end}}{{if .HasTimezone}}
+RUN apk update --no-cache && apk add --no-cache tzdata
 {{end}}
 WORKDIR /build
 
@@ -28,9 +30,10 @@ COPY . .
 
 FROM alpine
 
-RUN apk update --no-cache && apk add --no-cache ca-certificates tzdata
-ENV TZ Asia/Shanghai
-
+RUN apk update --no-cache && apk add --no-cache ca-certificates
+{{if .HasTimezone}}COPY --from=builder /usr/share/zoneinfo/{{.Timezone}} /usr/share/zoneinfo/{{.Timezone}}
+ENV TZ {{.Timezone}}
+{{end}}
 WORKDIR /app
 COPY --from=builder /app/{{.ExeFile}} /app/{{.ExeFile}}{{if .Argument}}
 COPY --from=builder /app/etc /app/etc{{end}}

+ 5 - 0
tools/goctl/goctl.go

@@ -365,6 +365,11 @@ var commands = []cli.Command{
 				Name:  "version",
 				Usage: "the goctl builder golang image version",
 			},
+			cli.StringFlag{
+				Name:  "tz",
+				Usage: "the timezone of the container",
+				Value: "Asia/Shanghai",
+			},
 		},
 		Action: docker.DockerCommand,
 	},