Docker build как добавить библиотеки в golang build - PullRequest
3 голосов
/ 18 января 2020

Я создаю GO приложение, имеющее дело с Apache Пульсар. Go клиенту требуются библиотеки C ++, как указано в документации Pulsar (то же самое относится и к Kafka).

Я хочу упаковать все это в контейнер, как можно меньше. Я обычно использую SCRATCH и копирую вывод из другого контейнера golang. К сожалению, я не могу получить внешние библиотеки из этого исходного контейнера:

FROM golang:latest as builder
ENV GO111MODULE=on \
CGO_ENABLED=0 \
GOOS=linux \
GOARCH=amd64                                                                                                                                                                                                                                                                                                                                                                                                                                                                 
ARG DOCKER_GIT_CREDENTIALS
WORKDIR /builder
ADD . /builder
RUN git config --global credential.helper store && echo "${DOCKER_GIT_CREDENTIALS}" > ~/.git-credentials
RUN make build
RUN echo $(go list -m) && mv bin/$(go list -m) app

FROM SCRATCH
COPY --from=builder /builder/app app
EXPOSE 8080
ENTRYPOINT ["./app"]

При использовании этого происходит сбой сборки, поиск пропущенных символов

/go/pkg/mod/github.com/apache/pulsar/pulsar-client-go@v0.0.0-20200118070759-21660e9402f8/pulsar/client.go:29:9: undefined: newClient
...

во время локальной сборки.

Как правильно интегрировать нужные мне библиотеки?

1 Ответ

6 голосов
/ 18 января 2020

Поскольку используемая вами библиотека имеет зависимость от C ++ lib, для правильной сборки образа Pulsar Golang client docker необходимо использовать Docker stage build. У нас есть точный вариант использования. Вам нужно скачать и установить Pulsar C ++ lib для сборки и образа во время выполнения в Dockerfile.

Это наш docker файл https://github.com/kafkaesque-io/pulsar-beam/blob/master/Dockerfile. Я также предлагаю использовать модуль Go для создания и управления зависимостями Go как часть Docker stage build. Вот как мы это делаем. Надеюсь, это поможет.

RUN wget --user-agent=Mozilla -O apache-pulsar-client.deb "https://archive.apache.org/dist/pulsar/pulsar-2.4.1/DEB/apache-pulsar-client.deb"
RUN wget --user-agent=Mozilla -O apache-pulsar-client-dev.deb "https://archive.apache.org/dist/pulsar/pulsar-2.4.1/DEB/apache-pulsar-client-dev.deb"

RUN apt install -y ./apache-pulsar-client.deb
RUN apt install -y ./apache-pulsar-client-dev.deb

# Copy go mod and sum files
COPY go.mod go.sum ./

# Download all dependencies. Dependencies will be cached if the go.mod and go.sum files are not changed
RUN go mod download

Я использую стандартный образ Ubuntu для сборки, а также образ во время выполнения. Я понимаю, что вы ищете наименьший возможный размер изображения. ubuntu:18.04 имеет меньшую площадь. Вы также можете попробовать Alpine, который я еще не тестировал.

Кстати, Apache предлагает отдельную нативную клиентскую библиотеку Pulsar Go без зависимости от C ++. На момент написания статьи в январе 2020 года все еще отсутствуют такие функции, как настраиваемый режим маршрутизации для разделенных тем. Если эти функции не требуются в вашем проекте, я предлагаю попробовать собственную клиентскую библиотеку Go, чтобы избежать зависимости от C ++. Мы планируем вскоре перейти на новую нативную библиотеку по той же причине.

...