Как сделать так, чтобы django devserver запускался каждый раз, когда я создаю контейнер docker, а не когда собираю образ
tldr version: how do i do x everytime i build container, instead of everytime i build new image.
я собираю очень простой пример django на docker. когда я делаю docker-compose build все работает так, как я хочу
version: '3.9'
services:
app:
build:
context: .
command: sh -c "python manage.py runserver 0.0.0.0:8000"
ports:
- 8000:8000
volumes:
- ./app:/app
environment:
- SECRET_KEY=devsecretkey
- DEBUG=1
<<<Это запускает django devserver, но только когда образ находится в процессе сборки. Контейнеры, созданные с помощью образа, ничего не делают, но на самом деле я хочу, чтобы они запускали django devserver. Поэтому я решил, что мне следует просто переместить из docker-compose в мой dockerfile в качестве точки входа.command: sh -c "python manage.py runserver 0.0.0.0:8000"
ниже приведен мой файл docker
FROM python:3.9-alpine3.13
LABEL maintainer="madshit.com"
ENV PYTHONUNBUFFERED 1
COPY ./requirements.txt /requirements.txt
COPY ./app /app
WORKDIR /app
EXPOSE 8000
RUN python -m venv /py && \
/py/bin/pip install --upgrade pip && \
/py/bin/pip install -r /requirements.txt && \
adduser --disabled-password --no-create-home app
ENV PATH="/py/bin:$PATH"
USER app
ENTRYPOINT python manage.py runserver # i added this because i thought it would be called everytime my docker environment was finished setting up. no dice :(
Нижняя часть изображения ниже - это скриншот логов моего образа из docker desktop. странно, что последняя команда, которую он принял, была для установки пользователя, но не имела ничего общего с entrypoint. может быть, он проигнорировал entrypoint и в этом проблема? В верхней секции показаны журналы экземпляра, созданного из этого образа (вроде как голого).
что мне нужно сделать, чтобы веб-сервер django запускался в каждом контейнере при развертывании?
почему не вызывается entrypoint? (в логах его нет)
.
Я бы рекомендовал немного изменить логику переменной окружения.
environment:
- SECRET_KEY=devsecretkey
- DEBUG=1 <-- replace this
- SERVER='localhost' <-- or other env like staging or live
Затем в файле настроек вы можете сделать следующее:
SERVER = os.environ.get('SERVER')
Затем вы можете установить переменные, основанные на строке, следующим образом:
if SERVER == 'production':
DEBUG = FALSE
else:
DEBUG = True
Это очень обычная практика для того, чтобы мы могли настраивать все виды параметров, и существует множество случаев использования этого метода.
Если это по-прежнему не помогает, возможно, нам придется рассмотреть другие проблемы, которые могут вызывать эти симптомы.