Как сделать так, чтобы 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 и в этом проблема? В верхней секции показаны журналы экземпляра, созданного из этого образа (вроде как голого).

enter image description here

  1. что мне нужно сделать, чтобы веб-сервер django запускался в каждом контейнере при развертывании?

  2. почему не вызывается 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

Это очень обычная практика для того, чтобы мы могли настраивать все виды параметров, и существует множество случаев использования этого метода.

Если это по-прежнему не помогает, возможно, нам придется рассмотреть другие проблемы, которые могут вызывать эти симптомы.

Вернуться на верх