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:
<code>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: </code>
任何帮助将不胜感激!!
我解决了!问题是在复制 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
以上是Docker:“go.mod 文件未找到”,当它明显存在时的详细内容。更多信息请关注PHP中文网其他相关文章!