CGO_Enabled=1 требуется создание двоичного файла Go с использованием SQLite в контейнере Alpine Docker

# #docker #sqlite #go #alpine #go-gorm

Вопрос:

Я пытаюсь скомпилировать контейнер Alpine Go, который использует GORM, и это драйвер SQLite для базы данных в памяти. Это зависит от того, включен ли CGO. Мой двоичный файл строится и выполняется нормально go build . , но при запуске моего образа docker ( docker build . за которым следует docker run $imagename ) Я получаю сообщение об ошибке:

 standard_init_linux.go:219: exec user process caused: no such file or directory
 

Я строю на 64-разрядной версии Windows 10. У меня установлен gcc. Оба C:TDM-GCC-64bin и C:cygwin64bin находятся в моем $env:пути. Я изменил окончания строк на стиль Linux (LF) для всех файлов в пакете.

Мой файл docker выглядит следующим образом:

 FROM golang:1.16.4-alpine AS builder

RUN apk update 
    amp;amp; apk add --no-cache git 
    amp;amp; apk add --no-cache ca-certificates 
    amp;amp; apk add --update gcc musl-dev 
    amp;amp; update-ca-certificates

# Create a user so that the image doens't run as root
RUN adduser 
    --disabled-password 
    --gecos "" 
    --home "/nonexistent" 
    --shell "/sbin/nologin" 
    --no-create-home 
    --uid "100001" 
    "appuser"

# Set the working directory inside the container.
WORKDIR $GOPATH/src/app

# Copy all files from the current directory to the working directory
COPY . .

# Fetch dependencies.
RUN go get -u -d -v

# Go build the binary, specifying the final OS and architecture we're looking for
RUN GOOS=linux CGO_ENABLED=1 GOARCH=amd64 go build -ldflags="-w -s" -o /go/bin/app -tags timetzdata

FROM scratch

# Import the user and group files from the builder.
COPY --from=builder /etc/passwd /etc/passwd
COPY --from=builder /etc/group /etc/group
COPY --from=builder /etc/ssl/certs/ca-certificates.crt /etc/ssl/certs/

# Copy our static executable.
COPY --from=builder /go/bin/app/go/bin/app

# Use the user that we've just created, one that isn't root
USER appuser:appuser

ENTRYPOINT ["/go/bin/app"]
 

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

В случае, если это имеет какое-либо значение, строка кода Go для открытия базы данных выглядит так. Поскольку это работает с использованием Go build локально или с использованием go run . , я не думаю, что это имеет значение, однако.

 db, err := gorm.Open(sqlite.Open("file::memory:?cache=shared"), amp;gorm.Config{})
 

Ответ №1:

Libc не существует в scratch. Я изменил его на alpine, и это решило эту ошибку.

Ответ №2:

Решением было установить пакеты gcc и alpine-sdk с использованием apk в файле Dockerfile. В приведенном выше вопросе устанавливался только gcc.

Комментарии:

1. Спасибо за ваш ответ, однако в нем немного не хватает деталей, и, скорее всего, он будет просто удален. Вы могли бы сказать, на каком этапе сборки вы установили это, например? Вы должны объяснить, почему это ответ.