简体   繁体   English

为 Golang 代码构建一个 Docker 容器:package PACKAGE_NAME is not in GOROOT

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

I built a small Golang application and I want to run it on a Docker container.我构建了一个小型 Golang 应用程序,我想在 Docker 容器上运行它。

I wrote the following Dockerfile:我写了以下 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" ] 

However, when I run the command:但是,当我运行命令时:

docker build --tag docker-gs-ping .

I get the errors:我收到错误:

#16 0.560 found packages controllers (controller.go) and repositories (csv_file_repository.go) in /app #16 0.560 main.go:4:2: package MyExercise/controllers is not in GOROOT (/usr/local/go/src/MyExercise/controllers) #16 0.560 在 /app #16 0.560 main.go:4:2: package MyExercise/controllers 不在 GOROOT (/usr/local/go/src/我的练习/控制器)

I want to mention that the package controllers exists in my working directory and all files associated with this directory are placed in MyExercise/controllers folder.我想提一下,package 控制器存在于我的工作目录中,与此目录关联的所有文件都放在 MyExercise/controllers 文件夹中。

Do you know how to resolve this error?你知道如何解决这个错误吗?

Edit: This is the directory tree:编辑:这是目录树:

.
├── 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

import section in main.go: main.go 中的导入部分:

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

Do go mod vendor in your app directory.在您的应用程序目录中执行go mod vendor Documentaion .文档

For build the container docker build -t app:v1.用于构建容器docker build -t app:v1.

Dockerfile Dockerfile

FROM golang:1.16-alpine

WORKDIR /app/

ADD . .

RUN go build -o /app/main

EXPOSE 5055

CMD [ "/app/main" ]

There is actually an issue with your Dockerfile.实际上你的 Dockerfile 有问题。

COPY./*.

does not actually do what you think.实际上并没有按照你的想法去做。 It will copy all files recursively in a flat structure to the /app directory.它将以平面结构递归地将所有文件复制到/app目录。

Modify your Dockerfile to something like:将您的 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" ] 

Basically, remove all of the COPY directives and replace with a single ADD directive基本上,删除所有COPY指令并替换为单个ADD指令

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM