Docker + Django + MySQL - 非本机分区表列表的末尾



我正在尝试将Docker与Django和MySQL数据库一起使用,但不幸的是,在docker-compose up的某个时候它会在End of list of non-natively partitioned tables上停止并且我的服务器无法启动。当我在没有 Docker 的情况下使用我的应用程序时,它可以工作。有什么问题吗?

我的docker-compose.yml

web:
build: .
command: python manage.py runserver 0.0.0.0:8000
volumes:
- .:/code
ports:
- "8000:8000"
db:
image: mysql
environment:
- MYSQL_ALLOW_EMPTY_PASSWORD=yes
- MYSQL_USER=root
- MYSQL_DATABASE=pri

Dockerfile

FROM python:3
ENV PYTHONUNBUFFERED 1
RUN mkdir /code
WORKDIR /code
ADD requirements.txt /code/
RUN pip install -r requirements.txt
ADD . /code/

settings.py

DATABASES = {
'default': {
'ENGINE': 'django.db.backends.mysql',
'NAME': 'pri',
'USER': 'root',
'HOST': 'db',
}
}

在我看来,我的问题可能与目录结构有关。也就是说,它看起来像这样:

`DockerContainer`:
- docker-compose.yml
- Dockerfile
- requirements.txt
- ProjectDirectory

ProjectDirectory我有virtualenv和项目:

- bin
- include
- lib
- pip-selfcheck.json
- Project

Project我有 git 存储库、后端和前端:

- backendFolder
- frontendFolder

backendFolder

-backendProject

-backendProject

- my project with `manage.py` etc.

"列表结束..."是来自 MySQL 的信息性消息 - 它列出了使用已弃用的"分区"引擎的表(即使没有),并以此消息结尾。MySQL可能需要很长时间才能启动,但是如果您看到"列表结束"消息,则它已经完成。

[Note] Beginning of list of non-natively partitioned tables
[Note] End of list of non-natively partitioned tables

这应该不会导致任何问题。

仅供参考,这是检查MySQL服务器是否已启动并运行的方法:

  1. docker-compose up -d开始。使用-d意味着您的容器将与终端分离,在后台运行。
  2. 检查所有服务是否都已启动docker-compose ps。如果他们中的任何一个说类似Exit (1),则该特定服务未运行。
  3. 检查 MySQL 服务器。运行docker-compose exec mysql mysql -uroot -pstrongpassword -e 'SELECT version();' pri.

现在,真正失败的是你的Django应用程序。根据对相邻答案(dockerpri_web_1 exited with code 2)的评论,发生的情况是您的runserver过程死亡。但是,我们无法知道为什么会这样 - 您的消息中没有足够的信息。不过,我不认为它与MySQL有关 - 即使数据库关闭,Django也应该启动。它只会响应 500 个错误,因为它将无法连接。

我的建议:

  1. 正如建议的那样,升级到撰写版本 2(另一个答案中有一个例子 - 很好)。如果您不打算从主机访问 MySQL,则可以考虑从mysql服务中删除port: "3306:3306"。这样,如果 3306(XAMPP 或其他什么)上已经有其他东西在监听,它就不会发生冲突。

  2. 停止一切。docker-compose down.检查没有容器会通过33068000端口来干扰(使用docker ps进行检查)。

  3. 在后台运行MySQL:docker-compose up -d mysql。等待几秒钟,然后检查它是否仍然处于活动状态docker-compose ps(它应该说"Up"表示"dockerpri_mysql_1")。

  4. 现在,在你的 Django 容器中启动一个 shell:docker-compose run --rm --service-ports web /bin/bash。在那里运行python manage.py checkpython manage.py runserver 0.0.0.0:8000。现在,希望您应该只收到相关的错误消息,以便能够解决问题。(如果runserver会默默退出,那是一个不好的预兆 - 希望你的情况会更简单)

  5. 使用exitCtrl+D退出 - 容器将自动为您清理(--rm标志会处理此问题)。

我认为您的撰写文件应该是这样的:

version: '2'
services:
db:
image: mysql
environment:
MYSQL_ROOT_PASSWORD: Somepassword
MYSQL_DATABASE: pri
MYSQL_USER: root
MYSQL_PASSWORD: strongpassword
ports:
- "3306:3306"
web:
build: .
command: python manage.py runserver 0.0.0.0:8000
volumes:
- .:/code
ports:
- "8000:8000"
depends_on:
- db
links:
- db

和这样的设置

DATABASES = {
'default': {
'ENGINE': 'django.db.backends.mysql',
'NAME': 'pri',
'USER': 'root',
'PASSWORD': 'strongpassword',
'HOST': 'db',
}
}

最新更新