diff --git a/tools/goctl/docker/docker.go b/tools/goctl/docker/docker.go index e4ac358a..6461fbac 100644 --- a/tools/goctl/docker/docker.go +++ b/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, }) } diff --git a/tools/goctl/docker/template.go b/tools/goctl/docker/template.go index b69b9722..afe5322c 100644 --- a/tools/goctl/docker/template.go +++ b/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}} diff --git a/tools/goctl/goctl.go b/tools/goctl/goctl.go index a9bacf8e..0622dd2a 100644 --- a/tools/goctl/goctl.go +++ b/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, },