簡體   English   中英

使用Go app構建Docker:無法找到包

[英]Build Docker with Go app: cannot find package

我的目錄根目錄中有我的Dockerfile和src/myapp文件夾, myapp包含帶有主程序包的myapp.go

Dockerfile如下所示:

FROM golang:1.9.2

ADD . /
RUN go build myapp;

ENTRYPOINT ["/go/bin/myapp"]

我收到以下錯誤:

can't load package: package myapp: cannot find package "myapp" in any of:
    /usr/local/go/src/myapp (from $GOROOT)
    /go/src/myapp (from $GOPATH)

我究竟做錯了什么? 在docker完成ADD之后我可以記錄ls命令嗎?

經過實驗,我采用這種方式構建Golang應用程序。

這種方式有幾個優點:

  • 依賴項安裝在構建階段

  • 如果您需要,可以取消注釋測試選項

  • 構建大約800 MB的第一個全功能映像

  • 將您的程序復制到一個新的空圖像,並生成約10 MB的非常小的圖像

Dockerfile

# Two-stage build:
#    first  FROM prepares a binary file in full environment ~780MB
#    second FROM takes only binary file ~10MB

FROM golang:1.9 AS builder

RUN go version

COPY . "/go/src/github.com/your-login/your-project"
WORKDIR "/go/src/github.com/your-login/your-project"

#RUN go get -v -t  .
RUN set -x && \
    #go get github.com/2tvenom/go-test-teamcity && \  
    go get github.com/golang/dep/cmd/dep && \
    dep ensure -v

RUN CGO_ENABLED=0 GOOS=linux GOARCH=amd64 go build  -o /your-app

CMD ["/your-app"]

EXPOSE 8000



#########
# second stage to obtain a very small image
FROM scratch

COPY --from=builder /your-app .

EXPOSE 8000

CMD ["/your-app"]

您正在將所有文件復制到Image根目錄,沒有安裝任何依賴項,嘗試構建它,然后從/go/bin/app運行二進制文件。 二進制文件在該目錄中不存在,並且它正在生成錯誤。

我建議使用像這樣的Dockerfile,

FROM golang:1.9.2 
ADD . /go/src/myapp
WORKDIR /go/src/myapp
RUN go get myapp
RUN go install
ENTRYPOINT ["/go/bin/myapp"]

這將做以下事情。

  1. 將項目文件復制到/go/src/myapp
  2. 將工作目錄設置為/go/src/myapp
  3. 安裝依賴項,我用go get但用你正在使用的依賴管理工具替換它。
  4. 安裝/構建二進制文件。
  5. 設置入口點。

您可以使用docker exec運行ls或任何其他命令。

例:

docker exec <image name/hash> ls

您還可以在生成的圖像中輸入shell以便更好地理解它

docker run --rm -it <image hash/name> /bin/sh

對於go 1.11,你可以使用go模塊,以下是例子

FROM alpine AS base
RUN apk add --no-cache curl wget

FROM golang:1.11 AS go-builder
WORKDIR /go/app
COPY . /go/app
RUN GO111MODULE=on  CGO_ENABLED=0 GOOS=linux GOARCH=amd64 go build -o /go/app/main /go/app/cmd/myapp/main.go

FROM base
COPY --from=go-builder /go/app/main /main
CMD ["/main"]

myapp需要按照建議放在/go/src/myapp中,或者放在/usr/local/go/src/myapp 您可以在ADD部分添加它。

如果目標是創建一個只運行二進制文件的容器,我會采取不同的方法。

首先為linux構建二進制文件:

GOOS=linux CGO_ENABLED=0 go build -a -installsuffix cgo

然后從頭開始構建一個輕量級的docker鏡像:

FROM scratch
COPY myApp 
CMD ["/myApp"]

官方文檔建議使用以下Dockerfile:

FROM golang:1.8

WORKDIR /go/src/app
COPY . .

RUN go get -d -v ./...
RUN go install -v ./...

CMD ["app"]

請訪問https://hub.docker.com/_/golang了解更多信息

暫無
暫無

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

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