我无法回忆起我在哪里看到的,我记得有人提到使用Golang时,在生产环境中运行发布二进制文件,并在Docker容器中包含一个单独的文件,其中包含调试符号,以便在发生崩溃时能够查看发生了什么事情。可能是在Datadog、NewRelic或CloudFlare上看到的。
背景: 我正在构建并在Docker中运行,使用类似这样的Dockerfile:
在使用
背景: 我正在构建并在Docker中运行,使用类似这样的Dockerfile:
# do all of our docker building in one image
FROM golang:latest as build
WORKDIR /usr/src/api
COPY go.mod go.sum ./
RUN go mod download
COPY . .
# build the application with relevant flags to make it completely self-contained for a scratch container
RUN CGO_ENABLED=0 GOOS=linux go build -ldflags "-s" -a -installsuffix cgo -o app
# and then copy the built binary to an empty image
FROM ubuntu:latest
COPY --from=build /usr/src/api/app /
COPY --from=build /usr/src/api/config.defaults.json /config.json
COPY --from=build /usr/src/api/logo.png /
# default to running in a dev environment
ENV ENV=dev
EXPOSE 8080
ENTRYPOINT ["/bin/bash"]
如果我不使用上述标志,二进制文件将无法在 alpine
和 scratch
基础镜像中执行:
standard_init_linux.go:219: exec user process caused: no such file or directory
在使用
ubuntu:latest
上运行此命令可以正常工作,因此似乎上述编译标志可以解决alpine
和scratch
的问题。
问题
考虑到这个环境,是否可能让go build
将调试符号发射到一个单独的文件中,与我的静态二进制文件一起存在于Docker镜像中?