首頁  >  文章  >  後端開發  >  使用 docker-compose 無法存取 Go REST API

使用 docker-compose 無法存取 Go REST API

WBOY
WBOY轉載
2024-02-13 14:33:08978瀏覽

使用 docker-compose 无法访问 Go REST API

php小編魚仔發現許多開發者在使用docker-compose時遇到了​​一個常見的問題,即無法存取Go REST API。這個問題可能導致開發者無法正常進行API的測試和偵錯工作。在本文中,我們將分享一些解決問題的方法和技巧,幫助開發者順利使用docker-compose存取Go REST API,提高開發效率。

問題內容

我正在嘗試使用 gin gonic 和 mysql 以及 phpmyadmin 和 docker 運行一個簡單的 go rest api。

雖然 phpmyadmin 運作正常,但當我嘗試存取我的 go api 時,我收到以下錯誤訊息:localhost 未發送任何資料。 err_empty_response

#如果我在沒有 docker 的情況下運行 main.go 文件,一切都會按預期工作

這是我的 docker-compose 檔案

version: '3'
services:
  app:
    container_name: full_app
    build: .
    ports:
      - 8080:8080
    expose:
      - 8080
    restart: on-failure
    environment:
      - pma_host=fullstack-mysql
      - db_name=${db_name}
      - db_user=${db_user}
      - db_password=${db_port}
    volumes:
      - .:/usr/src/app/
    depends_on:
      - fullstack-mysql
    networks:
      - fullstack

  fullstack-mysql:
    image: mysql:5.7
    container_name: full_db_mysql
    ports:
      - 3306:3306
    environment:
      - mysql_root_host=${db_host}
      - mysql_user=${db_user}
      - mysql_root_user=${db_root_user}
      - mysql_password=${db_password}
      - mysql_root_password=${db_root_password}
      - mysql_database=${db_name}
      - mysql_root_password=${db_password}
    volumes:
      - database_mysql:/var/lib/mysql
    networks:
      - fullstack

  phpmyadmin:
    image: phpmyadmin/phpmyadmin
    container_name: phpmyadmin_container
    depends_on:
      - fullstack-mysql
    environment:
      - pma_host=fullstack-mysql
      - pma_user=${db_user}
      - pma_port=${db_port}
      - pma_password=${db_password}
    ports:
      - 9090:80
    restart: always
    networks:
      - fullstack

volumes:
  api:
  database_mysql:

# networks to be created to facilitate communication between containers
networks:
  fullstack:
    driver: bridge

這是我的 dockerfile

# start from golang base image
from golang:alpine as builder

# env go111module=on

# install git.
# git is required for fetching the dependencies.
run apk update && apk add --no-cache git

# set the current working directory inside the container
workdir /app

# copy go mod and sum files
copy go.mod go.sum ./

# download all dependencies. dependencies will be cached if the go.mod and the go.sum files are not changed
run go mod download

# copy the source from the current directory to the working directory inside the container
copy . .

# build the go app
run cgo_enabled=0 goos=linux go build -a -installsuffix cgo -o main .

# start a new stage from scratch
from alpine:latest
run apk --no-cache add ca-certificates

workdir /root/

# copy the pre-built binary file from the previous stage. observe we also copied the .env file
copy --from=builder /app/main .
copy --from=builder /app/.env .

# expose port 8080 to the outside world
expose 8080

#command to run the executable
cmd ["./main"]

這是我的 go main.go 檔案(目前):

package main

import (
    "github.com/gin-gonic/gin"
    "log"
    "net/http"
)

func main() {
    router := gin.Default()

    router.GET("/", func(context *gin.Context) {
        context.JSON(http.StatusOK, gin.H{"data": "Hello World !"})
    })

    router.Run("localhost:8080")
}

如果我訪問 http://localhost:9090 phpmyadmin 正在加載(正是我所期望的) 如果我訪問 http://localhost:8080 我收到此錯誤訊息:localhost 未發送任何資料。 err_empty_response

#我為此運行 docker-compose up --build 。 我顯然做錯了什麼,但我不確定是什麼。

解決方法

問題似乎在於您的 go 程式碼以及我為 api 指定偵聽主機的方式。在我的main.go 檔案中,我目前將主機設定為“localhost:8080”,但是當在docker 容器內執行我的應用程式時,我應該監聽“0.0.0.0:8080” 。這允許容器綁定到所有網路介面。

要解決此問題,我必須修改 main.go 檔案中的 router.run 行,如下所示:

router.Run("0.0.0.0:8080")

進行此更改後,我重建了 docker 映像並使用 docker-compose up --build 再次運行容器。這應該允許在 docker 容器外部的 http://localhost:8080 上存取我的 go rest api。

注意:容器內的localhost指的是容器本身,而不是宿主機。透過使用“0.0.0.0”,我指示容器綁定到所有可用的網路接口,從而允許我從主機訪問 api。

以上是使用 docker-compose 無法存取 Go REST API的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文轉載於:stackoverflow.com。如有侵權,請聯絡admin@php.cn刪除