Ошибка выполнения Docker без дистрибутива Golang: нет такого файла или каталога при включенном CGO

Я пытался получить минимальный пример приложения, работающего внутри контейнера докеров. Но я продолжал получатьпри запуске контейнера.

Я проверил и перепроверил все свои пути в образе, где я создал и скопировал данные своего приложения, даже заглянул внутрь контейнера с интерактивной оболочкой, чтобы проверить своибыл там, но ничего не работало.

Мой докерфайл:

      # syntax=docker/dockerfile:1
# BUILD-STAGE
FROM golang:1.17-alpine as build

WORKDIR /go/app

COPY . .

RUN go mod download

RUN go build -o /go/bin/app

# RUN-STAGE
FROM gcr.io/distroless/static-debian11

COPY --from=build /go/bin/app .

EXPOSE 8080

CMD ["./app"]

После нескольких часов проб и ошибок я, наконец, попытался добавитьк моей команде сборки.... и это сработало!

Мой вопрос сейчас .... почему именно это происходит? Когда я создал свой образ с неявно включенным CGO, не было никаких ошибок, и я даже убедился, что двоичный файл был скопирован на мой второй этап! Почему среда выполнения говорит, что такого файла нет, когда он был создан с использованием CGO, но может легко его найти, когда он был собран с отключенным CGO?

1 ответ

Образ, который вы используете, не содержит libc , с которым вы создаете свое приложение go при использованииCGO_ENABLED=1. Как было предложено в , вы можете использоватьgcr.io/distroless/base. При создании вашего приложения не было ошибок, потому что golang:1.17-alpine содержит musl libc (что-то вроде libc, но меньшего размера). Затем вы попытались запустить приложение, требующее libc, в среде, в которой его больше нет. Итакno such fileошибка.

1инструменты контейнера гугл1

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