为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

Go
月关宝盒 2023-02-06 10:36:47
不确定我在这里做错了什么。我正在尝试使用持久数据库创建一个 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 8081docker-pr 592069            root    4u  IPv4 1760430      0t0  TCP *:8081 (LISTEN)我在 Ubuntu 22.04 上使用它主要去:package mainimport (    "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.16WORKDIR /appCOPY go.mod ./RUN go mod downloadCOPY . .RUN go build -o main .RUN go build -v -o /usr/local/bin/app ./...EXPOSE 8081CMD [ "./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:      - backendnetworks:  backend:volumes:  psqlVolume:
查看完整描述

1 回答

?
翻阅古今

TA贡献1780条经验 获得超5个赞

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。感谢您的学习经验,感谢您的所有帮助。


查看完整回答
反对 回复 2023-02-06
  • 1 回答
  • 0 关注
  • 120 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信