【问题标题】:How can I set the best configurations for the project working with django, docker and mysql?如何为使用 django、docker 和 mysql 的项目设置最佳配置?
【发布时间】:2020-02-26 18:02:43
【问题描述】:

我正在阅读here 的一篇文章,它是关于使用 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,但我仍然找不到它对项目有用,因为当我尝试执行 docker build 时,我遇到了相同的 mysql 依赖问题。有没有人有同样的经历?如果您能在这里帮助我,我将不胜感激。

【问题讨论】:

    标签: python mysql django docker-compose dockerfile


    【解决方案1】:

    根据this整理得很漂亮的文章,我发现这个配置在服务器上运行没有问题(将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
    

    【讨论】:

      【解决方案2】:

      您的问题是您在django 的配置中使用localhost 作为mysql 的主机。 但是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, # (?)
      ...
      

      另外,您在 django 设置中缺少 db 'PORT',我认为对于 Mysql,它是 3306(我已在上面添加)。

      【讨论】:

      • 是的,因为你没有像我说的那样改变HOST,而且就像tuto说的那样......请不要试图走得太快,那样你最终会浪费时间。把我写的所有东西,一个一个,慢慢地。
      【解决方案3】:

      首先尝试使用提供的凭据登录 mysql

      docker exec -it <CONTAINER_ID> /bin/sh
      

      在docker内部请通过命令行登录mysql

      mysql -uroot -psecretpassword
      

      【讨论】:

      • 感谢您在这个问题上花费的时间和精力
      猜你喜欢
      • 1970-01-01
      • 2021-03-09
      • 2021-03-06
      • 1970-01-01
      • 2015-07-18
      • 2018-10-18
      • 2011-12-28
      • 2017-11-19
      • 2017-03-23
      相关资源
      最近更新 更多