Go сборка в docker контейнере намного медленнее, чем в root системе - PullRequest
0 голосов
/ 28 февраля 2020

Я пытаюсь собрать пакет go с помощью следующей команды:

CGO_ENABLED=0 GOOS=linux go build -o bin/router -installsuffix cgo -ldflags '-w'

На моем p c это занимает около 0,5 секунды. Та же команда в контейнере docker занимает 45 секунд.

RUN CGO_ENABLED=0 GOOS=linux go build -o /app/router -installsuffix cgo -ldflags '-w' /build/src/global/router

Локально у меня есть go версия 1.12.9 linux/amd64. Контейнер docker использует образ golang:1.13 в качестве базы.

Я полагаю, что процесс сборки docker имеет меньше доступных процессоров, но имеет ли это большое значение? В чем может быть причина этой проблемы?

Воспроизводится с минимальным примером:

main.go:

package main

import "log"

func main() {
    log.Println("test")
}

Dockerfile:

FROM golang:1.13

ADD main.go .

RUN CGO_ENABLED=0 GOOS=linux go build -o main -installsuffix cgo -ldflags '-w'

CMD [ "main" ]

Команда внутри контейнера docker занимает около 5 секунд по сравнению с <0,1 секунды на моем p c. </p>

1 Ответ

1 голос
/ 28 февраля 2020

По моему мнению, проблема не в сборке самого контейнера.

$ go clean
$ time GO_ENABLED=0 GOOS=linux go build -o main -installsuffix cgo -ldflags '-w'

real    0m0,233s
user    0m0,278s
sys 0m0,094s

$ time GO_ENABLED=0 GOOS=linux go build -o main -installsuffix cgo -ldflags '-w'

real    0m0,076s
user    0m0,098s
sys 0m0,053s

$ go clean
$ time GO_ENABLED=0 GOOS=linux go build -o main -installsuffix cgo -ldflags '-w'

real    0m0,238s
user    0m0,315s
sys 0m0,070s

Вы можете увидеть время, которое сборка занимает после 'go clean' в компиляции последовательных компиляций.

SYNOPSIS go clean [-i] [-r] [-n] [-x] [пакетов]

ОПИСАНИЕ Clean

удаляет объектные файлы из исходных каталогов пакетов , Команда go создает большинство объектов во временном каталоге, поэтому go clean в основном относится к объектным файлам, оставленным другими инструментами, или к ручным вызовам go build.

https://manpages.debian.org/testing/golang-go/go-clean.1.en.html

При каждой попытке сборки на вашем компьютере вы очищаете папку сборки?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...