使用MySQL容器对Django应用程序进行Docker化

3

我希望你能够翻译这篇关于IT技术的文章。这篇文章讲述了一个Django(2.2.7)应用程序,使用Python(3.8.0),Docker(19.03.5)和docker-compose(1.25.2)在Windows 10 Pro上运行。我想将其Docker化,并将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已经运行应用程序并启动,但问题是数据库中的表未被创建。我尝试了这些方法 How do I add a table in MySQL using docker-composeSeeding a MySQL DB for a Dockerized Django App 或者 Seeding a MySQL DB for a Dockerized Django App 但我还没有解决问题。

在运行docker-compose时,如何在MySQL db容器中创建所需的表?我必须手动添加每个单独的表或者有一种方法可以从Django应用程序自动执行?

谢谢!


你需要运行迁移。docker exec -it <web_app_id> bash 然后运行 python manage.py migrate - markwalker_
我已经完成了,没有可应用的迁移。问题可能在于与数据库的连接? - Manuel Gijón
嗨,Manual,当您在终端中运行 docker-compose up 时,您会收到什么错误或信息? - Micheal J. Roberts
嗨,没有错误,一切似乎都正常工作,我可以访问应用程序的登录页面,事实上我可以访问管理员配置文件,因为身份验证数据库已经创建,我可以通过管理员或命令行创建用户。问题在于其他表格,即我在项目中定义的那些表格,由于不明原因,它们在MySQL数据库中没有被创建。 - Manuel Gijón
你是不是忘记在settings.pyINSTALLED_APPS中提到你的应用程序名称了? - Fomalhaut
显示剩余2条评论
2个回答

2

你好,我认为这个答案能帮到你:

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

0

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

所以如果您的应用程序目前正在运行,我们需要以一种使用entrypoint.sh的方式更新您的docker-compose文件。ENTRYPOINT允许您配置将作为可执行文件运行的容器。 首先,与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行更改为:

command:
  - /bin/sh
  - '-c'
  - '/code/entrypoint.sh'

此外,您应该将所有的 pip 要求存储在 requirements.txt 文件中,并在您的 Dockerfile 中运行 pip install -r requirements.txt 命令。
您可以使用命令 pip freeze > requirements.txt 导出 pip 要求。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接