使用 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 数据库的主要内容,如果未能解决你的问题,请参考以下文章