[英]Django loses connection to MySQL db after initialization (Docker)
我開始使用 Docker,我在一個容器中運行一個 Django 應用程序,在另一個容器中運行一個 MySQL 數據庫。 它們都通過docker-compose.yml
文件連接。
構建容器后,Django 遷移成功運行,應用程序正常啟動。
但是,如果我連接到 Django 容器並執行命令(即python manage.py createsuperuser
),則會引發OperationalError
說無法連接到數據庫。 可能是什么問題?
下圖顯示在數據庫中創建了表(在某些時候 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.