【问题标题】:Django docker error table not existDjango docker错误表不存在
【发布时间】:2018-01-11 20:41:18
【问题描述】:

我有一个现有的 Django Rest 项目,其中包含一个我想要 Dockerize 的现有 MySQL 数据库(命名库)。

我的码头文件:

FROM python:2.7

ENV PYTHONUNBUFFERED 1
RUN mkdir /code
WORKDIR /code
COPY . /code/
RUN pip install -r requirements.txt

我的 docker-compose:

version: '3'

services:
  db:
    image: mysql
    environment:
      MYSQL_ROOT_PASSWORD: root
      MYSQL_DATABASE: libraries
      MYSQL_USER: root
      MYSQL_PASSWORD: root
  web:
    build: .
    command: python manage.py runserver 0.0.0.0:8000
    volumes: 
      - .:/code
    ports:
      - "8000:8000"

步骤:

  1. 我跑了:docker-compose build - 构建成功
  2. 我跑了:docker-compose up - 必须运行此命令两次,然后我才能通过点击 localhost:8000 访问我的 API

但是,每当我点击任何 API 端点时,都会收到错误表“XYZ”不存在。所有表格都已存在。

为什么会这样?

【问题讨论】:

    标签: django docker django-rest-framework docker-compose


    【解决方案1】:

    首先,很奇怪你必须运行docker-compose up 两次。我建议在第一次运行后运行docker logs 看看出了什么问题,如果需要帮助,请再开始另一个问题。

    关于您的主要问题,请记住 docker 容器是无状态的。这意味着除非您添加持久卷配置,否则每次启动新容器时都会获得相同的“新鲜”卷配置。

    根据您的撰写文件,有两个容器:一个“web”容器和一个“db”容器。一个新的“db”只包含一个空的 MySQL 实例,其中包含 db 名称、db 用户和 db 密码设置。里面没有数据。你有两个选择:

    1. 从“web”容器运行 migration 以在“db”容器中设置 db 架构。

    2. 如果您的本地/开发设置中有一些数据并且想要使用它们,请考虑从本地设置中备份这些数据,然后将其恢复到“db”容器中。如果您不知道如何,请查阅 MySQL 文档以了解如何备份数据,并参考MySQL docker hub 的“初始化新实例”部分以了解如何使用一些数据启动新的“db”容器。

    【讨论】:

    • 非常感谢!从 Web 容器运行迁移解决了这个问题。由于我对 docker 完全陌生(我还在学习),所以我正在一步一步地尝试。在这里从概念上理解事物是非常必要的。
    【解决方案2】:

    首先你需要运行 django 迁移:

    $ docker exec -it [container] bash
    # python manage.py migrate
    

    【讨论】:

    • 或者一举一动,只需运行docker exec -it <container> python manage.py migrate --noinput,它就会一次性运行迁移
    猜你喜欢
    • 2017-08-16
    • 1970-01-01
    • 2015-06-01
    • 1970-01-01
    • 1970-01-01
    • 2020-06-24
    • 1970-01-01
    • 2021-06-18
    • 1970-01-01
    相关资源
    最近更新 更多