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

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了使用Docker使用Django创建mysql数据库相关的知识,希望对你有一定的参考价值。

我很难部署我的Django项目,该项目使用docker容器使用mysql数据库。

我能够创建两个容器,但web容器一旦使用错误--Not able to find tg_db database创建,就会以代码1退出。

我的理解是,当我运行docker-compose up -d来启动两个容器时,它使用MYSQL_DATABASE=tg_db环境变量来创建名为tg_db的数据库,该数据库由django设置使用和识别。或者,我可以运行命令docker-compose run web python3 manage.py migrate来运行docker-compose,它将在其上创建数据库和迁移。如果不是这样,请告诉我。

以下是使用的文件:

settings.py

DATABASES = {
'default': {
    'ENGINE': 'django.db.backends.mysql',
    'NAME': 'tg_db',
    'USER': 'root',
    'PASSWORD': 'password',
    'HOST': 'db',
    'PORT': '3306',
    'OPTIONS': {'init_command': 'SET default_storage_engine=INNODB;'}
},}  

Dockerfile

    # Start with a python image
    FROM python:3

    # Some stuff that everyone has been copy-pasting
    # since the dawn of time.
    ENV PYTHONUNBUFFERED 1

    # Install things
    RUN apt-get update

    # Make folders and locations for project

    RUN mkdir /code
    COPY . /code
    WORKDIR /code/project/t_backend

    # Install requirements

    RUN pip install -U pip
    RUN pip install -Ur requirements.txt

Woking目录设置为WORKDIR /code/project/t_backend,因为我的manage.py坐在那里,Dockerfile和docker-compose.yml文件与项目文件夹位于同一个地方。

docker-compose.yml

version: '3'

services:

  db:
    image: mysql:latest
    restart: always
    environment:
      - MYSQL_DATABASE=tg_db
      - MYSQL_ROOT_PASSWORD=password
    volumes:
      - ./dbdata:/var/lib/mysql

  web:
    build: .
    command: bash -c "python manage.py runserver 0.0.0.0:8000"
    volumes:
      - .:/code
    ports:
      - "8000:8000"
    depends_on:
      - db

提前致谢!

答案

那么,让我一步一步地描述你的案例。

1.这是docker-compose.yaml文件中的一个拼写错误,其中MYSQL_DATABSE=tg_db被写成而不是MYSQL_DATABASE=tg_db

2.进行了docker-compose up -d并启动了两个容器。当然,数据库tg_db从未创建过。

3.根据docker-compose.yaml文件,来自主机的文件夹./dbdata安装到容器内的/var/lib/mysql。因此,当在上一步中创建容器时,所有mysql数据都写入容器中的文件夹/var/lib/mysql和主机上的./dbdata文件夹。由于步骤1中的拼写错误,此数据没有tg_db数据库:

$ ls -la dbdata/
total 176196
drwxrwxr-x 5 guest-ryx1oj guest-ryx1oj     4096 Apr  8 21:18 .
drwxrwxr-x 3 np           np               4096 Apr  8 21:17 ..
-rw-r----- 1 guest-ryx1oj guest-ryx1oj       56 Apr  8 21:17 auto.cnf
-rw------- 1 guest-ryx1oj guest-ryx1oj     1675 Apr  8 21:17 ca-key.pem
-rw-r--r-- 1 guest-ryx1oj guest-ryx1oj     1107 Apr  8 21:17 ca.pem
-rw-r--r-- 1 guest-ryx1oj guest-ryx1oj     1107 Apr  8 21:17 client-cert.pem
-rw------- 1 guest-ryx1oj guest-ryx1oj     1679 Apr  8 21:17 client-key.pem
-rw-r----- 1 guest-ryx1oj guest-ryx1oj      662 Apr  8 21:18 ib_buffer_pool
-rw-r----- 1 guest-ryx1oj guest-ryx1oj 79691776 Apr  8 21:18 ibdata1
-rw-r----- 1 guest-ryx1oj guest-ryx1oj 50331648 Apr  8 21:18 ib_logfile0
-rw-r----- 1 guest-ryx1oj guest-ryx1oj 50331648 Apr  8 21:17 ib_logfile1
drwxr-x--- 2 guest-ryx1oj guest-ryx1oj     4096 Apr  8 21:17 mysql
drwxr-x--- 2 guest-ryx1oj guest-ryx1oj     4096 Apr  8 21:17 performance_schema
-rw------- 1 guest-ryx1oj guest-ryx1oj     1679 Apr  8 21:17 private_key.pem
-rw-r--r-- 1 guest-ryx1oj guest-ryx1oj      451 Apr  8 21:17 public_key.pem
-rw-r--r-- 1 guest-ryx1oj guest-ryx1oj     1107 Apr  8 21:17 server-cert.pem
-rw------- 1 guest-ryx1oj guest-ryx1oj     1679 Apr  8 21:17 server-key.pem
drwxr-x--- 2 guest-ryx1oj guest-ryx1oj    12288 Apr  8 21:17 sys

4.纠正错字(设置了正确的环境变量名称)并重新创建堆栈:

docker-compose down
docker compose up -d

但是当这样做时,带有前一次尝试数据的./dbdata文件夹再次安装到容器的/var/lib/mysql并覆盖了容器启动期间创建的数据。当然,安装文件夹中的数据没有tg_db数据库。

解:

请删除主机上./dbdata文件夹中的所有数据(我希望它只是一段时间的测试,因此数据不重要且可以删除)并重新创建堆栈:

docker-compose down
rm -vrf ./dbdata/*
docker compose up -d

以上是关于使用Docker使用Django创建mysql数据库的主要内容,如果未能解决你的问题,请参考以下文章

创建测试数据库时出错 - django、docker、mysql

为 Dockerized Django 应用程序播种 MySQL 数据库

从 django app docker 连接到本地 mysql 数据库

django数据库分库migrate

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

python测试开发django-180.docker-compose部署django+mysql环境