【问题标题】:Golang cannot find package in Docker imageGolang 在 Docker 镜像中找不到包
【发布时间】:2019-08-26 01:48:58
【问题描述】:

所以,我正在尝试使用包含我的主文件的补充代码的不同目录对一个 golang 应用程序进行 dockerize。 我正在使用 gorilla/mux。目录结构如下所示。

$GOPATH/src/github.com/user/server
  |--- Dockerfile 
  |--- main.go 
  |--- routes/ 
         handlers.go 
  |--- public/ 
         index.gohtml 

它在我的主机上运行没有问题。问题是,当我尝试部署 docker 映像时,它不会运行并在创建后不久退出。我尝试将我的 dockerfile 中的 WORKDIR 命令更改为 /go/src 并将我的所有文件转储到那里,但仍然没有运气。我还尝试了docker hub 上的官方文档。也不行。

我的 Dockerfile。

FROM golang:latest  
WORKDIR /go/src/github.com/user/server
COPY . .
RUN go get -d github.com/gorilla/mux

EXPOSE 8000
CMD ["go","run","main.go"]

我的 golang ma​​in.go

package main 

import (
    "github.com/gorilla/mux"
    "github.com/user/server/routes"
    "log"
    "net/http"
    "time"
)
func main(){
  //... 
}

我在检查 docker 映像的日志时收到此错误消息。

错误信息

main.go:5:2: cannot find package "github.com/user/server/routes" in any of:
    /usr/local/go/src/github.com/user/server/routes (from $GOROOT)
    /go/src/github.com/user/server/routes (from $GOPATH)

【问题讨论】:

  • 你试过在你的图片中运行tree/ls -R吗?

标签: docker go


【解决方案1】:

试试下面的Docker文件:

# GO Repo base repo
FROM golang:1.12.0-alpine3.9 as builder

RUN apk add git

# Add Maintainer Info
LABEL maintainer="<>"

RUN mkdir /app
ADD . /app
WORKDIR /app

COPY go.mod go.sum ./

# Download all the dependencies
RUN go mod download

COPY . .

# Build the Go app
RUN CGO_ENABLED=0 GOOS=linux go build -a -installsuffix cgo -o main .

# GO Repo base repo
FROM alpine:latest

RUN apk --no-cache add ca-certificates curl

RUN mkdir /app

WORKDIR /app/

# Copy the Pre-built binary file from the previous stage
COPY --from=builder /app/main .

# Expose port 8000
EXPOSE 8000

# Run Executable
CMD ["./main"]

在这里,我们正在创建一个中间docker builder 容器,将代码复制到其中,在builder 容器中构建代码,然后将binary 图像复制到实际的docker。

这将有助于在最终容器中拥有所有依赖项,并且最终图像的大小将非常小

【讨论】:

  • 这与问题中的内容有何不同,为什么会有帮助? (值得注意的是,这个问题似乎没有使用 Go 模块。)
  • 这将download go.mod 中提到的所有依赖项,因此不必手动安装任何依赖项。 (我尝试过类似修复依赖错误的方法。希望它也对 OP 有所帮助)
  • 是的,这行得通。谢谢 !!!我不知道go.mod,我会更多地研究它。我只需要写 go mod initgo mod tidy 来创建附加文件。
  • 没有其他选项不需要一直重建镜像吗?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-11-27
  • 1970-01-01
  • 1970-01-01
  • 2023-02-01
  • 1970-01-01
  • 2021-11-17
相关资源
最近更新 更多