【问题标题】:Dockerizing Go API not working without setting up git project repoDockerizing Go API 在不设置 git 项目 repo 的情况下无法工作
【发布时间】:2021-12-23 13:31:21
【问题描述】:

我有一个非常简单的项目——一个具有以下目录结构的 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] 运行 go build -o /api: #11 0.462 main.go:4:2: 包 api/user 不在 GOROOT (/usr/local/go/src/api/user)

读了一点之后,看起来我可能需要设置一个 github 存储库并从 git 中提取代码?我认为这真的很疯狂,因为代码就在 Docker 映像中。

如何在不设置像 github.com/alex/someproject 这样的 git repo 的情况下构建/Dockerize 这个 Go 项目?因为我不想将其发布到 github 上而询问 - 这在本地应该很简单。

【问题讨论】:

    标签: docker go


    【解决方案1】:

    你不需要将你的 Go 代码发布到像 github.com 这样的服务来编译它。

    您需要做的就是确保您要编译的代码您正在编译它的机器上。您的go build 命令失败,因为错误消息中提到的包在机器上找不到。


    以下假设 Go 项目本身是有序的,并且您可以在本地机器上编译它。如果不是这种情况并且后面的答案不能帮助您解决问题,那么您需要在问题中包含更多信息,例如您的 go.mod 文件、main.go 文件的内容以及 @ 987654326@包。

    请注意,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 ./
    

    【讨论】:

    • "请注意,COPY *.go ./ 不会递归复制所有 go 文件,即它不会复制 ./user/ 目录中的文件。" - 是的,就是这样!小 1 行更改。谢谢
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-10-18
    • 1970-01-01
    • 2011-10-26
    • 2021-05-23
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多