duanne9313 2019-08-25 17:38
浏览 277
已采纳

Golang在Docker映像中找不到软件包

So, I am trying to dockerize a golang application with different directories containing supplementary code for my main file. I am using gorilla/mux. The directory structure looks like this.

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

It works on my host machine with no problem. The problem is that when I try to deploy the docker image it does not run and exits shortly after creation. I have tried changing the WORKDIR command in my dockerfile to /go/src and dump all my files there, but still no luck. I have also tried the official documentation on docker hub. Doesn't work either.

My 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"]

My golang main.go

package main 

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

I get this error message when I check the logs of my docker image.

Error Message

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)
  • 写回答

1条回答 默认 最新

  • dongyunshan4066 2019-08-25 17:45
    关注

    Try the following Docker file:

    # 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"]
    

    Here, we are creating an intermediate docker builder container, copying the code into it, build the code inside the builder container and then copy the binary image to the actual docker.

    This will help in both having all the dependencies in the final container and also, the size of the final image will be very small

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论

报告相同问题?

悬赏问题

  • ¥15 在若依框架下实现人脸识别
  • ¥15 网络科学导论,网络控制
  • ¥100 安卓tv程序连接SQLSERVER2008问题
  • ¥15 利用Sentinel-2和Landsat8做一个水库的长时序NDVI的对比,为什么Snetinel-2计算的结果最小值特别小,而Lansat8就很平均
  • ¥15 metadata提取的PDF元数据,如何转换为一个Excel
  • ¥15 关于arduino编程toCharArray()函数的使用
  • ¥100 vc++混合CEF采用CLR方式编译报错
  • ¥15 coze 的插件输入飞书多维表格 app_token 后一直显示错误,如何解决?
  • ¥15 vite+vue3+plyr播放本地public文件夹下视频无法加载
  • ¥15 c#逐行读取txt文本,但是每一行里面数据之间空格数量不同