簡體   English   中英

Django 在初始化后失去與 MySQL 數據庫的連接 (Docker)

[英]Django loses connection to MySQL db after initialization (Docker)

我開始使用 Docker,我在一個容器中運行一個 Django 應用程序,在另一個容器中運行一個 MySQL 數據庫。 它們都通過docker-compose.yml文件連接。

構建容器后,Django 遷移成功運行,應用程序正常啟動。

但是,如果我連接到 Django 容器並執行命令(即python manage.py createsuperuser ),則會引發OperationalError說無法連接到數據庫。 可能是什么問題?

下圖顯示在數據庫中創建了表(在某些時候 Django 確實可以訪問數據庫)

Django 可以訪問數據庫並運行遷移

使用docker docker exec -it <container id> sh -it docker exec -it <container id> sh訪問4rs_backend容器(Django)並執行python manage.py createsuperuser引發:

在此處輸入圖片說明

docker-compose.yml:

version: '3'
services:
   db:
    image: mysql:5.7
    ports:
      - "7000:3306"
    environment:
      MYSQL_PORT: 3306
      MYSQL_USER: admin_test
      MYSQL_ROOT_PASSWORD: '*****'
      MYSQL_PASSWORD: '*****'
      MYSQL_DATABASE: forrealstate
    container_name: mysql_db
  api:
    build: backend
    command: bash -c "BUILD_TYPE='DOCKER' python manage.py makemigrations && BUILD_TYPE='DOCKER' python manage.py migrate && BUILD_TYPE='DOCKER' python manage.py runserver 0.0.0.0:8000"
    container_name: 4rs_backend
    volumes:
      - ./backend:/backend
    ports:
      - "8000:8000"
    depends_on:
      - db

Settings.py 中的 DATABSE 配置:

BUILD_TYPE = os.environ.get('BUILD_TYPE')
DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.mysql',
        'NAME': 'forrealstate',
        'USER': 'admin_test' if BUILD_TYPE == 'DOCKER' else 'root',
        'PASSWORD': '********',
        'HOST': 'db' if BUILD_TYPE == 'DOCKER' else '127.0.0.1',
        'PORT': '3306',
        'ATOMIC_REQUESTS': True,
    }
}

我希望你可以幫助我!

親切的問候

編輯:回答

通過在 api 服務中添加BUILT_TYPE: 'DOCKER'作為環境變量來修復。

數據庫連接取決於環境變量BUILD_TYPE api容器中,它是在執行命令之前設置的。 當你附加到容器時,這個變量沒有設置,所以 django 使用默認的 127.0.0.1 主機。

修復:在所有manage.py命令前添加BUILD_TYPE='DOCKER' ,例如:

BUILD_TYPE='DOCKER' python manage.py createsuperuser

或者,在容器中全局設置這個變量(這就是我要做的)

暫無
暫無

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

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