Почему я не могу отправлять HTTP-запросы на мой сервер Django, работающий в образе докера в Windows, когда я могу отправить их на тот же сервер, который настроен на Mac? - PullRequest
1 голос
/ 11 октября 2019

У меня есть сервер Django, созданный с помощью docker-compose, и я пытаюсь отправить на него HTTP-запросы. Когда образ докера собран и работает на Mac, я могу отправлять HTTP-запросы на IP-адрес хост-машины как с хост-компьютера, так и с других компьютеров в той же сети. Однако, когда тот же образ докера создается и работает в Windows, я могу отправлять только HTTP-запросы на IP-адрес хост-машины, используя хост-компьютер. Другие компьютеры в сети не получают ответ при отправке HTTP-запросов на IP-адрес хост-машины. Я также могу успешно пропинговать хост-компьютер с другого компьютера в сети.

У меня есть переменные окружения для приложения и для базы данных, которую docker-compose извлекает из двух файлов (.env.prod и .env.db.prod), и переменные в обоих файлах одинаковы для обеих сборок образа докера на Mac и Windows, за исключением переменной среды ALLOWED_HOSTS, которую я установил в качестве IP-адреса хост-машины образа докера. Я проверил, что переменная ALLOWED_HOSTS в настройках сервера устанавливается с IP-адресом из файла, потому что когда я печатаю переменную во время выполнения, она печатает IP-адрес из файла.

docker-compose.prod. yml:

version: '3.7'

services:
  web:
    build:
      context: ./
      dockerfile: Dockerfile.prod
    command: gunicorn EchoNine.wsgi:application --bind 0.0.0.0:80
    ports:
      - 80:80
    env_file: .env.prod
    depends_on:
      - db
  db:
    image: postgres
    volumes:
      - postgres_data:/var/lib/postgresql/data/
    env_file: .env.db.prod
    ports:
      - 5432:5432

volumes:
  postgres_data:

Dockerfile.prod:

# pull official base image
FROM python:3.7.4-alpine

# set work directory
ARG PROJECT=EchoNine
ARG PROJECT_DIR=/var/www/${PROJECT}
RUN mkdir -p $PROJECT_DIR
WORKDIR $PROJECT_DIR

# set environment variables
ENV PYTHONDONTWRITEBYTECODE 1
ENV PYTHONUNBUFFERED 1

# install dependencies
RUN apk update \
    && apk add --virtual build-deps gcc python3-dev musl-dev \
    && apk add postgresql-dev \
    && pip install psycopg2 \
    && pip install django \
    && pip install djangorestframework \
    && pip install gunicorn \
    && apk del build-deps

# Copy your application code to the container (make sure you create a .dockerignore file if any large files or directories should be excluded)
COPY . $PROJECT_DIR/

# run entrypoint.sh
ENTRYPOINT ["/var/www/EchoNine/docker-entrypoint.prod.sh"]

docker-entrypoint.prod.sh:

#!/bin/sh

if [ "$DATABASE" = "postgres" ]
then
    echo "Waiting for postgres..."

    while ! nc -z $SQL_HOST $SQL_PORT; do
      sleep 0.1
    done

    echo "PostgreSQL started"
fi

exec $@

Я ожидаю, что тот же код изображения докера будетСборка и запуск одинаковы для обеих операционных систем, и я ожидал, что смогу отправлять HTTP-запросы с других компьютеров в той же сети и получать ответы независимо от того, на какой ОС работает хост. Как мне решить эту проблему?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...