我正在尝试在 docker 容器中运行 django 和 mysql:
version: '2'
services:
db:
image: mysql:latest
volumes:
- ./db:/var/lib/mysql
ports:
- "3306:3306"
environment:
MYSQL_ROOT_PASSWORD: mypassword
MYSQL_USER: root
MYSQL_PASSWORD: mypassword
MYSQL_DATABASE: django
expose:
- "3306"
web:
build: .
command: python manage.py runserver 0.0.0.0:8000
volumes:
- .:/code
ports:
- "8000:8000"
depends_on:
- db
但是之后docker-compose up --build
我收到错误:
django.db.utils.OperationalError: (2005,“未知的 MySQL 服务器主机
'db' (-2)")
最有可能的是,带有 mysql 的容器没有时间启动。但我确实指定了depends_on: - db
in theweb
谁知道可能出了什么问题?
根据 docker-compose 官方文档 https://docs.docker.com/compose/compose-file/compose-file-v2/#depends_on, depends_on
意味着该服务依赖于另一个服务,没有它就无法运行,但这并不意味着另一个服务已准备好处理请求。
因此,当您启动部署时,docker-compose 会确保启动您时web
服务,db
也在运行(如果你试图杀死db
容器,您会在 docker compose 日志中注意到web
也被杀了)。由于 MySQL 映像首次启动需要一些时间,这会导致数据库无法立即处理查询。
为了解决这个问题,docker-compose有一个关键字,restart
,指定当出现问题并且进程终止时容器的行为(例如没有db
准备好处理请求)。
总而言之,你的docker-compose.yaml
文件应该是:
version: '2'
services:
db:
image: mysql:latest
volumes:
- ./db:/var/lib/mysql
restart: always
ports:
- "3306:3306"
environment:
MYSQL_ROOT_PASSWORD: mypassword
MYSQL_USER: root
MYSQL_PASSWORD: mypassword
MYSQL_DATABASE: django
expose:
- "3306"
web:
build: .
command: python manage.py runserver 0.0.0.0:8000
volumes:
- .:/code
restart: always
ports:
- "8000:8000"
depends_on:
- db
您可以在官方文档中找到有关 restart 关键字的更多信息 https://docs.docker.com/compose/compose-file/compose-file-v2/#restart
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)