使用 Golang + Gin + Docker 时出现“localhost 没有发送任何数据”

我已经按照在本地完美运行的 youtube 教程创建了一个简单的 API。将应用程序容器化并运行容器后,我无法访问 http://localhost:8080 上的 API。我猜它与我在 dockerfile 中使用的端口设置有关,但我不确定。


main.go 文件:


package main


import (

    "net/http"

    "github.com/gin-gonic/gin"

    "errors"

)


type phone struct{

    ID       string `json:"id"`

    Model    string `json:"model"`

    Year     string `json:"year"`

    Quantity int    `json:"quantity"`

}


var phones = []phone{

    {ID: "1", Model: "iPhone 11", Year: "2019", Quantity: 4},

    {ID: "2", Model: "iPhone 6", Year: "2014", Quantity: 9},

    {ID: "3", Model: "iPhone X", Year: "2017", Quantity: 2},

}


func phoneById(c *gin.Context) {

    id := c.Param("id")

    phone, err := getPhoneById(id)


    if err != nil {

        c.IndentedJSON(http.StatusNotFound, gin.H{"message": "Phone not found."})

        return

    }


    c.IndentedJSON(http.StatusOK, phone)

}


func checkoutPhone(c *gin.Context) {

    id, ok := c.GetQuery("id")


    if !ok {

        c.IndentedJSON(http.StatusBadRequest, gin.H{"Message": "Missing id query paramater"})

        return

    }


    phone, err := getPhoneById(id)


    if err != nil {

        c.IndentedJSON(http.StatusBadRequest, gin.H{"Message": "Phone not found"})

        return

    }


    if phone.Quantity <= 0 {

        c.IndentedJSON(http.StatusBadRequest, gin.H{"Message": "Phone not available."})

        return

    }


    phone.Quantity -= 1

    c.IndentedJSON(http.StatusOK, phone)

}


func returnPhone(c *gin.Context) {

    id, ok := c.GetQuery("id")


    if !ok {

        c.IndentedJSON(http.StatusBadRequest, gin.H{"Message": "Missing id query paramater"})

        return

    }


    phone, err := getPhoneById(id)


    if err != nil {

        c.IndentedJSON(http.StatusBadRequest, gin.H{"Message": "Phone not found"})

        return

    }


    if phone.Quantity <= 0 {

        c.IndentedJSON(http.StatusBadRequest, gin.H{"Message": "Phone not available."})

        return

    }


    phone.Quantity += 1

    c.IndentedJSON(http.StatusOK, phone)

}


慕田峪7331174
浏览 216回答 1
1回答

尚方宝剑之说

您需要绑定到容器内部的公共网络接口。因为每个容器都是自己的host,当你在里面绑定loopback接口的时候,外界就访问不到了。router.Run("0.0.0.0:8080")此外,确保在运行容器时发布此端口。docker&nbsp;run&nbsp;--publish&nbsp;8080:8080&nbsp;myapp你实际上用你的环境变量表明了正确的意图,但它们没有在你的代码中使用。ENV&nbsp;HOST&nbsp;0.0.0.0 ENV&nbsp;PORT&nbsp;8080您可以使用os.Getenv或os.LookupEnv从您的代码中获取这些变量并使用它们。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Go