控制服务启动顺序
在生产中,往往有严格控制服务启动顺序的需求。然而Docker Compose自身并不具备该能力。要想实现启动顺序的控制,Docker Compose建议我们使用:
本文演示如何使用wait-for-it 来控制服务的启动顺序。
还用前面编排WordPress博客的例子,现在我们想让MySQL先启动,启动完成后再启动WordPress。
分析
分析:找到WordPress的Dockerfile:https://github.com/docker-library/wordpress/blob/666c5c06d7bc9d02c71fd48a74911248be6f5a5b/php5.6/apache/Dockerfile
可看到类似如下的内容:
COPY docker-entrypoint.sh /usr/local/bin/
ENTRYPOINT ["docker-entrypoint.sh"]
CMD ["apache2-foreground"]
也就是说,这个WordPress的Dockerfile执行了命令:docker-entrypoint.sh apache2-foreground
。
顺便再复习一下,ENTRYPOINT与CMD的区别——ENTRYPOINT指令是不会被覆盖的,CMD指令会覆盖。详见博客:https://segmentfault.com/q/1010000000417103 。
wait-for-it
在wait-for-it的官方GiTHub中,有详细的例子:
要想使用wait-for-it,只需使用如下形式即可:
wait-for-it.sh 想等的地址:端口 -- 原本想执行的命令
答案
分析到这里,答案就很简单了:只需在WordPress的容器中添加wait-for-it.sh,然后将原本的命令用wait-for-it包裹,即可实现控制启动顺序的目标。
version: '2'
services:
mysql:
image: mysql:5.7
expose:
- "3306"
environment:
- MYSQL_ROOT_PASSWORD=123456
wordpress:
image: wordpress
ports:
- "80:80"
volumes:
- ./wait-for-it.sh:/wait-for-it.sh
environment:
- WORDPRESS_DB_HOST=mysql
- WORDPRESS_DB_USER=root
- WORDPRESS_DB_PASSWORD=123456
entrypoint: "sh /wait-for-it.sh mysql:3306 -- docker-entrypoint.sh"
command: ["apache2-foreground"]
参考文档
- 《Controlling startup order in Compose》:https://docs.docker.com/compose/startup-order/ 。