Docker运行Golang二进制文件时遇Permission Denied问题求助
解决Docker Compose运行Go应用时的Permission Denied错误
以下是针对/bin/sh: 1: tmp/invoicer: Permission denied错误的几种排查和解决方法:
1. 确保二进制文件拥有可执行权限
在dev.Dockerfile中,构建生成二进制文件后显式添加可执行权限:
# 构建阶段 FROM golang:1.21-alpine AS builder WORKDIR /app COPY go.mod go.sum ./ RUN go mod download COPY . . RUN go build -o /tmp/invoicer . # 为二进制文件添加可执行权限 RUN chmod +x /tmp/invoicer # 运行阶段 FROM alpine:latest WORKDIR /app # 也可以直接在COPY时设置权限 COPY --chmod=755 --from=builder /tmp/invoicer /tmp/invoicer
2. 配置Air自动设置二进制权限
在.air.toml中添加post_build命令,让Air构建完成后自动赋予二进制文件可执行权限:
[build] cmd = "go build -o /tmp/invoicer ." # 构建后执行权限设置 post_build = "chmod +x /tmp/invoicer" bin = "/tmp/invoicer" include_ext = ["go", "tpl", "tmpl", "html"] exclude_dir = ["node_modules", "vendor", "testdata"]
3. 调整Docker Compose的挂载与用户配置
如果通过卷挂载了本地目录到容器的/tmp,容易引发权限继承冲突:
- 仅挂载代码目录,不要挂载二进制文件所在的
/tmp路径,让Air在容器内独立构建生成二进制 - 临时使用root用户运行服务(仅用于测试,生产环境不推荐):
services: go-app: build: context: . dockerfile: dev.Dockerfile volumes: - .:/app command: ["air"] user: root
- 或者匹配本地用户的UID/GID,避免权限不匹配:
services: go-app: # ...其他配置 user: "${UID}:${GID}"
运行前先导出环境变量:export UID=$(id -u) GID=$(id -g),再执行docker compose命令。
4. 检查容器内用户目录权限
如果Dockerfile使用了非root用户,确保该用户对/tmp目录有读写执行权限:
RUN addgroup -S appgroup && adduser -S appuser -G appgroup # 赋予用户对/tmp目录的权限 RUN chown -R appuser:appgroup /tmp USER appuser
内容的提问来源于stack exchange,提问作者noloman
相关产品推荐
相关产品推荐

