Docker-Compose -前端服务无法从后端使用端点

e4yzc0pl  于 2023-10-16  发布在  Docker
关注(0)|答案(1)|浏览(202)

上下文

我目前正在做一个多容器项目,涉及react、django和(最终)几个数据存储,所有这些都是容器化的,并通过docker-compose绑定在一起。这些都是在vscode devcontainers中开发的。主机操作系统为Windows 11。

问题

我可以通过浏览器(和Django的API web接口)向我的Django API发出请求。但是,我不能通过前端服务向API发出请求。使用JavaScript fetch API,我无法向以下任何对象发出请求

  • localhost:8000(注:许多啧啧的说,这应该功能刚刚好)
  • 0.0.0.0:8000(注:这至少会抛出NS_ERROR_CONNECTION_REFUSED错误,该错误仍然无法解决)
  • host.docker.internal:8000
  • 192.168.99.100:8000
  • 172.24.0.2:8000

What I've Tried

  • 使用Django正确配置CORS
  • 确保所有适当的端口都在Docker中公开和转发
  • 重新实现整个项目,并根据其他一些半吊子教程。两次

详情

后端Dockerfile

  1. FROM python:3.10-alpine
  2. ENV PYTHONUNBUFFERED=1
  3. WORKDIR /app
  4. COPY . .
  5. RUN apk add poetry && poetry install
  6. EXPOSE 8000

前端Dockerfile

  1. FROM node:lts-alpine
  2. WORKDIR /app
  3. COPY . .
  4. RUN yarn install
  5. EXPOSE 3000
  6. CMD ["yarn", "start"]

docker-compose.yml

  1. services:
  2. frontend:
  3. build: ./frontend
  4. ports:
  5. - "3000:3000"
  6. volumes:
  7. - ./frontend:/frontend
  8. depends_on:
  9. - backend
  10. backend:
  11. build: ./backend
  12. ports:
  13. - "8000:8000"
  14. volumes:
  15. - ./backend:/backend
  16. command: "poetry run python manage.py runserver 0.0.0.0:8000"

Django Settings.py

  1. ALLOWED_HOSTS = ["0.0.0.0"] # ADDED CORS
  2. # Application definition
  3. INSTALLED_APPS = [
  4. "django.contrib.admin",
  5. "django.contrib.auth",
  6. "django.contrib.contenttypes",
  7. "django.contrib.sessions",
  8. "django.contrib.messages",
  9. "django.contrib.staticfiles",
  10. "corsheaders", # ADDED CORS
  11. ]
  12. CORS_ORIGIN_WHITELIST = [
  13. "http://localhost:3000" # ADDED CORS
  14. ]
  15. MIDDLEWARE = [
  16. "django.middleware.security.SecurityMiddleware",
  17. "django.contrib.sessions.middleware.SessionMiddleware",
  18. "corsheaders.middleware.CorsMiddleware", # ADDED CORS
  19. "django.middleware.common.CommonMiddleware",
  20. "django.middleware.csrf.CsrfViewMiddleware",
  21. "django.contrib.auth.middleware.AuthenticationMiddleware",
  22. "django.contrib.messages.middleware.MessageMiddleware",
  23. "django.middleware.clickjacking.XFrameOptionsMiddleware",
  24. ]

React App.tsx

  1. const App = () => {
  2. const [currentTime, setCurrentTime] = useState(0);
  3. const [currentDate, setCurrentDate] = useState(0);
  4. useEffect(() => {
  5. fetch(`http://localhost:8000`)
  6. .then((res) => res.json())
  7. .then((data) => {
  8. setCurrentTime(data.time);
  9. setCurrentDate(data.date);
  10. });
  11. }, []);
  12. return (
  13. <div className="App">
  14. <header className="App-header">
  15. <p>
  16. The date is {currentDate} and the time is {currentTime}.
  17. </p>{" "}
  18. <br />
  19. </header>
  20. </div>
  21. );
  22. };
kxkpmulp

kxkpmulp1#

Django的settings.py需要以下内容,因为唯一可访问的端口来自http://host.docker.internal域。不是localhost,如许多tuts和文档中所描述的那样。

  1. CORS_ORIGIN_WHITELIST = [
  2. ...,
  3. "http://host.docker.internal:3000"
  4. ]

相关问题