Python 将Django应用程序与MySQL容器对接

Python 将Django应用程序与MySQL容器对接,python,mysql,django,docker,docker-compose,Python,Mysql,Django,Docker,Docker Compose,我有一个应用程序是用Django(2.2.7)开发的,在Windows10Pro中运行python(3.8.0)、Docker(19.03.5)和Docker compose(1.25.2)。我想通过将sqlite3数据库更改为MySQL数据库来将其固定化。我已经写了这个Dockerfile: FROM python:3.7 ENV PYTHONUNBUFFERED 1 RUN mkdir /code WORKDIR /code ADD . /code/ RUN pip install --up

我有一个应用程序是用Django(2.2.7)开发的,在Windows10Pro中运行python(3.8.0)、Docker(19.03.5)和Docker compose(1.25.2)。我想通过将sqlite3数据库更改为MySQL数据库来将其固定化。我已经写了这个
Dockerfile

FROM python:3.7
ENV PYTHONUNBUFFERED 1
RUN mkdir /code
WORKDIR /code
ADD . /code/
RUN pip install --upgrade pip && pip install -r requirements.txt
RUN pip install mysqlclient
COPY . /code/
这个
docker compose.yml
文件:

version: '3'

services: 
  db:
    image: mysql:5.7
    ports:
      - '3306:3306'
    environment:
       MYSQL_DATABASE: 'my-app-db'
       MYSQL_USER: 'root'
       MYSQL_PASSWORD: 'password'
       MYSQL_ROOT_PASSWORD: 'password'
    volumes:
      - .setup.sql:/docker-entrypoint-initbd.d/setup.sql

  web:
    build: .
    command: python manage.py runserver 0.0.0.0:8000
    volumes:
      - .:/code
    ports:
      - "8000:8000"
    depends_on:
      - db
    links: 
      - db 
此外,我还更改了
settings.py
中的默认数据库配置:

DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.mysql',
        'NAME': 'my-app-db',
        'USER': 'root',
        'PASSWORD': 'password',
        'HOST': 'db',
        'PORT': 3306,
    }
}
所有这些之后,docker compose工作,应用程序启动,但问题是数据库中的表没有创建。我试过用这些,或者这个,但我还没修好

在运行docker compose时,如何在MySQL db容器中创建所需的表?我必须手动添加每个表,还是有办法从django应用程序自动添加


谢谢

嗨,我想这个答案对你有帮助 ##1.-重置所有迁移

find . -path "*/migrations/*.py" -not -name "__init__.py" -delete
find . -path "*/migrations/*.pyc"  -delete
##2.-再次查看并应用迁移

python manage.py showmigrations
python manage.py makemigrations
python manage.py migrate

除非要完全擦除所有数据并重新开始,否则不应重置迁移。您的迁移应该预先存在。因此,如果您不介意旧的迁移,可以删除它们并使用
python manage.py makemigrations
,然后继续执行以下步骤:

因此,如果您的应用程序此时启动,我们需要以使用entrypoint.sh的方式更新docker compose文件。入口点允许您配置将作为可执行文件运行的容器。 首先,在与
docker compose.yaml
相同的级别上创建
entrypoint.sh
文件。 接下来,不要忘了添加
chmod+x entrypoint.sh,以便可以执行entrypoint

entrypoint.sh文件:

#!/bin/bash

set -e

echo "${0}: running migrations."
python manage.py migrate --noinput

echo "${0}: collecting statics."

python manage.py collectstatic --noinput
python manage.py runserver 0.0.0.0:8000
然后更新您的
docker compose.yaml
文件。将
命令
行更改为:

command:
  - /bin/sh
  - '-c'
  - '/code/entrypoint.sh'
此外,您应该将所有pip需求存储在
requirements.txt
文件中,并在
Dockerfile
中运行
pip安装-r requirements.txt


您可以使用运行迁移所需的命令
pip freeze>requirements.txt

转储pip需求
docker exec-it bash
然后运行
python manage.py migrate
?我已经这样做了,
没有要应用的迁移。
问题可能在于与db的连接?嗨,手册,当你在终端中运行
docker compose-up
时,你会得到什么错误或信息…嗨,没有错误,一切似乎都正常,我可以访问应用程序的登录页面,事实上我可以访问管理员配置文件,因为auth数据库已经创建,我可以从管理员或命令行创建用户。问题是其他表,我在项目中定义的表,由于未知原因没有在MySQL数据库中创建。您是否忘了在
设置.py中的已安装应用中提到您的应用的名称?