Как я могу установить лучшие конфигурации для проекта, работающего с django, docker и mysql? - PullRequest
1 голос
/ 31 октября 2019

Я читал статью в здесь о настройке проекта с использованием docker, django и mysql вместе.

это мои файлы в проекте:

Dockerfile

FROM python:3.7
MAINTAINER masoud masoumi moghadam
ENV PYTHONUNBUFFERED 1

RUN mkdir /app
WORKDIR /app
ADD . /app

ADD requirements.txt /app/requirements.txt

RUN pip install --upgrade pip && pip install -r requirements.txt

Docker-compose

version: "3"

services:
  app:
    build:
      context: .
    ports:
      - "8000:8000"
    volumes:
      - ./app:/app
    command: >
      sh -c "python manage.py runserver 0.0.0.0:8000"
    environment:
      - DB_HOST=localhost
      - DB_NAME=contact_list
      - DB_USER=root
      - DB_PASS=secretpassword
    depends_on:
      - db

  db:
    image: mysql:5.7
    environment:
      - MYSQL_DATABASE=contact_list
      - MYSQL_USER=root
      - MYSQL_PASSWORD=secretpassword

требования

Django>=2.0,<3.0
djangorestframework<3.10.0
mysqlclient==1.3.13
django-mysql==2.2.0

итакже эти настройки в моем setting.py:

DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.mysql',
        'HOST': os.environ.get('DB_HOST'),
        'NAME': os.environ.get('DB_NAME'),
        'USER': os.environ.get('DB_USER'),
        'PASSWORD': os.environ.get('DB_PASS')
        }
}

Когда я использую docker-compose build, у меня нет проблем, и все просто отлично. Тогда я бегу service mysql start. Я могу заверить, что служба mysql запущена и работает, потому что у меня есть доступ к наборам данных. Проблема возникает, когда я выполняю миграцию с помощью этой команды docker-compose run app sh -c "python manage.py makemigrations core" Я получаю эту ошибку:

django.db.utils.OperationalError: (2002, 
"Can't connect to local MySQL server through socket 
'/var/run/mysqld/mysqld.sock' (2)")

Когда я изменяю localhost на 127.0.0.1 Я получаю эту ошибку:

django.db.utils.OperationalError: 
(2002, "Can't connect to MySQL 
server on '127.0.0.1' (115)")

Я потратил 20 часов на поиски наилучшей конфигурации для этих технологий, но я до сих пор ничего не могу понять. Я также использовал python-alpine, но все еще не мог найти его полезным для проекта, потому что у меня была та же проблема с зависимостями mysql, когда я пытался сделать docker build. У кого-нибудь есть такой же опыт? Буду признателен, если вы поможете мне здесь.

Ответы [ 3 ]

0 голосов
/ 31 октября 2019

Ваша проблема в том, что вы используете localhost в качестве хоста mysql в конфигурации django. Но контейнеры Docker имеют свой собственный IP, они не являются localhost.

Итак, сначала в вашем файле docker-compose, назовите ваши контейнеры:

db:
  image: mysql:5.7
  container_name: db
  ...

Затем в настройках django установитеваш db HOST к имени вашего db контейнера: "db":

DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.mysql',
        'HOST': 'db',
        'PORT' : 3306, # (?)
...

Также вам не хватает db 'PORT' в настройках django, я думаю, что для Mysql это 3306 (я добавил его выше).

0 голосов
/ 02 ноября 2019

Согласно этой прекрасно организованной статье, я обнаружил, что у этих конфигураций не будет проблем с запуском на сервере (изменил службу mysql на службу postgress):

Dockerfile

# pull official base image
FROM python:3.8.0-alpine

# set work directory
WORKDIR /usr/src/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 dependencies
RUN pip install --upgrade pip
COPY requirements.txt /usr/src/app/requirements.txt
RUN pip install -r requirements.txt

# copy entrypoint.sh
COPY entrypoint.sh /usr/src/app/entrypoint.sh

# copy project
COPY . /usr/src/app/

# run entrypoint.sh
ENTRYPOINT ["/usr/src/app/entrypoint.sh"]

Docker-compose.yml

version: '3.7'

services:
  web:
    build: app
    # container_name: web
    command: python manage.py runserver 0.0.0.0:8000
    restart: always
    volumes:
      - ./app/:/usr/src/app/
    ports:
      - 8000:8000
    env_file:
      - .env.dev
    depends_on:
      - db

  db:
    image: postgres:12.0-alpine
    # container_name: postgres
    restart: always
    volumes:
      - postgres_data:/var/lib/postgresql/data/
    environment:
      - POSTGRES_USER=user
      - POSTGRES_PASSWORD=123456
      - POSTGRES_DB=contact_list

требования

Django==2.2.6
gunicorn==19.9.0
djangorestframework>=3.9.2,<3.10.0
psycopg2-binary==2.8.3

настройки

DATABASES = {
'default': {
    'ENGINE': os.environ.get('SQL_ENGINE', "django.db.backends.sqlite3"),
    'NAME': os.environ.get("SQL_DB_NAME", os.path.join(BASE_DIR, "db.sqlite3")),
    'USER': os.environ.get("SQL_USER", "user"),
    'PASSWORD': os.environ.get("SQL_PASSWORD", "password"),
    'HOST': os.environ.get("SQL_HOST", "localhost"),
    'PORT': os.environ.get("SQL_PORT", "5432"),
}

}

Я добавил файл с именем .env.dev, который предназначен для лучшего доступа к переменным среды:

DEBUG=1
SECRET_KEY=123456
DJANGO_ALLOWED_HOSTS=localhost 127.0.0.1 [::1]
SQL_ENGINE=django.db.backends.postgresql
SQL_HOST=db
SQL_DB_NAME=contact_list
SQL_USER=user
SQL_PASSWORD=123456
SQL_PORT=5432
DATABASE=postgres
0 голосов
/ 31 октября 2019

сначала попробуйте войти в MySQL с предоставленными учетными данными

docker exec -it <CONTAINER_ID> /bin/sh

Внутри докера, пожалуйста, войдите в MySQL через командную строку

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