共计 1010 个字符,预计需要花费 3 分钟才能阅读完成。
在 docker-compose 中,往往会伴随着多个容器的一起的创建和销毁。例如,微服务需要等待 nacos 成功启动以后再进行启动,否则先启动则会启动失败,因为不能在 nocos 上注册自己。
以下是一个简单的案例:
version: '3.1'
services:
nginx:
image: nginx
container_name: nginx
restart: always
ports:
- 80:80
mysql:
image: mysql:8.0.26
container_name: mysql
restart: always
environment:
MYSQL_ROOT_PASSWORD: 123456
假设 nginx 为一个业务服务,并且需要的数据来自 mysql。此时直接使用 docker-compose up -d
启动,发现 nginx 马上可以访问,因为业务服务比 mysql 启动快,但是此时如果是真正的业务服务,还是不能正常提供服务的。并且,有可能等 mysql 启动完成后,还是连接数据库失败的状态,需要重启业务服务才可以提供服务。
为了避免这种问题的出现,需要让 nginx 在 mysql 成功启动以后才进行启动,可以添加 depends_on
选项,告诉 nginx 依赖 mysql 的启动,等它启动以后自己再启动。当然,加了这个还是不够的,只能保证 nginx 在 mysql 后面启动,但是 nginx 启动太快了,所以还是会先启动完成。所以需要添加启动的条件,即给 mysql 添加健康检查,nginx 等 mysql 启动,并健康检查通过以后再启动,文件如下:
version: '3.1'
services:
nginx:
image: nginx
container_name: nginx
restart: always
ports:
- 80:80
depends_on:
mysql:
condition: service_healthy
mysql:
image: mysql:8.0.26
container_name: mysql
restart: always
environment:
MYSQL_ROOT_PASSWORD: 123456
healthcheck:
test: ["CMD", "mysql", "-u", "root", "-p123456", "-e", "select 1"]
interval: 5s
timeout: 3s
retries: 10
此时运行启动命令,发现 nginx 需要等待一段时间才可以访问,说明达到了想要的效果。
提醒:本文发布于149天前,文中所关联的信息可能已发生改变,请知悉!