【问题标题】:Django - Mysql Database is not created in DockerDjango - 未在 Docker 中创建 Mysql 数据库
【发布时间】:2019-02-26 15:49:34
【问题描述】:

我在 docker 容器中设置了一个 django 项目,一切都按预期工作,除了我在 mysql 映像中找不到项目数据库。

Dockerfile

FROM python:3

RUN mkdir /django-website
WORKDIR /django-website
COPY . /django-website
RUN pip install -r requirements.txt

docker-compose.yml

version: '3'

services:
    db:
        image: mysql:5.7
        restart: always
        environment:
            - MYSQL_ROOT_PASSWORD=root
            - MYSQL_DATABASE=mywebsite
            - MYSQL_USER=root
            - MYSQL_PASSWORD=root
        ports:
            - '33060:3306'
        volumes:
            - /var/lib/mysql
    web:
        build: .
        command: python manage.py runserver 0.0.0.0:8000
        volumes:
            - .:/django-website
        ports:
            - '8000:8000'
        links:
            - db

settings.py

DATABASES = {
    'default': {
        'ENGINE': "django.db.backends.mysql",
        'NAME': "mywebsite",
        'USER': "root",
        'PASSWORD': "root",
        'HOST': 'db',
        'PORT': '3306',
    }
}

我运行了 migrate 并且成功了:

docker-compose run web python manage.py migrate

我创建了超级用户:

docker-compose run web python manage.py createsuperuser

开发服务器正在工作 docker-compose up 并且该站点正在按预期工作,当我在 mysql 图像中导航时的问题我没有找到与项目相关的数据库 mywebsite

你能告诉我缺少什么吗?如果没有创建数据库,迁移是在哪里应用的?

提前致谢。

【问题讨论】:

  • 当您“浏览图像”时,您是什么意思? MySQL 数据库不是作为文件创建在磁盘上的,您希望在哪里看到它?
  • 我知道它不会是在磁盘上创建的文件。我在 mysql 映像中导航意味着我在 docker 映像中连接到 mysql shell 并使用了SHOW DATABASES 命令,但我没有找到mywebsite 数据库。我应该在其他地方找到它吗?
  • 你确定你告诉 Django 使用 MySQL 吗?显示您的 DATABASES 设置。
  • 问题已更新。我想知道如何正确应用迁移并且开发服务器正常工作。
  • 能分享一下你跑docker-compose run web python manage.py migrate的结果吗?

标签: mysql django docker docker-compose dockerfile


【解决方案1】:

我不确定您所说的 “我登录 mysql image shell 但没有找到 mywebsite 数据库”是什么意思

您已成功迁移数据库,这意味着数据库连接有效并且工作

在你的docker-compose.yml文件中,端口映射是这样完成的,'33060:3306',这意味着dbport 3306映射到主机的port 33060。所以,这可能是的问题(这不是问题,有点像typo

如何查看数据库内容?

METHOD-1:检查 django-shellweb 容器
1. 运行 docker-compose up
2. 在相同路径下打开一个新终端并运行docker ps
你会得到类似下面的东西

CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS                     NAMES
795093357f78        django_1_11_web     "python manage.py ru…"   34 minutes ago      Up 11 minutes       0.0.0.0:8000->8000/tcp    django_1_11_web_1
4ae48f291e34        mysql:5.7           "docker-entrypoint.s…"   34 minutes ago      Up 12 minutes       0.0.0.0:33060->3306/tcp   django_1_11_db_1

3.通过docker exec -it 795093357f78 bash命令进入web容器,其中795093357f78是相应的容器id
4. 现在你在容器里面。然后,运行命令 python manage.py dbshell。现在您将在 mywebsite (Screenshot)
的 MYSQL shell 中 5.运行命令show tables;。它将显示mywebsite DB 中的所有表

METHOD-2:检查db容器
1. 重复上一节中的步骤 1 和 2
2. docker exec -it 4ae48f291e34 bash
进入db容器 3. 现在您将进入 MYSQL 的 bash 终端。运行以下命令mysql -u root -p并在提示时输入密码
4.现在你在MYSQL服务器。运行命令,show databases;。这将显示服务器中的所有数据库。

【讨论】:

  • 谢谢@JPG。 我登录了 mysql image shell 但没有找到 mywebsite 数据库是一样的通过 docker exec -it 795093357f78 bash 进入 web 容器。但是,我能够找到数据库。在我的机器上docker images 显示三个结果,其中一个mysql:5.7 我进入了这个容器,这就是为什么没有找到mywebsite 数据库。据我了解,每当运行docker-compose up 时,都会创建一个新容器并与该项目关联,对吗?
  • 图像的一个实例称为容器。因此,无论何时运行 docker-compose up,它都会构建、(重新)创建、启动并附加到服务容器。
  • 我认为这些 SO 帖子会有所帮助 :) What is the difference between a Docker image and a container? 和 [docker-compose up 和 docker-compose start 有什么区别? ](stackoverflow.com/questions/33715499/…)
【解决方案2】:

您是否尝试过在 dockerfile 中定义数据库映像?以下链接与您的问题有些相关: https://medium.com/@lvthillo/customize-your-mysql-database-in-docker-723ffd59d8fb

【讨论】:

  • 感谢分享,但事实并非如此。 mysql 图像完美运行,我可以在 shell 中登录。我能够手动创建项目数据库,但不幸的是,在执行成功迁移后,该数据库没有表。
【解决方案3】:

我认为主机容器的端口值应该是 3306 而不是 33060。 使用值为 3306 的 docker-compose.yml :

version: '3'

services:
    db:
        image: mysql:5.7
        restart: always
        environment:
            - MYSQL_ROOT_PASSWORD=root
            - MYSQL_DATABASE=mywebsite
            - MYSQL_USER=root
            - MYSQL_PASSWORD=root
        ports:
            - '3306:3306'
        volumes:
            - /var/lib/mysql
    web:
        build: .
        command: python manage.py runserver 0.0.0.0:8000
        volumes:
            - .:/django-website
        ports:
            - '8000:8000'
        links:
            - db

希望这行得通!

【讨论】:

    【解决方案4】:

    您应该将撰写规范更改为version '2'。取下容器并使用docker-compose up -d 将其重新打开。或者,如果您打算继续使用版本 3,则可以改为使用以下数据库环境参数规范

    ```
      environment:
        MYSQL_ROOT_PASSWORD: root
        MYSQL_DATABASE: mywebsite
        MYSQL_USER: root
        MYSQL_PASSWORD: root
    ```
    

    当您遇到容器无法启动的问题时,docker logs <container-name> --tail 25 -f 可以为您提供大量有关原因的信息。

    【讨论】:

      猜你喜欢
      • 2018-09-17
      • 2021-07-24
      • 1970-01-01
      • 2017-12-09
      • 2021-07-18
      • 2022-06-26
      • 2014-09-16
      • 2022-11-18
      • 1970-01-01
      相关资源
      最近更新 更多