Docker + Django + MySQL – 非本地分区表的列表结束
我试图用Django和MySQL数据库使用Docker,但不幸的是,在docker-compose up
在某些时候,它停止在End of list of non-natively partitioned tables
我的服务器不启动。 当我使用我的应用程序没有Docker它的作品。 任何build议有什么不对?
我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
in- -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
意味着你的容器将从terminal分离 ,在后台运行。 - 检查所有的服务与
docker-compose ps
。 如果他们中的任何一个说出类似Exit (1)
那么这个特定的服务没有运行。 - 检查MySQL服务器。 运行
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有关,但是 – 即使数据库closures,Django也应该启动。 它只会回应500错误,因为它将无法连接。
我的build议:
-
正如所build议的,升级到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
(它应该说“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', } }