teratail header banner
teratail header banner
質問するログイン新規登録

質問編集履歴

2

タイトル微修正しました

2021/10/31 13:32

投稿

ryo24
ryo24

スコア0

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

1

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

2021/10/31 13:32

投稿

ryo24
ryo24

スコア0

title CHANGED
@@ -1,1 +1,1 @@
1
- DockerでのAPIレスポンスの画像ファイル配信URLのホスト名が"http://(コンテナ名)~となり、アクセスできない(DjangoRest/Python/Pillow/React)
1
+ DockerでのAPIレスポンスの画像ファイル配信URLのホスト名が"http://(サービス名)~となり、アクセスできない(DjangoRest/Python/Next.js)
body CHANGED
@@ -1,17 +1,16 @@
1
1
  ■前提・実現したいこと
2
2
  Docker上でフロントエンド・バックエンドでそれぞれコンテナを立ち上げて開発を行っています。
3
3
  ・フロントエンド:Next.js
4
- サービス(コンテナ)名:frontend
4
+ サービス名:frontend
5
5
  ポート:"3000:3000"
6
6
  ・バックエンド:DjangoRestFramework
7
- サービス(コンテナ)名:backend
7
+ サービス名:backend
8
8
  ポート:"8000:8000"
9
9
 
10
- フロント上(http://127.0.0.1:3000/)から非同期通信でAPI(http://127.0.0.1:8000/)を叩き、
11
- レスポンスからDBに登録された画像の配信URLを取得して、画像を表示しようと試みています。
10
+ Next.jsにてSSR(SSG)にてAPIを叩き、レスポンスからDBに登録された画像の配信URLを取得して、画像を表示しようと試みています。
12
11
 
13
12
  ■発生している問題・エラーメッセージ
14
- Docker上でフロント:Next.js(port:3000)・バックエンド:DjangoRestFramework(port:8000)でそれぞれコンテナを立ち上げて開発を行っています。
13
+ Docker上でフロント:Next.js・バックエンド:DjangoRestFrameworkでそれぞれコンテナを立ち上げて開発を行っています。
15
14
  DjangoのモデルImageFieldにてDBに画像(の配信URL)を登録して、ローカルの画像を表示しようと試みています。
16
15
 
17
16
  エンドポイントとして設定(たとえば、http://127.0.0.1:8000/api/xxx)したアドレスをブラウザのURLで直接アクセスした場合は、配信URLは以下のように意図通り取得でき、登録した画像を適切に表示できるのですが、
@@ -22,12 +21,60 @@
22
21
  ・・(省略)・・
23
22
  },
24
23
 
25
- フロントから非同期通信で上記のエンドポイントを叩いた場合、以下のようにレスポンス内の画像の配信URLがhttp://(コンテナ名):8000/api/imageとなってしまい、画像を表示することができず、なにが原因・どうすれば改善できるかが分かっていません
24
+ Next.jsにてSSR(SSG)にてエンドポイントを叩いた場合、以下のようにレスポンス内の画像の配信URLがhttp://(サービス名):8000/api/imageとなってしまい、画像を表示することができずっていま
26
25
 
27
26
  {
28
27
  ・・(省略)・・
29
- "image": "http://backend:8000/api/images/xxx.jpg",
28
+ "image": "http://backend(サービス名):8000/api/images/xxx.jpg",
30
29
  ・・(省略)・・
31
30
  },
32
31
 
32
+ ■Docker-Compose.yml
33
+ version: '3'
34
+ services:
35
+ ~省略~
36
+ backend:
37
+ container_name: django-restapi
38
+ build:
39
+ context: ./
40
+ dockerfile: dockerfilePython
41
+ volumes:
42
+ - ./django-restapi:/code
43
+ command: sh -c "python test_app/manage.py runserver 0:8000"
44
+ ports:
45
+ - "8000:8000"
46
+ depends_on:
47
+ - db
48
+ frontend:
49
+ container_name: next.js
50
+ build:
51
+ context: ./
52
+ dockerfile: dockerfileNode
53
+ volumes:
54
+ - ./my-app:/code:cached
55
+ - /code/node_modules
56
+ command: sh -c "npm run dev"
57
+ ports:
58
+ - "3000:3000"
59
+ depends_on:
60
+ - backend
61
+ volumes:
62
+ data_volume:
63
+
64
+ (追記)
65
+ ・自分なりに以下調べました。
66
+ APIに直接アクセスする際は、ports:- "8000:8000"を設定しているため、http://127.0.0.1:8000/にアクセスすることで、以下のレスポンスが返ってきます。(これがどうしてhttp://backend:8000/api/images~にならないのかがわからないですが・・・)
67
+ {
68
+ "image": "http://127.0.0.1:8000/api/images/xxx.jpg",
69
+ },
70
+
71
+ docker内の複数コンテナ(サービス名:frontend・backend)同士でやりとりするために、
72
+ ブラウザおよびSSR/SSGからAPIを叩くときは、http://127.0.0.1:8000/~ではなく、プロキシで127.0.0.1:3000→(frontend:3000→proxy→)http://backend:8000/でアクセスしています。以下参考
73
+ https://hsuzuki.hatenablog.com/entry/2019/10/25/170856
74
+
75
+ 明確な理由は分かっていないですが、上記の理由によりSSR(SSG)のときは、ホスト名がhttp://backend:8000/と扱われて以下のレスポンスが返っていると予測しています。
76
+ {
77
+ "image": "http://backend:8000/api/images/xxx.jpg",
78
+ },
79
+
33
- 上記事象いて、心当たりもしくは解決策等わかる方いらっゃったらご教授ただきたす。
80
+ 上記を踏まえて、開発環境いて、SSR(SSG)のときに画像意図通りにアクセスできようにする方法等ありませんでょうか。よろしくお願いいたします。