我正在尝试将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服务器是否已启动并运行的方法:
- 从
docker-compose up -d
开始。使用-d
意味着您的容器将与终端分离,在后台运行。 - 检查所有服务是否都已启动
docker-compose ps
。如果他们中的任何一个说类似Exit (1)
,则该特定服务未运行。 - 检查 MySQL 服务器。运行
docker-compose exec mysql mysql -uroot -pstrongpassword -e 'SELECT version();' pri
.
现在,真正失败的是你的Django应用程序。根据对相邻答案(dockerpri_web_1 exited with code 2
)的评论,发生的情况是您的runserver
过程死亡。但是,我们无法知道为什么会这样 - 您的消息中没有足够的信息。不过,我不认为它与MySQL有关 - 即使数据库关闭,Django也应该启动。它只会响应 500 个错误,因为它将无法连接。
我的建议:
正如建议的那样,升级到撰写版本 2(另一个答案中有一个例子 - 很好)。如果您不打算从主机访问 MySQL,则可以考虑从
mysql
服务中删除port: "3306:3306"
。这样,如果 3306(XAMPP 或其他什么)上已经有其他东西在监听,它就不会发生冲突。停止一切。
docker-compose down
.检查没有容器会通过3306
或8000
端口来干扰(使用docker ps
进行检查)。在后台运行MySQL:
docker-compose up -d mysql
。等待几秒钟,然后检查它是否仍然处于活动状态docker-compose ps
(它应该说"Up"表示"dockerpri_mysql_1")。现在,在你的 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退出 - 容器将自动为您清理(--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',
}
}