猿问

将 Go 服务器作为 Docker 容器运行时出现权限被拒绝错误

我想将我的 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.

感谢您的帮助。


汪汪一只猫
浏览 239回答 3
3回答

Helenr

潜在问题1如果更改alpine为debian适合您,则意味着这是交叉编译的问题。该golang映像基于 debian,并使用 glibc,alpine映像使用 musl libc。有时,它们不兼容,并会出现最糟糕的错误消息。所以我怀疑这不是 Cloud Run 问题,而是之前的问题。潜在问题2类似的事情曾经发生在我身上,结果证明我正在构建的包不是 package main。因此,我没有生成可执行二进制文件,而是生成了一个目标文件 (.o),当然,无论我如何努力“chmod +x”,它都不会启动。验证您正在构建的 go 包路径实际上是package main.

饮歌长啸

尝试添加RUN chmod a+x 到最终版本。COPY --from=builder /app/server /server RUN chmod a+x /server CMD ["/server"]

holdtom

显然,这可能是因为 alpine linux 过于精简,以至于缺少容器正常构建或运行所需的关键软件包。对于我的情况,它丢失了git。我git在 ca-certificates 之后添加到 RUN 行,以确保它已安装。进行此更改后,我的 Cloud Run 实例可以正常运行。# Use the official Golang image to create a build artifact.# This is based on Debian and sets the GOPATH to /go.FROM golang:1.19 as builder# Create and change to the app directory.WORKDIR /app# Retrieve application dependencies using go modules.# Allows container builds to reuse downloaded dependencies.COPY go.* ./RUN go mod download# Copy local code to the container image.COPY . ./# Build the binary.# -mod=readonly ensures immutable go.mod and go.sum in container builds.RUN CGO_ENABLED=0 GOOS=linux go build -mod=readonly -v -o server# Use the official Alpine image for a lean production container.# https://hub.docker.com/_/alpine# https://docs.docker.com/develop/develop-images/multistage-build/#use-multi-stage-buildsFROM alpine:3RUN apk add --no-cache ca-certificates git# Copy the binary to the production image from the builder stage.COPY --from=builder /app/server /server# Run the web service on container startup.CMD ["/server"]
随时随地看视频慕课网APP

相关分类

Go
我要回答