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

Posted

技术标签:

【中文标题】使用 MySQL 容器对 Django 应用程序进行 Dockerize【英文标题】:Dockerize a Django app with a MySQL container 【发布时间】:2020-05-23 11:04:55 【问题描述】:

我有一个在 Django (2.2.7) 中开发的应用程序,其中 python (3.8.0)、Docker (19.03.5) 和 docker-compose (1.25.2) 在 Windows 10 pro 中运行。我想通过将 sqlite3 数据库更改为 mysql 数据库来对其进行 Dockerize 化。我已经写了这个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-compose、Seeding 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? 我已经这样做了,No migrations to apply. 问题可能出在与数据库有关的问题上? 您好手册,当您在终端中运行docker-compose up 时,您会返回什么错误或信息... 嗨,没有错误,似乎一切正常,我可以访问应用程序的登录页面,实际上我可以访问管理员配置文件,因为已创建身份验证数据库并且我可以创建来自管理员或命令行的用户。探针是其他表,我在项目中定义的那些由于未知原因未在 MySQL 数据库中创建。 你是不是忘了在settings.pysettings.py的INSTALLED_APPS中提到你的应用名称? 【参考方案1】:

您好,我认为这个答案可以帮助您 ##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

【讨论】:

【参考方案2】:

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

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

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 要求

【讨论】:

以上是关于使用 MySQL 容器对 Django 应用程序进行 Dockerize的主要内容,如果未能解决你的问题,请参考以下文章

使用 docker-compose 链接 django 和 mysql 容器

使用 Docker 使用 Django 创建 mysql 数据库

使用Docker使用Django创建mysql数据库

Django docker 容器无法连接到 mysql 容器,出现错误“无法连接到 'db' (111) 上的 MySQL 服务器”)

将 SSL 证书添加到 mysql docker 容器

无法从另一个 docker 容器中的烧瓶应用程序对驻留在 docker 容器中的 django 应用程序进行“获取”调用 [重复]