• 控制服务启动顺序
    • 分析
    • wait-for-it
    • 答案
    • 参考文档

    控制服务启动顺序

    在生产中,往往有严格控制服务启动顺序的需求。然而Docker Compose自身并不具备该能力。要想实现启动顺序的控制,Docker Compose建议我们使用:

    • wait-for-it
    • dockerize
    • wait-for

    本文演示如何使用wait-for-it 来控制服务的启动顺序。

    还用前面编排WordPress博客的例子,现在我们想让MySQL先启动,启动完成后再启动WordPress。

    分析

    分析:找到WordPress的Dockerfile:https://github.com/docker-library/wordpress/blob/666c5c06d7bc9d02c71fd48a74911248be6f5a5b/php5.6/apache/Dockerfile

    可看到类似如下的内容:

    1. COPY docker-entrypoint.sh /usr/local/bin/
    2. ENTRYPOINT ["docker-entrypoint.sh"]
    3. 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,只需使用如下形式即可:

    1. wait-for-it.sh 想等的地址:端口 -- 原本想执行的命令

    答案

    分析到这里,答案就很简单了:只需在WordPress的容器中添加wait-for-it.sh,然后将原本的命令用wait-for-it包裹,即可实现控制启动顺序的目标。

    1. version: '2'
    2. services:
    3. mysql:
    4. image: mysql:5.7
    5. expose:
    6. - "3306"
    7. environment:
    8. - MYSQL_ROOT_PASSWORD=123456
    9. wordpress:
    10. image: wordpress
    11. ports:
    12. - "80:80"
    13. volumes:
    14. - ./wait-for-it.sh:/wait-for-it.sh
    15. environment:
    16. - WORDPRESS_DB_HOST=mysql
    17. - WORDPRESS_DB_USER=root
    18. - WORDPRESS_DB_PASSWORD=123456
    19. entrypoint: "sh /wait-for-it.sh mysql:3306 -- docker-entrypoint.sh"
    20. command: ["apache2-foreground"]

    参考文档

    • 《Controlling startup order in Compose》:https://docs.docker.com/compose/startup-order/ 。