Heim > Artikel > Backend-Entwicklung > Mit Docker-Compose kann nicht auf die Go-REST-API zugegriffen werden
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.
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-compose
Datei
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 --build
Ich renne
main.go
Das Problem scheint in Ihrem Go-Code und der Art und Weise zu liegen, wie ich den Überwachungshost für die API spezifiziere. In meiner
main.go
文件中的 router.run
Um dieses Problem zu beheben, musste ich die Zeile router.run
in der
router.Run("0.0.0.0:8080")
http://localhost:8080
Nachdem 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.
localhost
Hinweis:
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!