Изображение докера Alpine __isnan: символ не найден

Вот файл 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, что может быть причиной этой ошибки.

У Alpine есть модифицированная системная библиотека C, которая может привести к подобной несовместимости. Можете ли вы использовать изображение debian или ubuntu в качестве основы для финальной стадии или использовать этап сборки на основе Alpine?

David Maze 07.10.2022 21:53

Моя цель - иметь окончательный размер сборки менее 100 МБ. с этим файлом докера он составляет около 80 МБ. Если я перейду на образ на базе Debian, получится около 200 МБ.

dhaval agrawal 07.10.2022 22:17
Развертывание модели машинного обучения с помощью Flask - Angular в Kubernetes
Развертывание модели машинного обучения с помощью Flask - Angular в Kubernetes
Kubernetes - это портативная, расширяемая платформа с открытым исходным кодом для управления контейнерными рабочими нагрузками и сервисами, которая...
Как создать PHP Image с нуля
Как создать PHP Image с нуля
Сегодня мы создадим PHP Image from Scratch для того, чтобы легко развернуть базовые PHP-приложения. Пожалуйста, имейте в виду, что это разработка для...
1
2
295
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Может ли кто-нибудь предложить, что здесь происходит не так, и решение для этого?

Что вы здесь делаете:

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

dhaval agrawal 10.10.2022 17:32

Другие вопросы по теме