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

Docker-Compose构建Go项目报错:no Go files in /usr/local/go/src/database

问题解决步骤

一、修复Go编译错误

1. 本地初始化Go模块

在你的database项目根目录执行:

go mod init database
go mod tidy

这会生成go.mod和go.sum文件,用于管理项目依赖。

2. 修改Dockerfile

调整后的Dockerfile如下:

FROM golang:1.18.2-alpine

# 安装git、postgresql-client依赖(拉取Go模块、检查Postgres状态需要)
RUN apk add --no-cache git postgresql-client

# 启用Go Modules模式
ENV GO111MODULE=on

# 先复制go.mod和go.sum,利用Docker缓存提升构建效率
COPY go.mod go.sum /appDatabase/
WORKDIR /appDatabase

# 下载项目依赖
RUN go mod download

# 复制项目所有文件
COPY . .

# 编译生成可执行文件
RUN go build -o ./main

CMD [ "./main" ]

错误原因:

原Dockerfile未启用Go Modules,Go默认使用GOPATH模式,会去/usr/local/go/src/database路径查找包,但你的代码实际在/appDatabase目录,导致找不到包编译失败。启用模块模式后,Go会基于当前目录的go.mod文件管理依赖和本地包。

二、确保Postgres就绪后执行数据库配置

1. 配置容器启动依赖

修改docker-compose.yml中database_runner的配置,添加depends_on保证Postgres容器先启动:

database_runner:
  container_name: databaseRunner
  hostname: databaseRunner
  build:
    context: .
    dockerfile: Dockerfile
  networks:
    - database
  depends_on:
    - postgres # 替换为你的Postgres服务名称

2. 等待Postgres服务完全就绪

depends_on仅保证容器启动顺序,无法确保Postgres服务就绪。需要添加检查脚本:

  • 在项目根目录创建wait-for-postgres.sh脚本:
#!/bin/sh
set -e

host="$1"
shift
cmd="$@"

# 循环检查Postgres是否就绪
until pg_isready -h "$host" -p 5432; do
  >&2 echo "Postgres未就绪 - 等待2秒"
  sleep 2
done

>&2 echo "Postgres已就绪 - 执行启动命令"
exec $cmd
  • 给脚本添加执行权限:
chmod +x wait-for-postgres.sh
  • 修改Dockerfile的CMD指令:
CMD ["./wait-for-postgres.sh", "postgres", "./main"] # "postgres"替换为你的Postgres服务hostname

内容的提问来源于stack exchange,提问作者mahdi gadget

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.01 10:26:02