Skip to content

Commit 8cee4b2

Browse files
committed
chore: Fix prisma studio localhost refused (#2981)
1 parent 3398ccd commit 8cee4b2

File tree

3 files changed

+122
-1
lines changed

3 files changed

+122
-1
lines changed

CONTRIBUTING.md

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -176,7 +176,8 @@
176176

177177
`pnpm db:seed`
178178

179-
`pnpm db:studio`
179+
`sh -lc "pkill -f 'prisma.*studio' || true"`
180+
`pnpm db:studio --port 5555`
180181

181182
- 以下のリンクをクリックしてください。
182183

compose.yaml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@ services:
33
build: .
44
ports:
55
- '5173:5173'
6+
- '5555:5555'
67
tty: true
78
volumes:
89
- .:/usr/src/app:cached
Lines changed: 119 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,119 @@
1+
# Prisma Studio: Docker compose で localhost refused になる原因と対処方法
2+
3+
## 概要
4+
5+
Docker Compose(devcontainer なし)で `pnpm db:studio`(= `prisma studio`)を起動すると、ホストのブラウザで `http://localhost:5555``localhost refused to connect` になる。
6+
7+
本件は **Prisma Studio 自体の不具合ではなく、コンテナのポート公開(publish)と VS Code のポート転送(port forward)の違い**によって発生する。
8+
9+
## 結論
10+
11+
- Prisma Studio は `web` コンテナ内では起動している。
12+
- しかし `compose.yaml``web.ports``5555` が無いため、ホストの `localhost:5555` に到達できない。
13+
- VS Code Dev Containers では port forward が効くため、`compose.yaml``5555` の publish が無くてもアクセスできて「動いているように見える」。
14+
15+
## 背景(今回の構成)
16+
17+
- `package.json`
18+
- `db:studio`: `pnpm exec prisma studio`
19+
- `compose.yaml`
20+
- `web.ports`: `5173:5173` のみ(Studio の `5555` は公開されていない)
21+
- `.devcontainer/devcontainer.json`
22+
- port forward を使える(VS Code がコンテナ内ポートをローカルへ転送可能)
23+
24+
## 症状と切り分け
25+
26+
### 1) コンテナ内では起動しているか
27+
28+
```bash
29+
# コンテナ内の待受確認
30+
docker compose exec -T web sh -lc "ss -ltnp | grep ':5555' || true"
31+
32+
# コンテナ内から疎通
33+
docker compose exec -T web curl -I http://localhost:5555
34+
```
35+
36+
コンテナ内疎通が成功するなら、Studio は起動している。
37+
38+
### 2) ホストへ公開されているか(主原因)
39+
40+
```bash
41+
# ホストに publish されているか
42+
docker compose port web 5555
43+
44+
# ホストから疎通
45+
curl -I http://localhost:5555
46+
```
47+
48+
- `docker compose port web 5555``no port 5555/tcp ...` の場合、ホストからは繋がらない。
49+
- その状態でブラウザを開くと `localhost refused to connect` になり得る。
50+
51+
## VS Code / devcontainer で動く理由
52+
53+
VS Code Dev Containers は、Dockerの `ports:` で publish していなくても、VS Code 側の **port forward** でローカルに転送できる。
54+
55+
- そのため devcontainer では `http://localhost:5555` が開ける。
56+
- 同じ `compose.yaml` でも、「Dockerのみ(VS Codeなし)」だと port forward が無いので開けない。
57+
58+
## 再実行時に 5556 / 5557 のようにポート番号がインクリメントされる問題
59+
60+
### 原因
61+
62+
`pnpm db:studio` を複数回実行すると、既に `:5555` が使用中のため Prisma が空きポートに退避し、`5556`, `5557` で起動する。
63+
64+
よくあるパターン:
65+
66+
- `docker compose exec web ...` で起動した Studio がコンテナ内に残る
67+
- ホスト側のターミナルを閉じても、コンテナ内プロセスは継続
68+
- 次回起動で `EADDRINUSE` → 別ポートを選択
69+
70+
### 回避策(推奨:常に 5555 固定)
71+
72+
起動前に既存 Studio を止め、`--port 5555` を明示して起動する。
73+
74+
```bash
75+
# 1) 既存Studioが居たら止める(居なくてもOK)
76+
docker compose exec -T web sh -lc "pkill -f 'prisma.*studio' || true"
77+
78+
# 2) 5555 が空いていることを確認
79+
docker compose exec -T web sh -lc "ss -ltnp | grep ':5555' || true"
80+
81+
# 3) Studio起動(ポート固定)
82+
docker compose exec web pnpm exec prisma studio --port 5555
83+
```
84+
85+
## Prisma Studio の停止方法(Docker内)
86+
87+
### ざっくり止める(推奨)
88+
89+
```bash
90+
docker compose exec -T web sh -lc "pkill -f 'prisma.*studio' || true"
91+
```
92+
93+
- 終了コード `143`(SIGTERM)は正常系のことが多い。
94+
95+
### 状態確認
96+
97+
```bash
98+
docker compose exec -T web sh -lc "ss -ltnp | grep ':555[5-9]' || true"
99+
docker compose exec -T web sh -lc "ps aux | grep -E 'prisma.*studio' | grep -v grep || true"
100+
```
101+
102+
## 運用方針メモ(Dockerのみでブラウザから開きたい)
103+
104+
- Dockerのみ運用でホストのブラウザから開くなら、`compose.yaml``web.ports``5555:5555` を publish する必要がある。
105+
- publish するとホストの `:5555` を占有するため、ホスト上で別アプリが `:5555` を使っている場合はポート競合に注意。
106+
107+
## Q&A
108+
109+
### Q. `compose.yaml``5555:5555` を追加すれば良い?
110+
111+
A. Dockerのみ(devcontainerなし)でホストブラウザから `localhost:5555` を開きたいなら妥当。
112+
113+
### Q. devcontainer でも明示した方が良い?
114+
115+
A. 必須ではない(VS Code の port forward で動く)。ただし、Dockerのみ運用と挙動を揃えたい/VS Code 以外からもアクセスしたい場合は明示しておくと再現性が上がる。
116+
117+
### Q. publish すると VS Code 利用に悪影響は?
118+
119+
A. 基本的に大きな悪影響は無い。注意点は「ホストの `:5555` 競合」だけ。

0 commit comments

Comments
 (0)