From 5178cabc8c0d3c419694d244506dbdb32f5442bb Mon Sep 17 00:00:00 2001 From: unknown Date: Sun, 10 May 2026 21:21:31 +0300 Subject: [PATCH 1/2] Solution --- .dockerignore | 4 +++ Dockerfile | 21 +++++++++++++++ cinema/management/__init__.py | 0 cinema/management/commands/__init__.py | 0 cinema/management/commands/wait_for_db.py | 19 +++++++++++++ cinema_service/settings.py | 11 +++++--- docker-compose.yaml | 33 +++++++++++++++++++++++ requirements.txt | 1 + 8 files changed, 86 insertions(+), 3 deletions(-) create mode 100644 .dockerignore create mode 100644 Dockerfile create mode 100644 cinema/management/__init__.py create mode 100644 cinema/management/commands/__init__.py create mode 100644 cinema/management/commands/wait_for_db.py create mode 100644 docker-compose.yaml diff --git a/.dockerignore b/.dockerignore new file mode 100644 index 00000000..56df531a --- /dev/null +++ b/.dockerignore @@ -0,0 +1,4 @@ +.venv +Dockerfile +.idea +docker-compose.yaml diff --git a/Dockerfile b/Dockerfile new file mode 100644 index 00000000..593cac97 --- /dev/null +++ b/Dockerfile @@ -0,0 +1,21 @@ +FROM python:3.11.6-alpine3.18 +LABEL maintainer="tanakutova74@gmail.com" + +ENV PYTHOUNNBUFFERED 1 + +COPY requirements.txt requirements.txt +RUN pip install -r requirements.txt + +COPY . . +RUN mkdir -p /files/media + + +RUN adduser \ + --disabled-password \ + --no-create-home \ + my_user + +RUN chown -R my_user /files/media +RUN chmod -R 755 /files/media + +USER my_user diff --git a/cinema/management/__init__.py b/cinema/management/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/cinema/management/commands/__init__.py b/cinema/management/commands/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/cinema/management/commands/wait_for_db.py b/cinema/management/commands/wait_for_db.py new file mode 100644 index 00000000..e1b65c3c --- /dev/null +++ b/cinema/management/commands/wait_for_db.py @@ -0,0 +1,19 @@ +import time + +from django.core.management import BaseCommand +from django.db import connections, OperationalError + + +class Command(BaseCommand): + def handle(self, *args, **options): + self.stdout.write("waiting for db...") + db_conn = None + while not db_conn: + try: + db_conn = connections["default"] + db_conn.cursor() + except OperationalError: + self.stdout.write( + "Database unavailable, waiting for 1 second...") + time.sleep(1) + self.stdout.write(self.style.SUCCESS("Database available!")) diff --git a/cinema_service/settings.py b/cinema_service/settings.py index 90dde772..e72e1e8a 100644 --- a/cinema_service/settings.py +++ b/cinema_service/settings.py @@ -9,6 +9,7 @@ For the full list of settings and their values, see https://docs.djangoproject.com/en/4.0/ref/settings/ """ +import os from datetime import timedelta from pathlib import Path @@ -86,8 +87,12 @@ DATABASES = { "default": { - "ENGINE": "django.db.backends.sqlite3", - "NAME": BASE_DIR / "db.sqlite3", + "ENGINE": "django.db.backends.postgresql", + "NAME": os.environ["POSTGRES_DB"], + "USER": os.environ["POSTGRES_USER"], + "PASSWORD": os.environ["POSTGRES_PASSWORD"], + "HOST": os.environ["POSTGRES_HOST"], + "PORT": os.environ["POSTGRES_PORT"], } } @@ -134,7 +139,7 @@ STATIC_URL = "static/" MEDIA_URL = "/media/" -MEDIA_ROOT = BASE_DIR / "media" +MEDIA_ROOT = "/files/media" # Default primary key field type # https://docs.djangoproject.com/en/4.0/ref/settings/#default-auto-field diff --git a/docker-compose.yaml b/docker-compose.yaml new file mode 100644 index 00000000..3bd22b63 --- /dev/null +++ b/docker-compose.yaml @@ -0,0 +1,33 @@ +services: + cinema: + build: + context: . + env_file: + - .env + ports: + - "8001:8000" + volumes: + - ./:/app + - my_media:/files/media + command: > + sh -c " python manage.py wait_for_db && + python manage.py migrate && + python manage.py runserver 0.0.0.0:8000" + depends_on: + - db + + + db: + image: postgres:16.0-alpine3.17 + restart: always + env_file: + - .env + ports: + - "5433:5432" + volumes: + - my_db:$PGDATA + +volumes: + my_db: + my_media: + diff --git a/requirements.txt b/requirements.txt index 2dc12c67..578afe48 100644 --- a/requirements.txt +++ b/requirements.txt @@ -8,3 +8,4 @@ djangorestframework djangorestframework-simplejwt drf-spectacular Pillow +psycopg2-binary>=2.9.5 From 0c2bee86a477616d7d797a2af5638fe2047e58ea Mon Sep 17 00:00:00 2001 From: unknown Date: Sun, 10 May 2026 21:39:51 +0300 Subject: [PATCH 2/2] Solution --- .dockerignore | 1 - Dockerfile | 2 +- cinema/management/commands/wait_for_db.py | 17 ++++++++--------- docker-compose.yaml | 2 ++ 4 files changed, 11 insertions(+), 11 deletions(-) diff --git a/.dockerignore b/.dockerignore index 56df531a..f3c153e1 100644 --- a/.dockerignore +++ b/.dockerignore @@ -1,4 +1,3 @@ .venv -Dockerfile .idea docker-compose.yaml diff --git a/Dockerfile b/Dockerfile index 593cac97..b3e4fa5b 100644 --- a/Dockerfile +++ b/Dockerfile @@ -1,7 +1,7 @@ FROM python:3.11.6-alpine3.18 LABEL maintainer="tanakutova74@gmail.com" -ENV PYTHOUNNBUFFERED 1 +ENV PYTHONUNBUFFERED 1 COPY requirements.txt requirements.txt RUN pip install -r requirements.txt diff --git a/cinema/management/commands/wait_for_db.py b/cinema/management/commands/wait_for_db.py index e1b65c3c..e9c3c83d 100644 --- a/cinema/management/commands/wait_for_db.py +++ b/cinema/management/commands/wait_for_db.py @@ -7,13 +7,12 @@ class Command(BaseCommand): def handle(self, *args, **options): self.stdout.write("waiting for db...") - db_conn = None - while not db_conn: - try: - db_conn = connections["default"] - db_conn.cursor() - except OperationalError: - self.stdout.write( - "Database unavailable, waiting for 1 second...") - time.sleep(1) + while True: + db_conn = connections["default"] + db_conn.cursor() + if db_conn is not None: + break + self.stdout.write( + "Database unavailable, waiting for 1 second...") + time.sleep(1) self.stdout.write(self.style.SUCCESS("Database available!")) diff --git a/docker-compose.yaml b/docker-compose.yaml index 3bd22b63..6238de1c 100644 --- a/docker-compose.yaml +++ b/docker-compose.yaml @@ -22,6 +22,8 @@ services: restart: always env_file: - .env + environment: + PGDATA: /var/lib/postgresql/data/pgdata ports: - "5433:5432" volumes: