Я пытаюсь создать контейнер Docker для своего проекта Go, но постоянно сталкиваюсь со следующей ошибкой:
=> ERROR [backend-builder 5/5] RUN --mount=type=cache,mode=0777,target=/go/pkg/mod \
--mount=type=cache,mode=0777,target=/.cache/go-build \
CGO_ENABLED=0 GOOS=linux go build -o serve ./backend/cmd/main.go: \
#17 0.343 backend/cmd/main.go:10:2: no required module provides package \
github.com/LarsDepuydt/peno-entrepreneurship-3d-oclusion/backend/cmd/serve; \
to add it: \
#17 0.343 go get github.com/LarsDepuydt/peno-entrepreneurship-3d-oclusion/backend/cmd/serve \
------
executor failed running [/bin/sh -c CGO_ENABLED=0 GOOS=linux go build -o serve ./backend/cmd/main.go]: exit code: 1
Я подозреваю, что ошибка вызвана тем, что мой файл main.go импортирует из моего проекта локальный пакет под названием serve.
Это моя структура проекта:
peno-entrepreneurship-3d-oclusion/
│
├── backend/
│ ├── cmd/
│ │ ├── main.go
│ │ └── serve/
│ │ └── serve.go
│ ├── go.mod
│ └── go.sum
│
├── Dockerfile
│
└── ... (other frontend files and directories)
Это мой оператор импорта в моем main.go:
import (
"database/sql"
"fmt"
"log"
"net/http"
"os"
"github.com/LarsDepuydt/peno-entrepreneurship-3d-oclusion/backend/cmd/serve"
)
Это мой файл докера:
################################
# Build backend
################################
FROM dev AS backend-builder
# Change the WORKDIR in the backend-builder stage
WORKDIR /usr/src/app
# pre-copy/cache go.mod for pre-downloading dependencies and only redownloading them in subsequent builds if they change
COPY ./backend/go.mod ./backend/go.sum ./
RUN --mount=type=cache,mode=0777,target=/go/pkg/mod go mod download
#RUN go get github.com/LarsDepuydt/peno-entrepreneurship-3d-oclusion/backend/cmd/serve
COPY . .
# Use native go packages (CGO_ENABLED)
RUN --mount=type=cache,mode=0777,target=/go/pkg/mod \
--mount=type=cache,mode=0777,target=/.cache/go-build \
CGO_ENABLED=0 GOOS=linux go build -o serve ./backend/cmd/main.go
Может кто-нибудь, пожалуйста, помогите мне объяснить, что здесь не так? Я пробовал много вещей с изменением пути, но не могу обойти эту ошибку.
В main.go пробовал так: "./serve"
вместо текущего импорта.
Я также пробовал много вещей, касающихся WORKDIR и пути в файле докера. Но я продолжаю получать ту же ошибку и не могу исправить ошибку.
На Dockerfile
вы используете следующие скрипты:
WORKDIR /usr/src/app
COPY ./backend/go.mod ./backend/go.sum ./
RUN --mount=type=cache,mode=0777,target=/go/pkg/mod go mod download
При этом файл go.mod
находится прямо под /usr/src/app
, и этот же путь станет корневым путем вашего модуля go.
Исходя из структуры вашего кода, go.mod
должен располагаться под /usr/src/app/backend
, а НЕ в /usr/src/app
.
Попробуйте изменить скрипт на этот ниже:
FROM dev AS backend-builder
WORKDIR /usr/src/app/backend
COPY ./backend/go.mod ./backend/go.sum ./
RUN --mount=type=cache,mode=0777,target=/go/pkg/mod go mod download
WORKDIR /usr/src/app
COPY . .
WORKDIR /usr/src/app/backend
RUN --mount=type=cache,mode=0777,target=/go/pkg/mod \
--mount=type=cache,mode=0777,target=/.cache/go-build \
CGO_ENABLED=0 GOOS=linux go build -o serve ./cmd/main.go
@DagMalstaf Я только что обновил свой ответ. Я добавил еще один WORKDIR
перед последней строкой, а также поправил скрипт RUN
в последней строке
Я все еще получил ту же ошибку.. :( Ошибка такова: > [backend-builder 6/6] RUN #18 0.348 backend/cmd/main.go:10:2: не требуется модуль, предоставляющий пакет github.com/LarsDepuydt /peno-entrepreneurship-3d-oclusion/backend/cmd/serve: файл go.mod не найден в текущем каталоге или каком-либо родительском каталоге; см. «go help modules» ------ Ошибка запуска исполнителя [/bin/ sh -c CGO_ENABLED=0 GOOS=linux go build -o serve ./backend/cmd/main.go]: код выхода: 1