Почему тесты 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 
    amp;amp; go get github.com/bwmarrin/discordgo 
    amp;amp; go get github.com/jonas747/dshardmanager 
    amp;amp; go get github.com/bugsnag/bugsnag-go 
    amp;amp; apk del git

# Build binary
RUN go build -o main .

CMD ["/app/main"]
  

Ответ №1:

Похоже, вы столкнулись с этой проблемой: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 /

Комментарии:

1. После некоторых экспериментов выясняется, что GO111MODULE=off не нужен (по крайней мере, в некоторых случаях; протестируйте в вашей среде).