运行Golang构建的Docker镜像报permission denied错误如何解决?
问题原因
- 核心错误为Dockerfile的COPY指令使用错误:构建阶段在
/app目录下执行go build -o app生成的是名为app的独立可执行文件,原写法COPY --from=build /app /usr/local/bin/go_webhooks会把整个/app目录复制到目标路径,最终/usr/local/bin/go_webhooks实际为目录,对目录赋予执行权限也无法作为可执行文件启动,因此触发权限报错。 - 次要可能原因:Go默认开启CGO编译,生成的二进制依赖glibc,而alpine基础镜像使用musl libc,依赖缺失也会引发类似权限报错。
- 环境配置原因:宿主机开启SELinux强制访问控制,限制了容器内文件的执行权限。
解决方案
- 优先修正Dockerfile配置,明确复制可执行文件,同时编译阶段禁用CGO生成静态链接二进制,修正后参考配置如下:
FROM golang:1.17.2-alpine3.13 as build WORKDIR /app COPY . . # 禁用CGO编译静态二进制,规避alpine依赖问题 RUN CGO_ENABLED=0 go build -o app FROM alpine:3.7 # 明确复制单个可执行文件而非整个目录 COPY --from=build /app/app /usr/local/bin/go_webhooks RUN chmod +x /usr/local/bin/go_webhooks ENTRYPOINT ["/usr/local/bin/go_webhooks"]
重新构建镜像后启动即可解决90%以上该类问题。
2. 若修正配置后仍报错,可验证是否为SELinux导致:
- 临时关闭SELinux验证:执行
setenforce 0后重新启动容器 - 如需永久关闭,可修改
/etc/selinux/config文件,将SELINUX字段值改为disabled,重启宿主机后生效。
- 临时验证也可在docker run命令中添加
--privileged参数提升权限:
docker run --privileged -p 8000:8000 --name go_webs3 d5f30e8f9703
内容的提问来源于stack exchange,提问作者Roshan Twanabasu
相关产品推荐
相关产品推荐

