原文:http://www.itmuch.com/docker/26-docker-compose-controller-startup-order/,轉載請說明出處。php
在生產中,每每有嚴格控制服務啓動順序的需求。然而Docker Compose自身並不具有該能力。要想實現啓動順序的控制,Docker Compose建議咱們使用:mysql
本文演示如何使用wait-for-it 來控制服務的啓動順序,其餘兩款工具的使用方法大同小異,讀者可自行研究。git
還用前面編排WordPress博客的例子,如今咱們想讓MySQL先啓動,啓動完成後再啓動WordPress。github
分析:找到WordPress的Dockerfile:https://github.com/docker-library/wordpress/blob/666c5c06d7bc9d02c71fd48a74911248be6f5a5b/php5.6/apache/Dockerfilesql
可看到相似以下的內容:docker
COPY docker-entrypoint.sh /usr/local/bin/ ENTRYPOINT ["docker-entrypoint.sh"] CMD ["apache2-foreground"]
也就是說,這個WordPress的Dockerfile執行了命令:docker-entrypoint.sh apache2-foreground
。apache
順便再複習一下,ENTRYPOINT與CMD的區別——ENTRYPOINT指令是不會被覆蓋的,CMD指令會覆蓋。詳見博客:https://segmentfault.com/q/1010000000417103 。segmentfault
在wait-for-it的官方GiTHub中,有詳細的例子:wordpress
要想使用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"]