Запуск приложения 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
. Вам не нужно указывать Composecommand:
.
Вы также пытаетесь запустить миграции способом, который не сработает; опять же, контейнер запускает только один процесс, и побеждает последний 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: