Ошибка «Отказано в доступе» при запуске сервера Go как контейнера Docker - PullRequest
1 голос
/ 20 марта 2020

Я бы хотел развернуть свой сервер Go в Google Cloud Run. Я скопировал Dockerfile из этого руководства.

FROM golang:1.13 as builder

WORKDIR /app

COPY go.* ./
RUN go mod download

COPY . ./

RUN CGO_ENABLED=0 GOOS=linux go build -v -o server
RUN chmod a+x server

FROM alpine:3
RUN apk add --no-cache ca-certificates

COPY --from=builder /app/server /server

CMD ["/server"]

Прежде чем развертывать его в Cloud Run, я хотел проверить его локально, создав образ с помощью docker build -t server . и запустив контейнер с помощью docker run server.

Не удается выполнить следующую ошибку:

docker: Error response from daemon: OCI runtime create failed: container_linux.go:346: starting container process caused "exec: \"/server\": permission denied": unknown.

Спасибо за помощь.

1 Ответ

1 голос
/ 25 марта 2020

Потенциальная проблема 1

Если изменение alpine на debian работает для вас, это означает, что это проблема с кросс-компиляцией.

The golang image основан на debian и использует glib c, alpine image использует musl lib c. Иногда они имеют несовместимость и выдают себя в худших возможных сообщениях об ошибках.

Так что я подозреваю, что это не проблема Cloud Run, а что-то до этого. Для проверки вы также можете запустить свой контейнер локально, как если бы он работал в облачной среде https://cloud.google.com/run/docs/testing/local


Потенциальная проблема 2

Нечто подобное случилось со мной однажды, и оказалось, что пакет, который я собирал, не был package main. Поэтому вместо того, чтобы создавать исполняемый двоичный файл, я создавал объектный файл (.o), и, конечно, независимо от того, насколько сильно я "chmod + x", он не запускался.

Проверьте пакет go путь, который вы строите на самом деле это package main.

...