繁体   English   中英

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

[英]Dockerize a Django app with a MySQL container

我有一个在 Django (2.2.7) 中开发的应用程序,使用 python (3.8.0)、Docker (19.03.5) 和 docker-compose (1.25.2) 在 Windows 10 专业版中运行。 我想通过更改 MySQL 数据库的 sqlite3 数据库来对它进行 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 工作并且应用程序启动,但问题是未创建数据库中的表。 我已经尝试过这些如何使用 docker-compose 在 MySQL 中添加表、 为 Dockerized Django 应用程序播种 MySQL 数据库为 Dockerized Django 应用程序播种 MySQL 数据库,但我无法修复它。

如何在运行 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 文件。 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 pip freeze > requirements.txt

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM