-
Notifications
You must be signed in to change notification settings - Fork 946
Solution #1008
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
base: master
Are you sure you want to change the base?
Solution #1008
Changes from 4 commits
File filter
Filter by extension
Conversations
Jump to
Diff view
Diff view
There are no files selected for viewing
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,7 @@ | ||
| .venv | ||
| .env | ||
| __pycache__/ | ||
| *.pyc | ||
| .idea | ||
| media | ||
| .pytest_cache/ |
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,25 @@ | ||
| FROM python:3.11-slim | ||
|
|
||
| LABEL maintainer="rarturus" | ||
|
|
||
| ENV PYTHONUNBUFFERED 1 | ||
|
|
||
| WORKDIR /app | ||
|
|
||
| COPY requirements.txt . | ||
|
|
||
| RUN apt-get update && apt-get install -y build-essential libpq-dev && rm -rf /var/lib/apt/lists/* | ||
| RUN pip install --no-cache-dir -r requirements.txt | ||
|
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Installing Python packages on Alpine often requires system build dependencies (gcc, musl-dev, postgresql-dev, libffi-dev, openssl-dev, build-base, etc.) if your requirements include packages like There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Critical: you must install OS build dependencies before running pip install so native DB drivers (like psycopg2) can be built. Add a RUN step such as: |
||
|
|
||
| COPY . . | ||
| RUN mkdir -p /files/media | ||
|
|
||
| RUN adduser \ | ||
| --disabled-password \ | ||
| --no-create-home \ | ||
| my_user | ||
|
Comment on lines
+17
to
+20
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. The |
||
|
|
||
| RUN chown -R my_user:my_user /files/media | ||
| RUN chmod -R 755 /files/media | ||
|
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Permissions: you create |
||
|
|
||
| USER my_user | ||
|
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Setting |
||
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,19 @@ | ||
| import time | ||
|
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Minor/informational: the migration header says it was generated by Django 6.0.4 while project settings indicate Django 4.x. This version mismatch is unusual and may indicate the migration was generated with a different Django version. Verify migrations and Django version compatibility. |
||
| from django.core.management.base import BaseCommand | ||
|
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Critical: You are ignoring the Dockerfile in .dockerignore. Docker will not send the Dockerfile into the build context if it's listed here, which prevents building the app image. Remove this line so the Dockerfile is included in the build context. |
||
| from django.db import connections | ||
| from django.db.utils import OperationalError | ||
|
|
||
|
|
||
| class Command(BaseCommand): | ||
| help = "Wait for database to be available" | ||
|
|
||
| def handle(self, *args, **options): | ||
|
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. If your requirements include packages like There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Before running
This ensures packages like |
||
| self.stdout.write("Waiting for database...") | ||
| while True: | ||
|
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. COPY . . is fine for image build, but if you later mount the project directory as a volume in docker-compose (bind mount), it will overwrite the image contents at runtime and make the image less independent/thin. Reconsider the bind mount in compose if your goal is to make the service independent of the local machine, or document that mounting is for development only. |
||
| try: | ||
| connections["default"].cursor() | ||
| break | ||
| except OperationalError: | ||
| self.stdout.write("Database unavailable, waiting 1 second...") | ||
| time.sleep(1) | ||
|
Comment on lines
+13
to
+16
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. The adduser command used here appears to use Debian-style flags (e.g. --disabled-password, --no-create-home). On Alpine-based images the adduser implementation and flags are different and this RUN may fail during image build. Either use an Alpine-compatible user creation (e.g.
Comment on lines
+13
to
+16
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. You create a user with |
||
| self.stdout.write(self.style.SUCCESS("Database available!")) | ||
This file was deleted.
| Original file line number | Diff line number | Diff line change |
|---|---|---|
|
|
@@ -9,6 +9,7 @@ | |
| For the full list of settings and their values, see | ||
|
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. The app service runs Django on 0.0.0.0:8000 but there is no |
||
| https://docs.djangoproject.com/en/4.0/ref/settings/ | ||
|
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Critical: the Dockerfile runs |
||
| """ | ||
|
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. You bind-mount the project directory into the container ( |
||
| import os | ||
| from datetime import timedelta | ||
| from pathlib import Path | ||
|
|
||
|
|
@@ -86,12 +87,15 @@ | |
|
|
||
| DATABASES = { | ||
| "default": { | ||
| "ENGINE": "django.db.backends.sqlite3", | ||
| "NAME": BASE_DIR / "db.sqlite3", | ||
| "ENGINE": os.environ.get("SQL_ENGINE", "django.db.backends.sqlite3"), | ||
| "NAME": os.environ.get("SQL_DATABASE", BASE_DIR / "db.sqlite3"), | ||
|
Comment on lines
+90
to
+91
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. The database ENGINE and NAME default to SQLite if environment variables are not provided. Ensure your |
||
| "USER": os.environ.get("SQL_USER", "user"), | ||
| "PASSWORD": os.environ.get("SQL_PASSWORD", "password"), | ||
| "HOST": os.environ.get("SQL_HOST", "localhost"), | ||
|
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Default HOST is |
||
| "PORT": os.environ.get("SQL_PORT", "5432"), | ||
| } | ||
| } | ||
|
|
||
|
|
||
| # Password validation | ||
| # https://docs.djangoproject.com/en/4.0/ref/settings/#auth-password-validators | ||
|
|
||
|
|
@@ -134,7 +138,8 @@ | |
| 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 | ||
|
|
@@ -167,7 +172,7 @@ | |
| } | ||
|
|
||
| SIMPLE_JWT = { | ||
| "ACCESS_TOKEN_LIFETIME": timedelta(minutes=5), | ||
| "ACCESS_TOKEN_LIFETIME": timedelta(days=1), | ||
| "REFRESH_TOKEN_LIFETIME": timedelta(days=1), | ||
| "ROTATE_REFRESH_TOKENS": False, | ||
| } | ||
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,34 @@ | ||
| services: | ||
| app: | ||
| build: | ||
| context: . | ||
| env_file: | ||
| - .env | ||
|
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. You currently ignore |
||
| command: > | ||
| sh -c "python manage.py wait_for_db && python manage.py migrate && | ||
|
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. The management command defines |
||
| python manage.py runserver 0.0.0.0:8000" | ||
| volumes: | ||
|
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Installing Python dependencies on Alpine often requires system build libraries (gcc, musl-dev, postgresql-dev, libffi-dev, openssl-dev, etc.). Add an There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more.
|
||
| - media_data:/files/media | ||
|
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. COPY . . copies the project into the image, but your docker-compose also binds the host project directory into There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Good: the app mounts |
||
| depends_on: | ||
| - db | ||
|
Comment on lines
+12
to
+13
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Operational note: |
||
| ports: | ||
| - "8000:8000" | ||
|
|
||
| db: | ||
| image: postgres:16.0-alpine3.17 | ||
|
Comment on lines
+15
to
+18
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. You create a |
||
| environment: | ||
|
Comment on lines
+16
to
+19
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. The |
||
| POSTGRES_USER: "rarturus" | ||
| POSTGRES_PASSWORD: "password" | ||
|
Comment on lines
+20
to
+21
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. You only |
||
| POSTGRES_DB: "db" | ||
| restart: always | ||
| ports: | ||
| - "5432:5432" | ||
| env_file: | ||
| - .env | ||
| volumes: | ||
| - db_data:/var/lib/postgresql/data | ||
|
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Good: the Postgres service volume is mapped to |
||
|
|
||
|
|
||
| volumes: | ||
| db_data: | ||
| media_data: | ||
| Original file line number | Diff line number | Diff line change |
|---|---|---|
|
|
@@ -8,3 +8,5 @@ djangorestframework | |
| djangorestframework-simplejwt | ||
| drf-spectacular | ||
| Pillow | ||
| psycopg==3.3.3 | ||
| psycopg-binary==3.3.3 | ||
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
The management command has a typo: use the attribute name
help, nothelp1. While the command will still run, thehelptext won't be available inmanage.py helpand this deviates from the typical implementation required by the task. Consider also adding a small timeout/retry limit or logging if you need it.