我尝试在docker容器中使用mysql运行django:
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
在 web
谁知道会发生什么事?
3条答案
按热度按时间y53ybaqx1#
如果我没说错的话你应该用
links
在你的docker-compose
,作为a64a0gku2#
depends_on
在docker中,compose意味着一个服务依赖于另一个服务,没有它就不能运行,但这并不意味着另一个服务已经准备好并正在侦听请求。我喜欢做的是在我的命令中添加一个wait-for命令到需要另一个服务启动并准备好处理请求的容器中。
在你涉及
db
以及web
,在代码目录中放入wait-for-it.sh之后,我会将该命令修改为web容器:./wait-for-it.sh -t 300 db:3306 && python manage.py runserver 0.0.0.0:8000
这很简单web
等待主机可用性db
左舷3306
从而同步两个相互依赖的服务的启动dpiehjr43#
根据docker的官方文件,
depends_on
意味着这个服务依赖于另一个服务,没有它就不能运行,但这并不意味着另一个服务可以处理请求。因此,在启动部署时,docker compose会确保在启动部署时
web
服务,db
也在跑(如果你想杀死db
容器,你会注意到docker撰写日志web
也会被杀)。由于mysql映像在第一次启动时需要一些时间,这导致数据库不能立即处理查询。为了解决这个问题,docker compose有一个关键字,
restart
,它指定当出现问题并且进程死亡时(例如没有db
准备处理请求)。最后,你的
docker-compose.yaml
文件应为:您可以在官方文档中找到有关restart关键字的更多信息