Docker是一种流行的容器化技术,但有时在构建镜像时会遇到奇怪的问题。其中一个常见的问题是在构建过程中出现“go.mod 文件未找到”的错误提示,尽管该文件明显存在。这个问题可能让人困惑,但实际上有几个可能的原因和解决方法。在本文中,我们将探讨这个问题,并为你提供一些解决方案。php小编百草将帮助你理解并解决这个问题,让你的Docker构建顺利进行。
问题内容
我正在尝试制作一个使用 go 后端和 nextjs 前端(我尚未创建)的全栈应用程序。我正在遵循制作后端的教程,到目前为止一切正常。但是,我想将后端内容移到自己的文件夹中,这样我就可以将其和前端分开。现在,每当我运行 docker compose build
时,它都会顺利完成,但是当我运行 docker compose up
时,这就是我得到的(我正在使用空气来实现热重载功能):
goapp-1 | watching .
goapp-1 | watching backend
goapp-1 | watching backend/cmd
goapp-1 | watching backend/cmd/database
goapp-1 | watching backend/cmd/handlers
goapp-1 | watching backend/cmd/models
goapp-1 | watching backend/tmp
goapp-1 | !exclude tmp
goapp-1 | building...
goapp-1 | go: go.mod file not found in current directory or any parent directory; see 'go help modules'
goapp-1 | failed to build, error: exit status 1
但是,当我进入 Docker 桌面并在该映像中运行 ls
时,它显示 go.mod
就在那里!
那么问题出在哪里呢?
我尝试更改 compose.yaml
和我的 dockerfile 中的目标目录和上下文,但都没有成功。运行 go build
而不是 air
也会给我同样的错误。
这是我的文件树:
databeis2
┣ .vscode
┃ ┗ settings.json
┣ backend
┃ ┣ cmd
┃ ┃ ┣ ...
┃ ┃ ┣ main.go
┃ ┃ ┗ routes.go
┃ ┣ tmp
┃ ┃ ┣ build-errors.log
┃ ┃ ┗ main
┃ ┣ .air.toml
┃ ┣ Dockerfile
┃ ┣ go.mod
┃ ┣ go.sum
┃ ┗ pre_cmd.txt
┣ tmp
┃ ┗ build-errors.log
┣ .env
┗ compose.yaml
我的docker文件:
FROM golang:1.21
WORKDIR /app
RUN go install github.com/cosmtrek/air@latest
COPY . .
RUN go mod tidy
和 compose.yaml:
services:
goapp:
build:
context: ./backend
env_file:
- .env
ports:
- 8000:8000
volumes:
- .:/app
command: air ./cmd/main.go -b 0.0.0.0
depends_on:
- db
db:
image: postgres:alpine
environment:
- POSTGRES_USER=${DB_USER}
- POSTGRES_PASSWORD=${DB_PASSWORD}
- POSTGRES_DB=${DB_NAME}
ports:
- 5432:5432
volumes:
- postgres-db:/var/lib/postgresql/data
volumes:
postgres-db:
任何帮助将不胜感激!!
解决方法
我解决了!问题是在复制 dockerfile 中的文件后,我需要将 WORKDIR
更改为 backend
。
FROM golang:1.21
WORKDIR /app
RUN go install github.com/cosmtrek/air@latest
COPY . .
# Add the below line
WORKDIR /app/backend
RUN go mod tidy