Dockerizing Go API 在不設置 git 項目存儲庫的情況下不起作用

亞歷克斯

我有一個非常簡單的項目 - 一個具有以下目錄結構的 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規則來完成

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] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章