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服务器是否正在运行:

  1. docker-compose up -d开始。 使用-d意味着你的容器将从terminal分离 ,在后台运行。
  2. 检查所有的服务与docker-compose ps 。 如果他们中的任何一个说出类似Exit (1)那么这个特定的服务没有运行。
  3. 检查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议:

  1. 正如所build议的,升级到Compose版本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. 退出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', } }