go - 为什么 go 测试突然需要 "gcc"?

标签 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

根据 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"]

最佳答案

您似乎遇到了这个问题:https://github.com/golang/go/issues/26988

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

CGO_ENABLED=0 GO111MODULE=off

您可能还更喜欢多阶段 docker 构建,这样您的最终 docker 镜像就会最小(例如,不包括您从中编译的源文件和 go 编译器)。 docker 文档中的示例位于此处:https://docs.docker.com/develop/develop-images/multistage-build/

关于go - 为什么 go 测试突然需要 "gcc"?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55442155/

相关文章:

function - 如何在 Go 中通过反射测试一组函数?

templates - Golang 模板.ParseFiles "not a directory"错误

mongodb - 维护 mgo session 的最佳实践

Go- 合并两个结构的值,采用非空字段

go - ([]Constructor)(nil) 是什么意思

go - 无法使用 golang 和 net/http 包分配请求的地址

multithreading - 无法连接时停止 channel

mongodb - 使用 mgo 对 MongoDB 的并发查询以封闭的套接字结束

go - 如何将golang变量设置为模板变量

go - 在 for 循环中使用多个表达式