🐥
DockerでPostgreに接続できなかった時に確認したこと
この記事について
Go + PostgreSQLの環境構築をDockerで行っていたところDBのコンテナへの接続で詰まってしまったため調査しました。
エラー内容
goのコンテナ内でgo run main.go
を実行しても以下のエラーが発生していました。
2024/11/16 08:00:09 dial tcp 127.0.0.1:5432: connect: connection refused
exit status 1
前提
設定は以下の通りです。最低限の設定です。
docker-compose.yml
db:
image: postgres:14.3
container_name: postgres
# posgresのデフォルトポートが5432
ports:
- 5432:5432
environment:
# タイムゾーン
- TZ=Asia/Tokyo
# 環境変数ファイル
env_file:
- .env
.env
POSTGRES_PASSWORD=root
POSTGRES_USER=root
POSTGRES_DB=dev
やったこと
占有portを確認
lsof -i :5432
で5432のポートの使用状況を確認できます。
MacBook work % lsof -i :5432
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
com.docke 20301 h_h 164u IPv6 0x28568c6740acfe63 0t0 TCP *:postgresql (LISTEN)
postgres 48594 h_h 7u IPv6 0xc46585475d1db213 0t0 TCP localhost:postgresql (LISTEN)
postgres 48594 h_h 8u IPv4 0x843bf5779dd45cce 0t0 TCP localhost:postgresql (LISTEN)
COMMANDがcom.dockeになっているものがcontainerのポートで、他二つが以前ローカルに入れたpostgresでした。
なので下二つをkillする必要があります。
こちらのコマンドでkillすることでコンテナのみにすることができました。
MacBook work % kill -9 [PIDの数字]
確認するとこんな感じ
MacBook work % lsof -i :5432
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
com.docke 20301 h_h 164u IPv6 0x28568c6740acfe63 0t0 TCP *:postgresql (LISTEN)
goのコードを確認
goのDB接続を以下のようなコードで行おうとしていました。
package main
import (
"database/sql"
"log"
_ "github.com/lib/pq"
)
var Db *sql.DB
var err error
type Person struct {
Name string
Age int
}
func main() {
// ここのhostが誤り
Db, err = sql.Open("postgres", "user=root password=root dbname=dev host=localhost port=5432 sslmode=disable")
if err != nil{
log.Panicln(err)
}
defer Db.Close()
}
docker-composeで起動しているコンテナにはネットワーク名の代わりにコンテナ名で接続することが可能らしいです。
そのためOpenの引数をhost=postgres
に変えました。
Db, err = sql.Open("postgres", "host=postgres port=5432 user=root password=root dbname=dev sslmode=disable")
これで接続ができました!
参考記事様
Discussion