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
相关产品推荐
相关产品推荐

