猿问

使用 docker compose up 的 Golang 项目和 postgres 图像不会失败

不确定我在这里做错了什么。我正在尝试使用持久数据库创建一个 golang/postgres dockerized 项目。以下是文件。当我运行时go run main.go,curl http://localhost:8081/我得到了预期的输出,但是当我尝试这个时docker compose up我遇到了问题,但一切似乎都在工作,因为我没有看到任何错误消息postgres-1  | 2022-08-29 05:31:59.703 UTC [1] LOG:  database system is ready to accept connections,但是当我尝试时curl http://localhost:8081/我遇到了错误curl: (56) Recv failure: Connection reset by peer。我尝试完全删除 postgres 部分,但我仍然遇到同样的问题。我可以看到 docker 已启动并正在运行并且端口正在侦听


sudo lsof -i -P -n | grep 8081

docker-pr 592069            root    4u  IPv4 1760430      0t0  TCP *:8081 (LISTEN)

我在 Ubuntu 22.04 上使用它


主要去:


package main


import (

    "fmt"

    "log"

    "net/http"

)


func main() {


    http.HandleFunc("/", func(w http.ResponseWriter, r *http.Request) {

        fmt.Fprintf(w, "this can be anything")

    })


    http.HandleFunc("/try-it", func(w http.ResponseWriter, r *http.Request) {

        fmt.Fprintf(w, "it worked!")

    })


    log.Fatal(http.ListenAndServe(":8081", nil))


}

文件:


FROM golang:1.19-alpine3.16


WORKDIR /app


COPY go.mod ./

RUN go mod download


COPY . .


RUN go build -o main .


RUN go build -v -o /usr/local/bin/app ./...


EXPOSE 8081

CMD [ "./main" ]

docker-compose.yml:


version: '3.9'

services:

  api:

    restart: unless-stopped

    build:

      context: .

      dockerfile: Dockerfile

    ports:

      - "8081:8080"

    depends_on:

      - postgres

    networks:

      - backend

  postgres:

    image: postgres

    restart: unless-stopped

    ports:

      - "5001:5432"

    volumes:

      - psqlVolume:/var/lib/postgresql/data

    environment:

      - POSTGRES_USER=${POSTGRES_USER}

      - POSTGRES_PASSWORD=${POSTGRES_PASSWORD}

      - POSTGRES_DB=${POSTGRES_DB}

    networks:

      - backend


networks:

  backend:


volumes:

  psqlVolume:


月关宝盒
浏览 121回答 1
1回答

翻阅古今

docker 容器已启动并正在运行,但需要在容器和应用程序中映射端口。例如在 main.gohttp.ListenAndServe(":8084", nil)中,应用程序中的这个方法需要映射到容器端口(在本例中:8084)version: '3.9'services:  api:    image: api    restart: unless-stopped    build:      context: .      dockerfile: Dockerfile    ports:      - "8083:8084" #host_port:container_port可以在 docker 正在侦听的主机端口上发出 curl 请求(在本例中为:8083)。例如curl http://localhost:8083/。这将向主机发出请求,该请求将被侦听端口的 docker 捕获,:8083然后将请求传输到正在侦听的容器,:8084如docker-compose.yml. 如果端口映射不正确,则 curl 将返回curl: (56) Recv failure: Connection reset by peer。感谢您的学习经验,感谢您的所有帮助。
随时随地看视频慕课网APP

相关分类

Go
我要回答