簡體   English   中英

為 Golang 代碼構建一個 Docker 容器:package PACKAGE_NAME is not in GOROOT

[英]Building a Docker container for Golang code: package PACKAGE_NAME is not in GOROOT

我構建了一個小型 Golang 應用程序,我想在 Docker 容器上運行它。

我寫了以下 Dockerfile:

# syntax=docker/dockerfile:1

FROM golang:1.16-alpine

WORKDIR /app

COPY go.mod ./
COPY go.sum ./
RUN go mod download

COPY ./* .
RUN go env -w GO111MODULE=on

RUN go build -o /docker-gs-ping

EXPOSE 8080

CMD [ "/docker-gs-ping" ] 

但是,當我運行命令時:

docker build --tag docker-gs-ping .

我收到錯誤:

#16 0.560 在 /app #16 0.560 main.go:4:2: package MyExercise/controllers 不在 GOROOT (/usr/local/go/src/我的練習/控制器)

我想提一下,package 控制器存在於我的工作目錄中,與此目錄關聯的所有文件都放在 MyExercise/controllers 文件夾中。

你知道如何解決這個錯誤嗎?

編輯:這是目錄樹:

.
├── Dockerfile
├── REDAME
├── controllers
│   └── controller.go
├── go.mod
├── go.sum
├── logging
│   └── logger.go
├── main.go
├── models
│   └── location.go
├── output.log
├── repositories
│   ├── csv_file_repository.go
│   ├── csv_file_repository_builder.go
│   ├── csv_file_repository_builder_test.go
│   ├── csv_file_repository_test.go
│   ├── repository_builder_interface.go
│   ├── repository_interface.go
│   └── resources
│       └── ip_address_list.txt
└── services
    ├── ip_location_service.go
    ├── ip_location_service_test.go
    ├── rate_limiter_service.go
    ├── rate_limiter_service_interface.go
    ├── rate_limiter_service_test.go
    └── time_service.go

main.go 中的導入部分:

import (
    "MyExercise/controllers"
    "MyExercise/logging"
    "MyExercise/repositories"
    "MyExercise/services"
    "errors"
    "github.com/gin-gonic/gin"
    "os"
    "strconv"
    "sync"
)

在您的應用程序目錄中執行go mod vendor 文檔

用於構建容器docker build -t app:v1.

Dockerfile

FROM golang:1.16-alpine

WORKDIR /app/

ADD . .

RUN go build -o /app/main

EXPOSE 5055

CMD [ "/app/main" ]

實際上你的 Dockerfile 有問題。

COPY./*.

實際上並沒有按照你的想法去做。 它將以平面結構遞歸地將所有文件復制到/app目錄。

將您的 Dockerfile 修改為:

# syntax=docker/dockerfile:1

FROM golang:1.16-alpine

WORKDIR /app

ADD . /app

RUN go mod download

RUN go env -w GO111MODULE=on

RUN go build -o /docker-gs-ping

EXPOSE 8080

CMD [ "/docker-gs-ping" ] 

基本上,刪除所有COPY指令並替換為單個ADD指令

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM