Docker构建时COPY步骤无法找到auth-svc目录的问题排查
Docker Compose构建Go多服务容器COPY目录失败的解决方案
问题解答
1. 为何无法找到auth-svc目录?
核心原因是项目根目录的.dockerignore规则过于严格,将auth-svc目录排除在了构建上下文之外。从错误信息中transferring context: 54B可以看出,构建上下文仅包含少量文件(大概率只有go.mod和go.sum),导致Docker执行COPY auth-svc ./auth-svc时找不到目标目录。
需明确:Dockerfile中COPY的源路径是相对于构建上下文,而非Dockerfile自身的存放路径,你的路径写法本身是正确的,问题不在路径语法。
2. docker-compose.yml的构建上下文设置是否有问题?
没有问题。你在/home/sohel/go/src/github.com/bizspace/deploy/docker目录下运行命令,context: ../..恰好指向项目根目录/home/sohel/go/src/github.com/bizspace/,这个上下文包含了所有服务目录和根依赖文件,完全符合Go多服务项目的构建需求。
3. 如何正确配置确保构建成功?
分两步修正:
步骤1:修正根目录的.dockerignore文件
打开项目根目录的.dockerignore,调整规则以允许服务目录被纳入构建上下文。如果原来的规则是全局忽略(比如包含*),需添加例外:
* # 保留根依赖文件 !go.mod !go.sum # 允许复制服务目录 !auth-svc/ !api-gateway/
步骤2:确认Dockerfile的COPY路径(可选优化)
你的auth-svc/deploy/Dockerfile写法本身正确,可微调以更清晰:
# Build stage FROM golang:1.22-alpine AS builder WORKDIR /app # 复制根目录的依赖清单 COPY go.mod go.sum ./ RUN go mod download # 复制auth-svc服务代码(路径相对于构建上下文:项目根目录) COPY auth-svc/ ./auth-svc/ # 构建二进制文件 RUN CGO_ENABLED=0 GOOS=linux go build -o /bin/auth-svc ./auth-svc/cmd/main.go # Final stage FROM scratch COPY --from=builder /bin/auth-svc /bin/auth-svc ENTRYPOINT ["/bin/auth-svc"]
步骤3:重新构建
回到deploy/docker目录,重新执行构建命令:
docker-compose up --build
额外验证方法
如果仍有问题,可单独构建auth-svc服务以排除docker-compose的影响:
cd /home/sohel/go/src/github.com/bizspace/deploy/docker docker build --context ../.. --file auth-svc/deploy/Dockerfile .
内容的提问来源于stack exchange,提问作者Asaduzzaman Sohel
相关产品推荐
相关产品推荐

