亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

管理用于 docker 構建的本地/私有 Golang 包和模塊

管理用于 docker 構建的本地/私有 Golang 包和模塊

Go
開滿天機 2022-04-26 19:38:21
我對 golang 和 docker 還是很陌生,所以在查看了許多線程和互聯網資源之后,我最終對應該如何設置感到困惑。我的問題是由于未找到本地依賴項,我正面臨 golang 應用程序的 docker build 錯誤。僅供參考(本地機器):go 版本 go1.13.4 linux/amd64這是我的問題的背景:我有一個存儲庫,它將保存將在 Kubernetes 中運行的簡單微服務(用 Go 編寫)的源代碼。所以存儲庫中的每個文件夾都代表一個服務。我還有一個文件夾“工具”,它重新組合了許多服務共享的輔助功能和資源。我的存儲庫不在任何 Go 特殊路徑中,它位于我的一個驅動器的根目錄中。所以這是我的回購的樣子:.├── service1│   ├── main.go│   ├── Dockerfile│   ├── go.mod│   └── go.sum├── service2├── service3│   ...├── serviceX├── tools│   ├── helpers.go│   ├── ressources.go│   ├── go.mod└── └── go.sum因此,每個文件夾/服務都是一個獨立處理其依賴關系的 go 模塊。文件夾工具也是一個模塊。我初始化了每個模塊go mod init FOLDER_NAME在服務service1 中,我引用了模塊工具來使用一些功能。這是我實現它的方式:(./service1/main.go 的 src)package mainimport (    "fmt"    st "../tools"    // other modules imports)func main() {    st.ExecHelperFunc()    // http server inits}當我在本地運行service1 的main.go 或者如果我在本地構建它并在之后運行二進制文件時,服務工作正常。但是當我嘗試構建 service1 的dockerfile時,我得到 golang build 錯誤: build _/go/src/app/tools: cannot find module for path _/go/src/app/tools這是我的碼頭文件:FROM golang:1.13 as builderENV GO111MODULE=onWORKDIR /go/src/appCOPY ./tools ./toolsCOPY ./service1 ./service1WORKDIR /go/src/app/toolsRUN go mod downloadWORKDIR /go/src/app/service1RUN go mod downloadWORKDIR /go/src/appRUN go build -o server /go/src/app/service1/main.goFROM centos:7RUN yum -y update && yum clean allCOPY --from=builder /go/src/app/server .EXPOSE 3000CMD ["./server"]所以我不明白為什么docker無法構建服務?顯然他無法定位/識別模塊工具,但為什么呢?我為 dockerfile 嘗試了許多不同的設置,但我仍然無法弄清楚。預先感謝您的幫助。
查看完整描述

2 回答

?
胡子哥哥

TA貢獻1825條經驗 獲得超6個贊

您應該將環境變量更改GO111MODULE為 auto。


最終的 Dockerfile 是:


FROM golang:1.13 as builder

ENV GO111MODULE=auto

WORKDIR /go/src/app

COPY ./tools ./tools

COPY ./service1 ./service1


WORKDIR /go/src/app/tools

RUN go mod download

WORKDIR /go/src/app/service1

RUN go mod download


WORKDIR /go/src/app


RUN go build -o server /go/src/app/service1/main.go


FROM centos:7

RUN yum -y update && yum clean all

COPY --from=builder /go/src/app/server .

EXPOSE 3000

CMD ["./server"]

更新


在我看來,如果 GO111MODULE 等于 'auto',golang 將禁用模塊功能,并在 GOPATH 中查找第三方包。在編譯代碼之前,您應該go get -u github.com/op/go-logging. 我想這不是你想要的。


根據此處的示例,我在此處更新了我的存儲庫。您可以嘗試在 docker 容器中構建代碼。它可以構建成功,但您應該更改包名稱。


查看完整回答
反對 回復 2022-04-26
?
一只甜甜圈

TA貢獻1836條經驗 獲得超5個贊

對于面臨類似問題的任何人 - 我使用該vendor目錄解決了類似問題?;旧?,您通過運行下載主機上的依賴項,go mod vendor然后它們將自動復制到 docker 容器中。


從 Dockerfile 中,您必須刪除RUN go mod download,并且還需要使用-mod=vendor標志修改構建命令。


要構建 docker 映像,您需要運行這些命令


go mod vendor

docker build . -t image-name

我希望這會對某人有所幫助。我在這里找到了這個解決方案:https ://smartystreets.com/blog/2018/09/private-dependencies-in-docker-and-go/


查看完整回答
反對 回復 2022-04-26
  • 2 回答
  • 0 關注
  • 202 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號