我有一個非常簡單的項目 - 一個具有以下目錄結構的 Go API
├── Dockerfile
├── go.mod
├── go.sum
├── main.go
└── user
├── repository.go
└── user.go
我的 Dockerfile 看起來像這樣
FROM golang:1.17-alpine
WORKDIR /app
COPY go.mod ./
COPY go.sum ./
RUN go mod download
COPY *.go ./
RUN go build -o /api
CMD [ "/api" ]
我不斷收到此錯誤:
[7/7] RUN go build -o /api: #11 0.462 main.go:4:2: package api/user is not in GOROOT (/usr/local/go/src/api/user)
讀了一點之後,看起來我可能需要設置一個 github 存儲庫,然後從 git 中提取代碼?我認為這真的很瘋狂,因為代碼就在 Docker 鏡像中。
如何在不設置 git repo 的情況下構建/Dockerize 這個 Go 項目github.com/alex/someproject
?詢問是因為我不想將其發佈到 github 上-從本地來看這應該很簡單。
你不需要將你的 Go 代碼發佈到像 github.com 這樣的服務來編譯它。
所有你需要做的是確保你要編譯的代碼是對在其上編譯它的機器。您的go build
命令失敗,因為錯誤消息中提到的包在機器上找不到。
下面假設 Go 項目本身是有序的,並且您可以在本地機器上編譯它。如果情況並非如此,並且後面的答案無法幫助您解決問題,那麼您需要在問題中包含更多信息,例如go.mod
文件、main.go
文件以及user
包的內容。
請注意,COPY *.go ./
不會遞歸複製所有 go 文件,即不會復制目錄中的./user/
文件。
COPY
:
每個都
<src>
可能包含通配符,匹配將使用 Go 的filepath.Match
規則來完成。
模式語法是:
pattern: { term } term: '*' matches any sequence of non-Separator characters '?' matches any single non-Separator character '[' [ '^' ] { character-range } ']' character class (must be non-empty) c matches character c (c != '*', '?', '\\', '[') '\\' c matches character c character-range: c matches character c (c != '\\', '-', ']') '\\' c matches character c lo '-' hi matches character c for lo <= c <= hi
請注意,該'*'
術語匹配任何非分隔符字符序列,這意味著由於分隔符*.go
而不會匹配。foo/bar.go
/
在您的Dockerfile
.
FROM golang:1.17-alpine
WORKDIR /app
COPY . ./
RUN go build -o /api
CMD [ "/api" ]
但是如果你想對你複製的文件有選擇性,那麼你可以這樣做:
COPY go.mod ./
COPY go.sum ./
COPY user/ ./user/
COPY *.go ./
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句