【问题标题】:Go build fails when building docker image构建docker镜像时Go build失败
【发布时间】:2018-11-14 20:11:49
【问题描述】:

我对 golang 有点陌生,我仍在努力理解 go run main.gogo build [-o] main.go 之间的区别。

我已经构建了一个小型 gin 应用程序,以便在本地使用 docker 和 kubernetes 进行试用。

package main

import (
    "net/http"

    "github.com/gin-gonic/gin"
)

func main() {

    r := gin.Default()

    r.GET("/healthz", func(c *gin.Context) {
        c.String(http.StatusOK, "")
    })

    r.GET("/readinez", func(c *gin.Context) {
        c.String(http.StatusOK, "")
    })

    r.Run() // listen and serve on 0.0.0.0:8080
} 

应用程序在go run main.go 下运行得非常好。

我的 Dockerfile:

FROM golang:latest
RUN mkdir /app
ADD . /app/
WORKDIR /app
RUN go build -o main .
CMD ["/app/main"]

失败了:

它肯定在那里,当我go run main.go 时它也有效。构建有什么区别?

我不确定在这里做什么。来自节点背景。这确实让菜鸟有些发疯......当然有一个简单的解决方案。

【问题讨论】:

    标签: docker go


    【解决方案1】:

    程序在您的机器上成功,因为您可能已经安装了 gin 包。你不能假设一个容器会拥有它,并且应该明确地安装它。只需将以下行添加到您的 dockerfile 中 go build 行之前:

    RUN go get github.com/gin-gonic/gin
    

    【讨论】:

    • 感谢成功。如何在围棋世界中更有效地进行设置?手动将每个包添加到 docker 中并不实际。我可以阅读任何好的想法文章/教程吗?
    • 一种方法是提供 gin-gonic 包。基本上意味着将包作为依赖项复制到您的文件夹中。请务必查看 dep 和 glide 应该是 govendoring 的继任者。
    • 顺便说一句,您可以只运行一个赤裸裸的go get 来拉取所有依赖项。也就是说,您 (OP) 可能想研究一下供应商 (blog.gopheracademy.com/advent-2015/vendor-folder)。它解决了这个问题和不同依赖版本引起的问题。 (编辑:该死的,打败我,黑斯)
    【解决方案2】:

    可能是因为你使用了 gin 导致失败,在容器中找不到库。尝试使用 glide 或 godep 来销售第三方库。

    【讨论】:

      【解决方案3】:
      go get github.com/gin-gonic/gin
      

      那么它应该可以工作了。

      【讨论】:

        猜你喜欢
        • 2022-01-02
        • 1970-01-01
        • 2022-11-30
        • 2016-12-12
        • 1970-01-01
        • 2021-12-17
        • 1970-01-01
        • 2019-08-13
        • 2021-11-03
        相关资源
        最近更新 更多