質問編集履歴

2

タイトル微修正しました

2021/10/31 13:32

投稿

ryo24
ryo24

スコア0

test CHANGED
@@ -1 +1 @@
1
- DockerでAPIレスポンスの画像ファイル配信URLのホスト名が"http://(サービス名)~となり、アクセスできない(DjangoRest/Python/Next.js)
1
+ DockerSSRにて、APIレスポンスの画像ファイル配信URLのホスト名が"http://(サービス名)~となり、アクセスできない(Django/Next.js)
test CHANGED
File without changes

1

自分なりに原因調査した内容、内容修正&追記しました

2021/10/31 13:32

投稿

ryo24
ryo24

スコア0

test CHANGED
@@ -1 +1 @@
1
- DockerでのAPIレスポンスの画像ファイル配信URLのホスト名が"http://(コンテナ名)~となり、アクセスできない(DjangoRest/Python/Pillow/React)
1
+ DockerでのAPIレスポンスの画像ファイル配信URLのホスト名が"http://(サービス名)~となり、アクセスできない(DjangoRest/Python/Next.js)
test CHANGED
@@ -4,27 +4,25 @@
4
4
 
5
5
  ・フロントエンド:Next.js
6
6
 
7
- サービス(コンテナ)名:frontend
7
+ サービス名:frontend
8
8
 
9
9
  ポート:"3000:3000"
10
10
 
11
11
  ・バックエンド:DjangoRestFramework
12
12
 
13
- サービス(コンテナ)名:backend
13
+ サービス名:backend
14
14
 
15
15
  ポート:"8000:8000"
16
16
 
17
17
 
18
18
 
19
- フロント上(http://127.0.0.1:3000/)から非同期通信でAPI(http://127.0.0.1:8000/)を叩き、
20
-
21
- レスポンスからDBに登録された画像の配信URLを取得して、画像を表示しようと試みています。
19
+ Next.jsにてSSR(SSG)にてAPIを叩き、レスポンスからDBに登録された画像の配信URLを取得して、画像を表示しようと試みています。
22
20
 
23
21
 
24
22
 
25
23
  ■発生している問題・エラーメッセージ
26
24
 
27
- Docker上でフロント:Next.js(port:3000)・バックエンド:DjangoRestFramework(port:8000)でそれぞれコンテナを立ち上げて開発を行っています。
25
+ Docker上でフロント:Next.js・バックエンド:DjangoRestFrameworkでそれぞれコンテナを立ち上げて開発を行っています。
28
26
 
29
27
  DjangoのモデルImageFieldにてDBに画像(の配信URL)を登録して、ローカルの画像を表示しようと試みています。
30
28
 
@@ -46,7 +44,7 @@
46
44
 
47
45
 
48
46
 
49
- フロントから非同期通信で上記のエンドポイントを叩いた場合、以下のようにレスポンス内の画像の配信URLがhttp://(コンテナ名):8000/api/imageとなってしまい、画像を表示することができず、なにが原因・どうすれば改善できるかが分かっていません
47
+ Next.jsにてSSR(SSG)にてエンドポイントを叩いた場合、以下のようにレスポンス内の画像の配信URLがhttp://(サービス名):8000/api/imageとなってしまい、画像を表示することができずっていま
50
48
 
51
49
 
52
50
 
@@ -54,7 +52,7 @@
54
52
 
55
53
  ・・(省略)・・
56
54
 
57
- "image": "http://backend:8000/api/images/xxx.jpg",
55
+ "image": "http://backend(サービス名):8000/api/images/xxx.jpg",
58
56
 
59
57
  ・・(省略)・・
60
58
 
@@ -62,4 +60,100 @@
62
60
 
63
61
 
64
62
 
63
+ ■Docker-Compose.yml
64
+
65
+ version: '3'
66
+
67
+ services:
68
+
69
+ ~省略~
70
+
71
+ backend:
72
+
73
+ container_name: django-restapi
74
+
75
+ build:
76
+
77
+ context: ./
78
+
79
+ dockerfile: dockerfilePython
80
+
81
+ volumes:
82
+
83
+ - ./django-restapi:/code
84
+
85
+ command: sh -c "python test_app/manage.py runserver 0:8000"
86
+
87
+ ports:
88
+
89
+ - "8000:8000"
90
+
91
+ depends_on:
92
+
93
+ - db
94
+
95
+ frontend:
96
+
97
+ container_name: next.js
98
+
99
+ build:
100
+
101
+ context: ./
102
+
103
+ dockerfile: dockerfileNode
104
+
105
+ volumes:
106
+
107
+ - ./my-app:/code:cached
108
+
109
+ - /code/node_modules
110
+
111
+ command: sh -c "npm run dev"
112
+
113
+ ports:
114
+
115
+ - "3000:3000"
116
+
117
+ depends_on:
118
+
119
+ - backend
120
+
121
+ volumes:
122
+
123
+ data_volume:
124
+
125
+
126
+
127
+ (追記)
128
+
129
+ ・自分なりに以下調べました。
130
+
131
+ APIに直接アクセスする際は、ports:- "8000:8000"を設定しているため、http://127.0.0.1:8000/にアクセスすることで、以下のレスポンスが返ってきます。(これがどうしてhttp://backend:8000/api/images~にならないのかがわからないですが・・・)
132
+
133
+ {
134
+
135
+ "image": "http://127.0.0.1:8000/api/images/xxx.jpg",
136
+
137
+ },
138
+
139
+
140
+
141
+ docker内の複数コンテナ(サービス名:frontend・backend)同士でやりとりするために、
142
+
143
+ ブラウザおよびSSR/SSGからAPIを叩くときは、http://127.0.0.1:8000/~ではなく、プロキシで127.0.0.1:3000→(frontend:3000→proxy→)http://backend:8000/でアクセスしています。以下参考
144
+
145
+ https://hsuzuki.hatenablog.com/entry/2019/10/25/170856
146
+
147
+
148
+
149
+ 明確な理由は分かっていないですが、上記の理由によりSSR(SSG)のときは、ホスト名がhttp://backend:8000/と扱われて以下のレスポンスが返っていると予測しています。
150
+
151
+ {
152
+
153
+ "image": "http://backend:8000/api/images/xxx.jpg",
154
+
155
+ },
156
+
157
+
158
+
65
- 上記事象いて、心当たがあもしくは解決策等わかる方いらっゃったらご教授いただきたいです。
159
+ 上記を踏まえて、開発環境いて、SSR(SSG)のときに画像が意図通にアクセスできようにする方法等ありませんでょうか。よろしくお願します。