我正在嘗試為我的 go 服務器創建一個 dockerfile,但它一直失敗,因為它無法識別一些本地依賴項(它們是代碼本身的模塊,而不是外部依賴項)。例子:import ( "<private-repo-url>/src/cmd/http-api/bootstrap" // this a local module that's part of the server "go.uber.org/fx")func main() { fx.New(bootstrap.Module).Run()}這是錯誤: => ERROR [7/7] RUN go build -a -o ./server 0.3s------ > [7/7] RUN go build -a -o ./server:#10 0.295 server.go:4:2: no required module provides package <private-repo-url>/src/cmd/http-api/bootstrap; to add it:#10 0.295 go get <private-repo-url>/src/cmd/http-api/bootstrap------executor failed running [/bin/sh -c go build -a -o ./server]: exit code: 1請注意,此private-repo-url對應于此應用程序的存儲庫(它不是外部依賴項)。這是 DockerfileFROM golang:1.17WORKDIR /balrog# Copy dependency definitions and download themADD go.mod .ADD go.sum .RUN go mod download# Build the binaryADD ./src .ENV CGO_ENABLED=0ENV GOOS=linuxENV GOARCH=amd64RUN go build -a -o ./server#Run the serverCMD ["/server"]還有 mod.go 文件:module <private-repo-url>go 1.16require ( github.com/gin-gonic/gin v1.7.7 github.com/google/uuid v1.3.0 github.com/kelseyhightower/envconfig v1.4.0 github.com/sirupsen/logrus v1.8.1 go.uber.org/fx v1.15.0)我讀過GO111MODULE說它應該打開,并且我還讀到它從 1.17 開始默認啟用(這里)。同樣根據官方 docker 映像(在dockerhub中),正確的方法是在復制所有文件后使用go get和go install 。這種方法使我遇到了一個稍微不同的問題,即 docker 無法訪問存儲庫(因為它是私有的)并且我想避免向 docker 添加憑據。我嘗試使用環境變量GOVCS設置它的值,例如:ENV GOVCS=github.com:git,gitlab.com:off但它仍然失敗并出現同樣的錯誤。最后我嘗試了替換,我認為如果我從本地依賴項中刪除它會起作用,所以我執行了(在 Dockerfile 中)這個:RUN go mod edit -replace <private-repo-url>=./有什么方法可以防止 go builder/package installer 在外部查找這些文件?由于go mod和go get + go install 都嘗試訪問此私有存儲庫,但由于它們無權訪問而失敗。但是他們不應該首先嘗試訪問它,因為它是應用程序的存儲庫......或者我做錯了什么(顯然或者我不會在這里),錯過了什么?
1 回答

aluckdog
TA貢獻1847條經驗 獲得超7個贊
ADD ./src .
- 將內容復制src
到當前文件夾,剝離src
部分。
它應該只是COPY . ./
另請注意,不建議src
在源代碼樹中包含子文件夾 - 包含的文件夾go.mod
已經是源代碼樹。
- 1 回答
- 0 關注
- 163 瀏覽
添加回答
舉報
0/150
提交
取消