You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.21 21:53:22