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.yml
在depends_on
docker-compose.yml
定义服务的开始顺序: https : depends_on
这是一个Docker运行时的事情。 你不要在Dockerfile
指定这个,你从中build立你的Docker镜像。
在启动服务之前,Docker不会等待您的configuration和数据库服务完成启动。 但是Docker在官方文档中有一篇文章解释了解决这个用例的两个select: https : //docs.docker.com/compose/startup-order/
- 使用工具等待 ( https://github.com/vishnubob/wait-for-it )或dockerize ( https://github.com/jwilder/dockerize )
- 或者编写你自己的等待脚本
在这篇文章中, https://docs.docker.com/compose/startup-order/是两个解决scheme的例子。
- 关于OpenLRW部署到mongo docker实例的exception
- validationdocker化的Spring Boot应用程序对docker化和链接的ActiveMQ
- 在AWS上的Docker中Spring引导logging系统出现内存泄漏?
- jhipster-docker:spring-boot不会以控件C结束
- 两个用户在Docker中
- 处理Spring Boot应用程序退出Web应用程序的代码
- Docker链接容器 – 环境variables不被显示
- 在容器中运行Spring启动应用程序? 还是VM? 或虚拟机内的容器?
- 在Docker中,Spring Boot集成testing失败,但不在外面