Контейнер Docker не находит файл manage.py при использовании DRF
Я пытался контейнеризировать свой проект, который использует postgresql
. Но по какой-то причине он не может полностью выполнить команды, когда я проверяю веб-контейнер, следя за ним на docker-desktop, я вижу, что он выполняет команды migrations
, но в какой-то момент он останавливается и выдает мне следующую ошибку:
2023-01-17 19:51:29 Apply all migrations: admin, auth, company, contenttypes, oauth2_provider, product, sessions, social_django, users, warehouse
2023-01-17 19:51:29 Running migrations:
2023-01-17 19:51:29 No migrations to apply.
2023-01-17 19:51:29 sh: manage.py: not found
По какой-то причине он не видит файл manage.py.
Когда я запускаю docker-compose run web sh
и проверяю, существует ли manage.py
в каталоге, используя ls
в CLI
, я обнаруживаю, что он там есть.
Что я могу делать неправильно?
Dockerfile
:
# pull official base image
FROM python:3.9-alpine
# set work directory
WORKDIR /app
# set environment variables
ENV PYTHONDONTWRITEBYTECODE 1
ENV PYTHONUNBUFFERED 1
# install psycopg2 dependencies
RUN apk update \
&& apk add postgresql-dev gcc python3-dev musl-dev
# install python dependencies
RUN apk add -u zlib-dev jpeg-dev libffi-dev gcc musl-dev
RUN python3 -m pip install --upgrade pip
COPY requirements.txt /app/requirements.txt
RUN pip install --no-cache-dir -r requirements.txt
# copy project
COPY . .
docker-compose.yml
:
version: '3.9'
services:
nginx:
container_name: core_web
restart: on-failure
image: nginx:stable
volumes:
- ./nginx/nginx.dev.conf:/etc/nginx/conf.d/default.conf
- static_volume:/app/static
ports:
- "80:80"
depends_on:
- web
web:
container_name: web
build: .
env_file: .env
ports:
- "5000:5000"
command: >
sh -c " python manage.py makemigrations && python manage.py migrate &&
manage.py runserver 0.0.0.0:5000"
volumes:
- .:/app
- static_volume:/app/static
depends_on:
- db
db:
container_name: core_db
image: postgres:15
env_file: .env
environment:
- POSTGRES_USER=${DB_USER}
- POSTGRES_PASSWORD=${DB_PASS}
- POSTGRES_DB=${DB_NAME}
volumes:
- postgres_data:/var/lib/postgresql/data/
volumes:
static_volume:
postgres_data:
Я изменил web
своего docker-compose.yml
файла:
web:
tty: true
container_name: web
build: .
restart: always
env_file: .env
ports:
- "5000:5000"
command: >
sh -c " python3 /app/manage.py makemigrations && python3 /app/manage.py migrate && python3 /app/manage.py runserver 0.0.0.0:5000"
volumes:
- .:/app
- static_volume:/app/static
depends_on:
- db
В основном, я добавил tty: true
и изменил команду на:
sh -c " python3 /app/manage.py makemigrations && python3 /app/manage.py migrate && python3 /app/manage.py runserver 0.0.0.0:5000"
То, что, как я полагаю, происходило:
Я не указал папку расположения manage.py
, которая, как я полагаю, была установлена в томах /app
. Таким образом, я должен был указать в команде его местоположение, не стесняйтесь поправить меня в этом.
Это сделало его функциональным и позволило мне получить доступ к бэкенду и его базе данных postgres.