Heim  >  Artikel  >  Backend-Entwicklung  >  Mit Docker-Compose kann nicht auf die Go-REST-API zugegriffen werden

Mit Docker-Compose kann nicht auf die Go-REST-API zugegriffen werden

WBOY
WBOYnach vorne
2024-02-13 14:33:08981Durchsuche

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

php-Editor Yuzai stellte fest, dass viele Entwickler bei der Verwendung von Docker-Compose auf ein häufiges Problem stießen, nämlich dass sie nicht auf die Go-REST-API zugreifen konnten. Dieses Problem kann Entwickler daran hindern, APIs ordnungsgemäß zu testen und zu debuggen. In diesem Artikel werden wir einige Methoden und Techniken zur Lösung dieses Problems vorstellen, um Entwicklern dabei zu helfen, Docker-Compose erfolgreich für den Zugriff auf die Go-REST-API zu verwenden und die Entwicklungseffizienz zu verbessern.

Frageninhalt

Ich versuche, eine einfache Go-Rest-API mit Gin Gonic und MySQL sowie PHPMyAdmin und Docker auszuführen.

Obwohl phpmyadmin einwandfrei läuft, erhalte ich beim Versuch, auf meine Go-API zuzugreifen, die folgende Fehlermeldung: localhost 未发送任何数据。 err_empty_response

Wenn ich die main.go-Datei ohne Docker ausführe, funktioniert alles wie erwartet

Das ist meine docker-composeDatei

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

Das ist meins 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"]

Das ist meine Go-Datei main.go (derzeit):

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")
}

Wenn ich http://localhost:9090 besuche, wird phpmyadmin geladen (genau das, was ich erwarte) Wenn ich http://localhost:8080 我收到此错误消息:localhost 未发送任何数据。 err_empty_response besuche, erhalte ich diese Fehlermeldung:

docker-compose up --buildIch renne

dafür. Ich mache offensichtlich etwas falsch, bin mir aber nicht sicher, was.

Problemumgehung

main.goDas Problem scheint in Ihrem Go-Code und der Art und Weise zu liegen, wie ich den Überwachungshost für die API spezifiziere. In meiner

-Datei habe ich derzeit den Host auf „localhost:8080“ eingestellt, aber wenn ich meine Anwendung in einem Docker-Container ausführe, sollte ich auf „0.0.0.0:8080“ lauschen. Dadurch kann der Container an alle Netzwerkschnittstellen gebunden werden.

main.go 文件中的 router.runUm dieses Problem zu beheben, musste ich die Zeile router.run in der

-Datei wie folgt ändern:

router.Run("0.0.0.0:8080")
http://localhost:8080Nachdem ich diese Änderung vorgenommen hatte, habe ich das Docker-Image neu erstellt und docker-compose up --build verwendet, um den Container erneut auszuführen. Dies sollte den Zugriff auf meine Go-Rest-API auf

außerhalb des Docker-Containers ermöglichen.

localhostHinweis:

im Container bezieht sich auf den Container selbst, nicht auf den Host. Durch die Verwendung von „0.0.0.0“ weise ich den Container an, sich an alle verfügbaren Netzwerkschnittstellen zu binden, sodass ich vom Host-Computer aus auf die API zugreifen kann. 🎜

Das obige ist der detaillierte Inhalt vonMit Docker-Compose kann nicht auf die Go-REST-API zugegriffen werden. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Dieser Artikel ist reproduziert unter:stackoverflow.com. Bei Verstößen wenden Sie sich bitte an admin@php.cn löschen