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

Posted

技术标签:

【中文标题】使用 Docker 使用 Django 创建 mysql 数据库【英文标题】:Create mysql database with Django using Docker 【发布时间】:2018-09-17 23:37:17 【问题描述】:

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

我能够创建这两个容器,但 web 容器在创建后立即以代码 1 退出并出现错误 -- Not able to find tg_db database

我的理解是,当我运行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

提前致谢!

【问题讨论】:

它似乎只是环境变量中的错字。它是MYSQL_DATABSE,但应该是MYSQL_DATABASE @Nickolay:我的错!我纠正了错字.. 但是在构建两个容器后我仍然得到相同的错误。错误是:_mysql_exceptions.OperationalError: (1049, "Unknown database 'tg_db'") 我曾经运行的命令:sudo docker-compose run web python3 manage.py migrate @Nickolay 这个问题似乎是无法在db容器中创建数据库,我不知道如何链接这两个容器,所以这个工作! 抱歉,不清楚问题是否已解决。 @Nickolay 不,问题没有解决。更正docker-compose 中的错字后,我得到了同样的错误。如何在 dockerizing 应用程序时创建数据库。除了上面提到的还有其他步骤吗? 【参考方案1】:

那么,让我一步一步描述你的情况。

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 文件夹。此数据没有tg_db 数据库,因为步骤1 中的拼写错误:

$ 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

【讨论】:

如果我的 django 应用程序中有两个 mysql 数据库怎么办。我将如何使用docker-compose 创建名为tg_search_db 的其他数据库? 很遗憾,容器启动时,我们只能使用环境变量创建一个db。

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

通过主管和 docker-compose 从 django 输出彩色日志

如何确保我的Django项目正在使用我为其创建的虚拟环境?

在centos8使用Docker部署Django项目

docker快速教程

使用docker-compose运行Django

ubuntu16.04下使用navicat连接docker mysql5.7.20