我有一个Go应用程序,我构建成二进制文件并分发为Docker镜像。
目前,我使用ubuntu
作为我的基本映像,但这会导致一个问题,即如果用户尝试使用UTC以外的时区或其本地时区,则会收到错误消息:< / p>
pod error: panic: open /usr/local/go/lib/time/zoneinfo.zip: no such file or directory
导致此错误的原因是Go中的LoadLocation包需要该文件。
我可以想出两种方法来解决这个问题:
继续使用ubuntu
基本图片,但在我的Dockerfile中添加命令:RUN apt-get install -y tzdata
使用Golang的一个基本图像,例如。 golang:1.7.5-alpine
。
推荐的方式是什么?我不确定是否需要或应该使用Golang图像,因为这是预先构建的二进制文件运行的容器。我的理解是Golang图像最适合构建二进制文件。
答案 0 :(得分:2)
我更喜欢使用多阶段构建。在第一步,您使用特殊的golang构建容器来安装所有依赖项并构建应用程序。在第二阶段,我将二进制文件复制到空alpine
容器。这允许同时拥有所有必需的工具和最小的泊坞窗图像(在我的情况下为6MB而不是280MB)。
Dockerfile
的示例:
# build stage
FROM golang:1.8
ADD . /src
RUN set -x && \
cd /src && \
go get -t -v github.com/lisitsky/go-site-search-string && \
CGO_ENABLED=0 GOOS=linux go build -a -o goapp
# final stage
FROM alpine
WORKDIR /app
COPY --from=0 /src/goapp /app/
ENTRYPOINT /goapp
EXPOSE 8080
答案 1 :(得分:1)
您可以使用系统的tzdata。或者,您可以将$GOROOT/lib/time/zoneinfo.zip
复制到图像中,这是系统图像的修剪版本。
答案 2 :(得分:1)
这更像是投票,但apt-get是我们(我公司的技术团队)在这样的情况下所做的事情。它使我们可以完全控制图像的层次结构,但这假设您可能有基于此图像的未来图像。
答案 3 :(得分:1)
由于并非所有操作系统都安装了本地化的时区,所以我要做的是使其工作:
ADD https://github.com/golang/go/raw/master/lib/time/zoneinfo.zip /usr/local/go/lib/time/zoneinfo.zip
用于添加时区的多步骤Docker映像的完整示例为here