Вот файл Dockerfile, который я использую для создания приложения Golang и рабочего
FROM golang:1.15 AS build
RUN mkdir -p /go/api/proj
WORKDIR /go/api/proj
COPY go.* ./
RUN go mod download
COPY . .
RUN go mod tidy
RUN go build -o proj ./api/
RUN go build -o worker ./worker/
FROM alpine:3.14
WORKDIR /
RUN apk add libc6-compat cmake
RUN ln -s /lib/libc.musl-x86_64.so.1 /lib/ld-linux-x86-64.so.2
COPY . .
COPY --from=build /go/api/proj/proj .
COPY --from=build /go/api/proj/worker .
EXPOSE 80
CMD ["./worker"]
Мне пришлось добавить libc6-compat, потому что установка kafka в worker не была совместима с musl-библиотекой alpine.
Вот ошибка, которую я получил при попытке запустить работника в контейнере докеров
Error relocating ./worker: __strdup: symbol not found
Error relocating ./worker: __isnan: symbol not found
Error relocating ./worker: __strndup: symbol not found
Может ли кто-нибудь предложить, что здесь происходит не так, и решение для этого?
Я использую confluent kafka в worker, что может быть причиной этой ошибки.
Моя цель - иметь окончательный размер сборки менее 100 МБ. с этим файлом докера он составляет около 80 МБ. Если я перейду на образ на базе Debian, получится около 200 МБ.
Может ли кто-нибудь предложить, что здесь происходит не так, и решение для этого?
Что вы здесь делаете:
RUN ln -s /lib/libc.musl-x86_64.so.1 /lib/ld-linux-x86-64.so.2
притворяется, что Мусл - это GLIBC. Это не так, и это не работает.
Из FAQ по Musl:
Двоичная совместимость гораздо более ограничена, но она будет постоянно увеличиваться с новыми версиями musl. В настоящее время некоторые общие библиотеки, связанные с glibc, могут быть загружены с помощью musl, но все, кроме самых простых приложений, связанных с glibc, не будут работать, если вместо
/lib/ld-linux.so.2
вставить musl.
Вместо того, чтобы создавать бинарный файл worker
для GLIBC, а затем пытаться запустить его с помощью Musl, вы должны собрать его для Musl.
Спасибо большое за Ваш комментарий. Сначала я пытался использовать только musl, но это не удалось из-за какой-то проблемы с librdkafka. Но после прочтения вашего комментария я решил попробовать, и это РАБОТАЛО, добавив следующие библиотеки: make gcc libtool musl-dev
У Alpine есть модифицированная системная библиотека C, которая может привести к подобной несовместимости. Можете ли вы использовать изображение
debian
илиubuntu
в качестве основы для финальной стадии или использовать этап сборки на основе Alpine?