Go的时候在docker镜像下从头开始就不行了

JIC*_*HUN 5 go docker dockerfile

去代码:

\n\n
package main\n\nimport (\n    "fmt"\n    "time"\n)\n\nfunc main() {\n    var local,_ = time.LoadLocation("Asia/Shanghai")\n    fmt.Println(time.Now())\n    fmt.Println(time.Now().In(local))\n}\n
Run Code Online (Sandbox Code Playgroud)\n\n

Dockerfile:

\n\n
FROM scratch\nCOPY ./main /main\nCMD [ "/main" ]\n
Run Code Online (Sandbox Code Playgroud)\n\n

构建.sh:

\n\n
rm -rf main\nCGO_ENABLED=0 GOOS=linux GOARCH=amd64 go build -o main  . \ndocker build -t hello-go .\ndocker run hello-go\n
Run Code Online (Sandbox Code Playgroud)\n\n

所有文件都位于一个名为 hello-go 的文件夹中。当我在 osx 中运行 Go 代码时。有用。

\n\n\n\n
package main\n\nimport (\n    "fmt"\n    "time"\n)\n\nfunc main() {\n    var local,_ = time.LoadLocation("Asia/Shanghai")\n    fmt.Println(time.Now())\n    fmt.Println(time.Now().In(local))\n}\n
Run Code Online (Sandbox Code Playgroud)\n\n

当我构建 docker 映像并启动它时。一个这样的错误:

\n\n
\xe2\x9e\x9c  hello-go ./build.sh\nSending build context to Docker daemon  1.937MB\nStep 1/3 : FROM scratch\n --->\nStep 2/3 : COPY ./main /main\n ---> 80da783f6c5d\nStep 3/3 : CMD /main\n ---> Running in 85cb022b3ce2\n ---> 485ddd3a08dd\nRemoving intermediate container 85cb022b3ce2\nSuccessfully built 485ddd3a08dd\nSuccessfully tagged hello-go:latest\n2017-12-13 13:52:59.861173734 +0000 UTC m=+0.000252335\npanic: time: missing Location in call to Time.In\n\ngoroutine 1 [running]:\ntime.Time.In(0xbe846a0ef355744e, 0x4d607, 0x539b80, 0x0, 0x0, 0x0, 0xc420037f70)\n        /usr/local/go/src/time/time.go:1073 +0xc0\nmain.main()\n        /Users/liujichun/Desktop/workspace/docker/hello-go/main.go:11 +0xee\n\xe2\x9e\x9c  hello-go\n
Run Code Online (Sandbox Code Playgroud)\n\n

我知道暂存图像是空的。我应该做什么才能做到。

\n

Gia*_*cci 5

我认为解决这个问题的正确方法是按照库的要求导入 tzdata。您可以利用TZ环境变量。

解决方案在我在 GitHub上找到的 Dockerfile 中指出

总结一下一切:

FROM golang:alpine AS build
RUN apk update && apk add ca-certificates && apk add tzdata
WORKDIR /app
ADD . .
RUN CGO_ENABLED=0 GOOS=linux go build -o myapp

FROM scratch AS final
COPY --from=build /usr/share/zoneinfo /usr/share/zoneinfo
COPY --from=build /etc/ssl/certs/ca-certificates.crt /etc/ssl/certs/
COPY --from=build /app/myapp /

ENV TZ Australia/Sydney
ENTRYPOINT ["/myapp"]
Run Code Online (Sandbox Code Playgroud)


小智 5

从 Go 1.15 开始,time/tzdata 可用,只需在主包中导入该包即可。

参考: https: //golang.org/pkg/time/tzdata/


lui*_*gil 2

使用这个库https://godoc.org/4d63.com/tz

他们的例子(参见tz.LoadLocation):

t := time.Date(2009, time.November, 10, 23, 0, 0, 0, time.UTC)
fmt.Println(t)

syd, _ := tz.LoadLocation("Australia/Sydney")
fmt.Println(t.In(syd))

// Output:

// 2009-11-10 23:00:00 +0000 UTC
// 2009-11-11 10:00:00 +1100 AEDT
Run Code Online (Sandbox Code Playgroud)