Docker-compose服务开始顺序

我正在尝试使用docker-compose按顺序启动3个docker容器。 我有以下容器:

  • app-service-db容器 – >数据库
  • config-service容器 – > Spring启动应用程序
  • 应用程序服务容器 – > Spring启动应用程序

我只想在其他两个容器完成启动时启动'app-service'容器。 我正在使用“等待”脚本来等待服务可用( https://github.com/Eficode/wait-for )。

这是我在docker-compose.yml里面的东西

version: '3.4' services: config-service: image: "config-service:1.0" hostname: config-service container_name: config-service build: context: ../config dockerfile: config.dockerfile expose: - "8888" logging: driver: json-file app-service-db: image: "app-service-db:10.3" hostname: app-service-db container_name: app-service-db build: context: ../app-service dockerfile: app-db.dockerfile environment: MYSQL_ROOT_PASSWORD: password MYSQL_DATABASE: app expose: - "3306" logging: driver: json-file app-service: image: "app-service:1.0" hostname: app-service container_name: app-service build: context: ../app-service dockerfile: app.dockerfile ports: - "8080:8080" expose: - "8080" logging: driver: json-file command: sh -c './wait-for app-service-db:3306 && config-service:8888' depends_on: - config-service - app-service-db 

config.dockerfile

 FROM openjdk:8-jdk-alpine VOLUME /tmp ADD target/config-1.0-final.jar config.jar ENTRYPOINT ["java", "-jar", "config.jar"] EXPOSE 8888 

APP-db.dockerfile

 FROM mariadb:10.3 

app.dockerfile

 FROM openjdk:8-jdk-alpine VOLUME /tmp ADD target/app-1.0-final.jar app.jar ENTRYPOINT ["java", "-jar", "app.jar"] EXPOSE 8080 

当我运行'docker-compose up'cmd时,'app-service'容器在'app-service-db'和'config-service'结束之前就开始了,因为找不到任何连接而退出。 我怎样才能使这个工作,并强制'应用程序服务'容器启动时,只有当另外两个容器已经开始。

提前致谢。

我在你的configuration中看到更多的问题。 入口点和命令关系有问题,要充分理解,请参阅Dockerfile中的CMD和ENTRYPOINT有什么区别? 所以你的入门点是运行Java应用程序 – 这可能是为什么等不起作用。 我build议通过在docker-compose中添加以下部分来覆盖app-service的入口点:

 entrypoint: sh -c './wait-for app-service-db:3306 && ./wait-for config-service:8888 && java -jar app.jar' 

此外,我不能看到你在哪里添加这个脚本等待到docker的形象(缺less在应用程序的docker文件添加?)

您可以使用depends_on关键字docker-compose.ymldepends_on docker-compose.yml定义服务的开始顺序: https : depends_on

这是一个Docker运行时的事情。 你不要在Dockerfile指定这个,你从中build立你的Docker镜像。

在启动服务之前,Docker不会等待您的configuration和数据库服务完成启动。 但是Docker在官方文档中有一篇文章解释了解决这个用例的两个select: https : //docs.docker.com/compose/startup-order/

  1. 使用工具等待https://github.com/vishnubob/wait-for-it )或dockerizehttps://github.com/jwilder/dockerize
  2. 或者编写你自己的等待脚本

在这篇文章中, https://docs.docker.com/compose/startup-order/是两个解决scheme的例子。