使用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 数据库