# #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. Спасибо за ваш ответ, однако в нем немного не хватает деталей, и, скорее всего, он будет просто удален. Вы могли бы сказать, на каком этапе сборки вы установили это, например? Вы должны объяснить, почему это ответ.