启动容器进程导致"exec:"/app": 权限被拒绝":未知。

7

当我尝试使用Docker构建Golang时

Docker镜像构建成功,但在使用"docker run"运行时出现以下错误。

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

我认为这个错误是由于没有用户添加,因此我添加了以下组和用户。
RUN groupadd -g 10001 myapp \
    && useradd -u 10001 -g myapp myapp

但没有解决。

这是我的源Docker文件。

FROM golang:1.12.9 as builder

ADD . /go/src/appname/

WORKDIR /go/src/appname/

ENV GO111MODULE=on

COPY go.mod .
COPY go.sum .

RUN go mod download
COPY . .

RUN  CGO_ENABLED=0 GOOS=linux GOARCH=amd64 make build target=prod

FROM alpine

RUN apk update \
  && apk add --no-cache

COPY --from=builder /go/src/ /app

ENTRYPOINT [ "/app" ]

谢谢


你的入口点是一个文件夹,因此你得到了“权限被拒绝”的错误。尝试将其设置为真正的可执行文件... - LinPy
如果您的二进制文件位于Docker上的/app目录中,那么在复制后,请尝试使用以下命令为其启用执行权限:RUN chmod +x /app - Latheesan
3个回答

5
在这一步中,你将整个源文件夹复制到目录/app中:
COPY --from=builder /go/src/ /app

然后您尝试执行该目录:

ENTRYPOINT [ "/app" ]

相反,你需要在复制步骤中复制你的go build输出的编译二进制文件。


1
@jadejoe,这个回答(具体来说是英文文本的最后一行)告诉你做的事情和你在 新的自问自答中提到 解决了问题的方法完全一样。为什么要添加新的答案,而不是接受这个答案呢? - Charles Duffy
@Charles Duffy,没错。这是一个重要的提示。 我实际上写下了我的答案,因为我需要正确展示golang二进制文件。非常感谢。 - jadejoe

3
你需要指定输出目录给你的二进制文件。

RUN CGO_ENABLED=0 GOOS=linux GOARCH=amd64 go build -a -o /app .


然后复制应用程序目录

COPY --from=builder /app ./
RUN chmod +x ./app
ENTRYPOINT ["./app"]

0
感谢大家的建议,我解决了这个问题。
我之前无法正确地使用构建二进制文件进行复制。
在此之前。
COPY --from=builder /go/src/ /app

之后

COPY --from=builder /go/src/build/build_app_name /app

谢谢!


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接