[英]Docker + Django + MySQL - End of list of non-natively partitioned tables
我正在尝试将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
和Project:
- bin
- include
- lib
- pip-selfcheck.json
- Project
在Project
我有git存储库,后端和前端:
- backendFolder
- frontendFolder
在backendFolder
:
-backendProject
在-backendProject
:
- my project with `manage.py` etc.
我认为您的撰写文件应如下所示:
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',
}
}
“列表结尾...”是来自MySQL的信息性消息-它列出了使用不赞成使用的“分区”引擎(即使没有)的表,并以此消息结尾。 MySQL可能需要很长时间才能启动 ,但是如果您看到“列表结束”消息,则说明它已经完成。
[Note] Beginning of list of non-natively partitioned tables
[Note] End of list of non-natively partitioned tables
这不会引起任何问题。
仅供参考,您可以通过以下方法检查MySQL服务器是否已启动并正在运行:
docker-compose up -d
。 使用-d
意味着您的容器将与终端分离 ,并在后台运行。 docker-compose ps
检查所有服务是否正常运行。 如果它们中的任何一个都说类似Exit (1)
则该特定服务未运行。 docker-compose exec mysql mysql -uroot -pstrongpassword -e 'SELECT version();' pri
docker-compose exec mysql mysql -uroot -pstrongpassword -e 'SELECT version();' pri
。 现在,真正失败的是您的Django应用程序。 根据对邻近答案的评论( dockerpri_web_1 exited with code 2
),您的runserver
进程快要死了。 但是,我们不知道为什么会这样做-您的消息中没有足够的信息。 我不认为它与MySQL有关,尽管数据库关闭,Django也应该启动。 由于无法连接,它将仅响应500个错误。
我的建议:
按照建议,升级到Compose版本2(另一个答案中有一个示例-很好)。 如果您不打算从主机访问MySQL,则可以考虑从mysql
服务中删除port: "3306:3306"
。 这样,如果在3306上已经有其他监听(XAMPP或其他功能),它将不会发生冲突。
停止一切。 docker-compose down
。 通过将端口3306
或8000
自身占用,检查是否没有容器会干扰(使用docker ps
检查)。
在后台运行MySQL: docker-compose up -d mysql
。 等待几秒钟,并通过docker-compose ps
检查它是否仍然存在(对于“ dockerpri_mysql_1”,它应该显示“ Up”)。
现在,在Django容器中启动一个shell: docker-compose run --rm --service-ports web /bin/bash
。 在此处运行python manage.py check
或python manage.py runserver 0.0.0.0:8000
。 现在,希望您只收到相关的错误消息,以便能够解决问题。 (如果runserver
会默默退出,这是一个不好的预兆-希望你的情况会更简单)
使用exit
或Ctrl + D exit
-容器将自动为您清理( --rm
标志负责此操作)。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.