Как запустить докеризованный сервер Django с пользовательским ip-адресом?

#django #docker

Вопрос:

Когда мы хотим запустить простое приложение Django, мы используем термин: python manage.py runserver <ip>:<port> запустить веб-сервер с нужным IP-адресом. Я попытался сделать то же самое с Докером и Джанго внутри файла docker-compose:

 version: '3.1'

volumes:
    init-db:
    data-db:

services:
    
    mongo:
        image: mongo
        restart: always
        environment:
            MONGO_INITDB_ROOT_USERNAME: <name>
            MONGO_INITDB_ROOT_PASSWORD: <password>
        ports:
            - 27020:27020
        command:  mongod --quiet --logpath /dev/null

    splash:
        image: scrapinghub/splash
        ports:
        - "8050:8050"
        restart: always

    web:
        build: .
        restart: unless-stopped
        command: >
          bash -c "pip install -r requirements.txt amp;amp; python manage.py makemigrations amp;amp; python manage.py migrate amp;amp; python manage.py runserver <some_ip>:<some_port>"
        tty: true
        volumes:
          - .:/usr/src/app
        ports:
          - 8000:8000
        depends_on:
          - mongo
 

Теперь, после бега, это дает мне web_1 | Error: That IP address can't be assigned to.

Примечание: Я получаю IP-адрес с помощью ipconfig Windows, затем выбираю ipv4

Ответ №1:

Процесс внутри контейнера Docker должен прослушиваться по специальному адресу «все интерфейсы» 0.0.0.0. Сам контейнер имеет собственное частное IP-пространство и не может привязываться к произвольным интерфейсам хоста.

И наоборот, в ports: объявлении в вашем docker-compose.yml может быть указан конкретный IP-адрес для прослушивания, и это должен быть один из интерфейсов хоста.

Таким образом, ваш docker-compose.yml файл должен выглядеть примерно так:

 version: '3.8'
services:
  web:
    build: .
    restart: unless-stopped
    ports: ['192.168.1.2:8000:8000'] # <-- host IP address here
    depends_on: [mongo]
    # shouldn't need tty:, volumes:, or command:
  mongo: # as in the question, except
    ports: ['27020:27017'] # <-- second port needs to be standard MongoDB port
 

И соответствующий файл настройки должен выглядеть примерно так:

 FROM python:3.9
WORKDIR /app
COPY requirements.txt .
RUN pip install -r requirements.txt
COPY . .

ENTRYPOINT ["/app/entrypoint.sh"]
# #!/bin/sh
# python manage.py migrate
# exec "$@"

EXPOSE 8000
# Use 0.0.0 as the listen address vvvvvvv
CMD ["./manage.py", "runserver", "0.0.0.0:8000"]
 

Ответ №2:

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