簡體   English   中英

使用 MySQL 容器對 Django 應用程序進行 Dockerize

[英]Dockerize a Django app with a MySQL container

我有一個在 Django (2.2.7) 中開發的應用程序,使用 python (3.8.0)、Docker (19.03.5) 和 docker-compose (1.25.2) 在 Windows 10 專業版中運行。 我想通過更改 MySQL 數據庫的 sqlite3 數據庫來對它進行 Dockerize。 我已經寫了這個Dockerfile

FROM python:3.7
ENV PYTHONUNBUFFERED 1
RUN mkdir /code
WORKDIR /code
ADD . /code/
RUN pip install --upgrade pip && pip install -r requirements.txt
RUN pip install mysqlclient
COPY . /code/

這個docker-compose.yml文件:

version: '3'

services: 
  db:
    image: mysql:5.7
    ports:
      - '3306:3306'
    environment:
       MYSQL_DATABASE: 'my-app-db'
       MYSQL_USER: 'root'
       MYSQL_PASSWORD: 'password'
       MYSQL_ROOT_PASSWORD: 'password'
    volumes:
      - .setup.sql:/docker-entrypoint-initbd.d/setup.sql

  web:
    build: .
    command: python manage.py runserver 0.0.0.0:8000
    volumes:
      - .:/code
    ports:
      - "8000:8000"
    depends_on:
      - db
    links: 
      - db 

我也為此更改了settings.py的默認數據庫配置:

DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.mysql',
        'NAME': 'my-app-db',
        'USER': 'root',
        'PASSWORD': 'password',
        'HOST': 'db',
        'PORT': 3306,
    }
}

在所有這些之后,docker compose 工作並且應用程序啟動,但問題是未創建數據庫中的表。 我已經嘗試過這些如何使用 docker-compose 在 MySQL 中添加表、 為 Dockerized Django 應用程序播種 MySQL 數據庫為 Dockerized Django 應用程序播種 MySQL 數據庫,但我無法修復它。

如何在運行 docker-compose 時在 MySQL db 容器中創建所需的表? 我必須手動添加每個表還是有一種方法可以從 django 應用程序自動添加?

謝謝

嗨,我認為這個答案可以幫助您##1.- 重置所有遷移

find . -path "*/migrations/*.py" -not -name "__init__.py" -delete
find . -path "*/migrations/*.pyc"  -delete

##2.- 再次查看並應用您的遷移

python manage.py showmigrations
python manage.py makemigrations
python manage.py migrate

除非您想完全擦除所有數據並重新開始,否則不應重置遷移。 您的遷移應該事先存在。 所以如果你不介意舊的遷移,你可以刪除它們並使用python manage.py makemigrations然后繼續以下步驟:

因此,如果您的應用程序此時啟動,我們需要以使用 entrypoint.sh 的方式更新您的 docker-compose 文件。 ENTRYPOINT 允許您配置將作為可執行文件運行的容器。 首先,在與docker-compose.yaml相同的級別上創建entrypoint.sh文件。 接下來,不要忘記添加chmod +x entrypoint.sh以便可以執行entrypoint

入口點.sh文件:

#!/bin/bash

set -e

echo "${0}: running migrations."
python manage.py migrate --noinput

echo "${0}: collecting statics."

python manage.py collectstatic --noinput
python manage.py runserver 0.0.0.0:8000

之后更新您docker-compose.yaml文件。 command行更改為:

command:
  - /bin/sh
  - '-c'
  - '/code/entrypoint.sh'

此外,您應該將所有 pip 要求存儲在requirements.txt文件中,並在您的Dockerfile運行pip install -r requirements.txt

您可以使用命令pip freeze > requirements.txt轉儲您的 pip pip freeze > requirements.txt

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM