Запуск приложения django с помощью docker, нераспознанные аргументы runserver

У меня проблема с запуском моего проекта django в контейнере docker. Я пытался сделать это несколькими способами, например:

docker-compose run web python manage.py runserver

или просто

docker-compose up

Первый раз, когда я попробовал это, я не получил никакой ошибки, но я не смог открыть приложение в браузере, поэтому я попробовал снова, а затем оно полностью перестало работать. Я получаю эту ошибку:

manage.py runserver: error: unrecognized arguments: python manage.py runserver

Мой docker-compose.yml

version: "3.9"

services:
  db:
    image: postgres:alpine
    volumes:
      - ./data/db:/var/lib/postgresql/data
    environment:
      - POSTGRES_DB=gitlabdumptables
      - POSTGRES_USER=postgres
      - POSTGRES_PASSWORD=postgres
  web:
    build: .
    command: python manage.py runserver 0.0.0.0:8000
    volumes:
      - .:/code
    ports:
      - "8000:8000"
    environment:
      - POSTGRES_NAME=gitlabdumptables
      - POSTGRES_USER=postgres
      - POSTGRES_PASSWORD=postgres
    depends_on:
      - db

Мой Dockerfile

# syntax=docker/dockerfile:1
FROM python:3
ENV PYTHONDONTWRITEBYTECODE=1
ENV PYTHONUNBUFFERED=1
WORKDIR /code
COPY requirements.txt /code/
RUN pip3 install -r requirements.txt
CMD python manage.py makemigrations
CMD python manage.py migrate
COPY . /code/
ENTRYPOINT [ "python", "manage.py", "runserver", "0.0.0.0:8000" ]

Основной процесс, запускаемый в контейнере Docker, состоит из двух частей. Вы предоставляете ENTRYPOINT в Dockerfile, а затем эквивалент CMD с аргументами Compose command: или docker run ./manage.py .... Когда у вас есть и ENTRYPOINT, и CMD, и CMD передаются в качестве дополнительных аргументов в ENTRYPOINT; поэтому в данном случае вы запускаете python manage.py runserver 0.0.0.0:8000 python manage.py runserver 0.0.0.0:8000.

Для этой установки я бы предложил:

  • Если вы хотите иметь возможность переопределять команду при запуске контейнера (что очень полезно), предпочтите CMD команде ENTRYPOINT в вашем Dockerfile. Тогда эти переопределения команды будут заменять команду.
  • Если у вас есть полезная команда по умолчанию (а это так), поместите ее в Dockerfile CMD. Вам не нужно указывать Compose command:.

Вы также пытаетесь запустить миграции способом, который не сработает; опять же, контейнер запускает только один процесс, и побеждает последний CMD или переопределение времени запуска. Я бы использовал сценарий-обертку для запуска миграций:

#!/bin/sh
# entrypoint.sh

# Run migrations
python manage.py migrate

# Then run the main container command (passed to us as arguments)
exec "$@"

В вашем Dockerfile убедитесь, что это COPY включено (существующая COPY команда, которая у вас есть, сделает это) и сделайте этот сценарий ENTRYPOINT (с синтаксисом JSON-массива).

FROM python:3.10
ENV PYTHONDONTWRITEBYTECODE=1
ENV PYTHONUNBUFFERED=1
WORKDIR /code
COPY requirements.txt ./
RUN pip install -r requirements.txt
COPY ./ ./
ENTRYPOINT ["./entrypoint.sh"]                           # must be JSON-array form
CMD ["python", "manage.py", "runserver", "0.0.0.0:8000"] # not ENTRYPOINT

В вашем файле Compose вам не нужно вводить код volumes: или заменять command:, они уже являются частью вашего Dockerfile.

version: '3.8'
services:
  db: { ... }
  web:
    build: .
    ports:
      - '8000:8000'
    environment: { ... }
    depends_on:
      - db
    # but no volumes: or command:
Вернуться на верх