editor php Yuzai mendapati bahawa ramai pembangun menghadapi masalah biasa apabila menggunakan docker-compose, iaitu, mereka tidak dapat mengakses Go REST API. Masalah ini mungkin menghalang pembangun daripada menguji dan menyahpepijat API dengan betul. Dalam artikel ini, kami akan berkongsi beberapa kaedah dan teknik untuk menyelesaikan masalah ini untuk membantu pembangun berjaya menggunakan docker-compose untuk mengakses API Go REST dan meningkatkan kecekapan pembangunan.
Saya cuba menjalankan api go rest yang mudah menggunakan gin gonic dan mysql serta phpmyadmin dan docker.
Walaupun phpmyadmin berjalan dengan baik, apabila saya cuba mengakses go api saya, saya mendapat mesej ralat berikut: localhost 未发送任何数据。 err_empty_response
Jika saya menjalankan fail main.go
tanpa docker, semuanya berfungsi seperti yang diharapkan
Ini ialah docker-compose
fail
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
Ini milik saya 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"]
Ini fail saya main.go
(kini):
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") }
Jika saya melawat http://localhost:9090
phpmyadmin sedang dimuatkan (tepat seperti yang saya jangkakan)
Jika saya melawat http://localhost:8080
我收到此错误消息:localhost 未发送任何数据。 err_empty_response
saya mendapat mesej ralat ini:
docker-compose up --build
Saya berlari
main.go
Masalahnya nampaknya adalah dengan kod go anda dan cara saya menentukan hos mendengar untuk api. Dalam fail
main.go
文件中的 router.run
Untuk menyelesaikan masalah ini, saya terpaksa mengubah suai baris router.run
dalam fail
router.Run("0.0.0.0:8080")
http://localhost:8080
Selepas membuat perubahan ini, saya membina semula imej docker dan menggunakan docker-compose up --build untuk menjalankan bekas itu semula. Ini sepatutnya membenarkan akses kepada api go rest saya di di luar bekas docker.
localhost
Nota:
Atas ialah kandungan terperinci Tidak dapat mengakses Go REST API menggunakan docker-compose. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!