为什么 go 测试突然需要“gcc”?

Web*_*net 5 go

我有一个升级FROM golang:1.9-alpine到的项目,FROM golang:1.12-alpine现在我的测试没有运行。现在是说:

$ docker-compose exec bot go vet       
# runtime/cgo
exec: "gcc": executable file not found in $PATH
Run Code Online (Sandbox Code Playgroud)

根据https://golang.org/doc/install/gccgo的文档,这是编译器。 为什么我可以在没有它的情况下运行我的应用程序,但没有它就无法运行测试? 我一直在查看更改日志,并且必须在涵盖此内容的地方丢失。

这是我的 Dockerfile:

FROM golang:1.12-alpine
RUN mkdir /app
WORKDIR /app
ADD src/ /app

# Fetch application dependencies
RUN apk add --no-cache --update git \
    && go get github.com/bwmarrin/discordgo \
    && go get github.com/jonas747/dshardmanager \
    && go get github.com/bugsnag/bugsnag-go \
    && apk del git

# Build binary
RUN go build -o main .

CMD ["/app/main"]
Run Code Online (Sandbox Code Playgroud)

Pau*_*kin 11

看起来您遇到了这个问题:https : //github.com/golang/go/issues/26988

建议的解决方法是在构建时设置这些环境变量:

CGO_ENABLED=0 GO111MODULE=off
Run Code Online (Sandbox Code Playgroud)

您可能还喜欢多阶段 docker 构建,以便您的最终 docker 映像最小(例如,不包括您从中编译的源文件和 go 编译器)。docker 文档中的一个示例如下:https : //docs.docker.com/develop/develop-images/multistage-build/

  • 经过一些实验后,似乎 GO111MODULE=off 是不必要的(至少在某些情况下;在您的环境中进行测试)。 (3认同)