L'éditeur php Yuzai a découvert que de nombreux développeurs rencontraient un problème courant lors de l'utilisation de docker-compose, c'est-à-dire qu'ils ne parvenaient pas à accéder à l'API Go REST. Ce problème peut empêcher les développeurs de tester et de déboguer correctement les API. Dans cet article, nous partagerons quelques méthodes et techniques pour résoudre ce problème afin d'aider les développeurs à utiliser avec succès docker-compose pour accéder à l'API Go REST et améliorer l'efficacité du développement.
J'essaie d'exécuter une API simple go rest en utilisant gin gonic et mysql et phpmyadmin et docker.
Bien que phpmyadmin fonctionne correctement, lorsque j'essaie d'accéder à mon API go, j'obtiens le message d'erreur suivant : localhost 未发送任何数据。 err_empty_response
Si j'exécute le fichier main.go
sans docker, tout fonctionne comme prévu
Voici mon docker-compose
fichier
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
C'est à moi 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"]
Voici mon fichier go main.go
(actuellement) :
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") }
Si je visite http://localhost:9090
phpmyadmin se charge (exactement ce à quoi je m'attends)
Si je visite http://localhost:8080
我收到此错误消息:localhost 未发送任何数据。 err_empty_response
, je reçois ce message d'erreur :
docker-compose up --build
Je cours
main.go
Le problème semble provenir de votre code go et de la façon dont je spécifie l'hôte d'écoute pour l'API. Dans mon fichier
main.go
文件中的 router.run
Pour résoudre ce problème, j'ai dû modifier la ligne router.run
dans le fichier
router.Run("0.0.0.0:8080")
http://localhost:8080
Après avoir effectué cette modification, j'ai reconstruit l'image du docker et utilisé docker-compose up --build pour exécuter à nouveau le conteneur. Cela devrait permettre l'accès à mon API go rest sur en dehors du conteneur Docker.
localhost
Remarque :
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!