Ошибка выполнения 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
ошибка.