Rumah > pembangunan bahagian belakang > Golang > Tidak dapat mengakses Go REST API menggunakan docker-compose

Tidak dapat mengakses Go REST API menggunakan docker-compose

WBOY
Lepaskan: 2024-02-13 14:33:08
ke hadapan
1031 orang telah melayarinya

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

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.

Kandungan soalan

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

saya
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
Salin selepas log masuk

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"]
Salin selepas log masuk

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")
}
Salin selepas log masuk

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 --buildSaya berlari

untuk ini. Saya jelas melakukan sesuatu yang salah, tetapi saya tidak pasti apa.

Penyelesaian

main.goMasalahnya nampaknya adalah dengan kod go anda dan cara saya menentukan hos mendengar untuk api. Dalam fail

saya, saya kini mempunyai hos yang ditetapkan kepada "localhost:8080", tetapi apabila menjalankan aplikasi saya di dalam bekas docker, saya sepatutnya mendengar pada "0.0.0.0:8080". Ini membolehkan bekas untuk mengikat semua antara muka rangkaian.

main.go 文件中的 router.runUntuk menyelesaikan masalah ini, saya terpaksa mengubah suai baris router.run dalam fail

seperti berikut:

router.Run("0.0.0.0:8080")
Salin selepas log masuk
http://localhost:8080Selepas 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.

localhostNota:

dalam bekas merujuk kepada bekas itu sendiri, bukan hos. Dengan menggunakan "0.0.0.0" saya mengarahkan bekas untuk mengikat semua antara muka rangkaian yang tersedia, membenarkan saya mengakses api daripada mesin hos. 🎜

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!

sumber:stackoverflow.com
Kenyataan Laman Web ini
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan