Невозможно получить доступ к домашней странице проекта Django (Docker)

Я создаю приложение с помощью Django, но хотя мое приложение работает нормально (по крайней мере, так мне говорит CLI), я не могу получить доступ к нему через браузер.

Сборка с помощью docker-compose работает отлично, я получаю следующий вывод:

 matt $ docker-compose run app sh -c "python manage.py runserver"             
[+] Creating 2/2
 ✔ Network nexus_default  Created                                                                         0.0s 
 ✔ Container nexus-db-1   Created                                                                         0.1s 
[+] Running 1/1
 ✔ Container nexus-db-1  Started                                                                          0.2s 
Watching for file changes with StatReloader
Performing system checks...

System check identified no issues (0 silenced).
March 08, 2024 - 23:21:49
Django version 5.0.3, using settings 'app.settings'
Starting development server at http://127.0.0.1:8000/
Quit the server with CONTROL-C.

Но я не могу получить доступ к нему через браузер (скриншот прилагается) browser-error

Мои конфигурации приведены ниже

Dockerfile:

FROM python:3.12-alpine3.19
LABEL maintainer="Matheus Tenório"

ENV PYTHONUNBUFFERED 1

COPY ./requirements.txt /tmp/requirements.txt
COPY ./requirements.dev.txt /tmp/requirements.dev.txt
COPY ./app /app
WORKDIR /app
EXPOSE 8000

ARG DEV=false
RUN python -m venv /py && \
    /py/bin/pip install --upgrade pip && \
    apk add --update --no-cache postgresql-client && \
    apk add --update --no-cache --virtual .tmp-build-deps \
        build-base postgresql-dev musl-dev && \
    /py/bin/pip install -r /tmp/requirements.txt && \
    if [ $DEV = "true" ]; \
      then /py/bin/pip install -r /tmp/requirements.dev.txt ; \
    fi && \
    rm -rf /tmp && \
    apk del .tmp-build-deps && \
    adduser \
        --disabled-password \
        --no-create-home \
    djangouser && \
    chown djangouser:djangouser -R /app/

ENV PATH="/py/bin:$PATH"

USER djangouser

docker-compose.yml:

version: "3.12"

services:
  app:
    build:
      context: .
      args:
        - DEV=true
    ports:
      - "8000:8000"
    volumes:
      - ./app:/app
    command: >
        sh -c "python manage.py wait_for_db &&
               python manage.py migrate &&
               python manage.py runserver 0.0.0.0:8000"
    environment:
      - DB_HOST=db
      - DB_NAME=${DB_NAME}
      - DB_USER=${DB_USER}
      - DB_PASSWORD=${DB_PASSWORD}
    depends_on:
      - db

  db:
    image: postgres:16-alpine3.19
    volumes:
      - dev-db-data:/var/lib/postgresql/data
    environment:
      - POSTGRES_DB=${DB_NAME}
      - POSTGRES_USER=${DB_USER}
      - POSTGRES_PASSWORD=${DB_PASSWORD}


volumes:
  dev-db-data:

.env

DB_NAME="my_db"
DB_USER="my_user"
DB_PASSWORD="my_password"

settings.py: (Здесь только те конфигурации, которые я изменил по сравнению со стандартными)

import os

ALLOWED_HOSTS = [
    "0.0.0.0",
    "127.0.0.1",
    "localhost",
]

# Database
# https://docs.djangoproject.com/en/5.0/ref/settings/#databases

DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.postgresql',
        'HOST': os.environ.get('DB_HOST'),
        'NAME': os.environ.get('DB_NAME'),
        'USER': os.environ.get('DB_USER'),
        'PASSWORD': os.environ.get('DB_PASSWORD'),
    }
}

А еще это мой docker ps. docker-ps

TEST

Итак, давайте создадим работающее приложение Django. Затем вы сможете добавить к нему свою специфическую функциональность.

Я создал простое приложение, и проект имеет следующий макет. Я применил те же изменения, что и вы, к settings.py.

├── app
│   ├── app
│   │   ├── admin.py
│   │   ├── apps.py
│   │   ├── __init__.py
│   │   ├── migrations
│   │   │   └── __init__.py
│   │   ├── models.py
│   │   ├── tests.py
│   │   ├── urls.py
│   │   └── views.py
│   ├── manage.py
│   └── project
│       ├── asgi.py
│       ├── __init__.py
│       ├── settings.py
│       ├── urls.py
│       └── wsgi.py
├── docker-compose.yml
├── Dockerfile
└── requirements.txt

Для упрощения настроек достаточно указать базу данных SQLite. Вы захотите изменить ее на PostgreSQL, но база данных сейчас не является источником ваших проблем.

🗎 Dockerfile

FROM python:3.12-alpine3.19
LABEL maintainer="Matheus Tenório"

ENV PYTHONUNBUFFERED 1

WORKDIR /app

COPY requirements.txt requirements.txt

RUN apk add --update --no-cache postgresql-client && \
    apk add --update --no-cache --virtual .tmp-build-deps \
        build-base postgresql-dev musl-dev && \
    pip install -r requirements.txt && \
    rm -f requirements.txt && \
    apk del .tmp-build-deps && \
    adduser \
        --disabled-password \
        --no-create-home \
    djangouser && \
    chown djangouser:djangouser -R /app/

COPY app /app

USER djangouser

RUN python manage.py migrate

CMD python manage.py runserver 0.0.0.0:8000

При этом Dockefile применяет миграции во время сборки, а затем запускает сервер.

🗎 docker-compose.yml

version: "3.12"

services:
  app:
    build:
      context: .
    ports:
      - "8000:8000"

Для сборки и запуска:

docker-compose build && docker-compose up

После того, как вы запустили эту программу, я предлагаю следующие шаги:

  1. Добавьте службу db к вашему docker-compose.yml.
  2. Измените settings.py для использования базы данных PostgreSQL. Настройте учетные данные с помощью переменных окружения в docker-compose.yml.
  3. .
  4. Добавьте код вашего конкретного приложения.

enter image description here

Вернуться на верх