亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

嘗試在一個連接到另一個 postgres 的容器中運行 go 程序時出現撥號錯誤

嘗試在一個連接到另一個 postgres 的容器中運行 go 程序時出現撥號錯誤

Go
翻過高山走不出你 2022-06-21 09:59:50
我目前在我的 PC 上設置了兩個 docker 容器,其中一個是使用 docker compose 創建的 PostgreSQL 容器,另一個包含用于初始化 PostgreSQL 數據庫中的表的 go 代碼。Docker compose 在創建容器/數據庫方面非常有效(我將通過容器外部的 psql 登錄它),并且 go 代碼本身在容器外部正常運行(創建表)。當我嘗試從自己的容器內運行代碼時,無論我嘗試連接到本地數據庫還是容器化數據庫,都會出現問題。這兩種情況都會導致標題中的撥號錯誤。我只是 docker 的初學者,所以我知道這很可能是我的問題,但這里是我的 dockerfile 的內容:FROM golang:alpine AS builder #adding needed env variables ENV GO111MODULE=on \    CGO_ENABLED=0 \    GOOS=linux \    GOARCH=amd64     #move to /build WORKDIR /build #copy dependancies COPY go.mod . COPY go.sum . RUN go mod download #add code to container COPY . .#build app RUN go build -o main . # Move to /dist directory as the place for resulting binary folderWORKDIR /dist# Copy binary from build to main folderRUN cp /build/main .# Build a small imageFROM scratchCOPY --from=builder /dist/main /ENV DATABASE_URL=postgres://short:password@test:8001/shorturl    #change database url variable to match your needs     # Command to runENTRYPOINT ["/main"]以及 docker-compose.yml 文件的內容:version: '3'services:  database:    container_name: test    image: "postgres" # use latest official postgres version    env_file:      - ./db/database.env # configure postgres    volumes:      - database-data:/var/lib/postgresql/data/ # persist data even if container shuts down    ports:        - "8001:5432"   backend:     build: . volumes:  database-data: 代碼本身存在于以下目錄結構中:/project/    ./db/          db.go          database.env    main.go     go.mod     go.sum     Dockerfile     docker-compose.yml db.go 包含:package dbimport (    "context"    "fmt"    "os"    "github.com/jackc/pgx/v4/pgxpool")正如我之前提到的,在任何容器之外運行所有這些都可以工作并填充數據庫,并且 docker-compose 成功創建了一個我可以在本地連接到的 postgres 實例。我不能做的是通過我的代碼(在本地或在容器中運行)連接到容器化的 postgres,或者從我的代碼的容器化版本連接到本地數據庫。所有這些都會導致此錯誤的某些變化:Unable to connect to database: failed to connect to `host=container_name user=short database=shorturl`: dial error (dial tcp 172.18.0.2:8001: connect: connection refused) 我很好奇我在代碼和/或 docker 中可能做錯了什么,并希望有人可以最終運行它并重現我的問題/找出問題所在。
查看完整描述

2 回答

?
慕婉清6462132

TA貢獻1804條經驗 獲得超2個贊

我將嘗試澄清 Michée Lengronne 所寫的內容,我認為他的回答只是部分正確。

你有兩個容器 -test里面有 postgres 運行,一個未命名的里面有你的 go 應用程序,這個容器的名稱是在每次容器啟動時隨機確定的。

這兩個容器都在同一個網絡上。這很重要。

ports使用 value定義時8001:5432,表示如果從定義的網絡外部連接,并且選擇端口8001進行連接,它將連接到5432內部的端口。

但是,如果您僅從同一網絡內連接,則可以省略定義ports并繼續直接連接到test容器。

意思是,使用帶有默認端口 ( ) 的容器名稱5432就足夠了。

TL; 博士

DATABASE_URL=postgres://short:password@test:5432/shorturl


查看完整回答
反對 回復 2022-06-21
?
MMMHUHU

TA貢獻1834條經驗 獲得超8個贊

如果要連接到本地 postgres 或另一個 docker 網絡中的 postgres,則必須在該變量中提供 postgres 的 IP 或域名:DATABASE_URL=postgres://short:password@test:8001/shorturl

通常你應該替換testlocalhost127.0.0.1

從錯誤中,您的應用程序嘗試連接到172.18.0.2. 我想這個IP是來自postgres容器的IP。在此特定容器的 docker 網絡之外無法訪問它。如果您想通過此 IP 訪問您的容器,您必須將您的應用程序容器添加到 postgres docker 網絡。

Docker 網絡和撰寫:https ://docs.docker.com/compose/networking/


查看完整回答
反對 回復 2022-06-21
  • 2 回答
  • 0 關注
  • 114 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號