Docker-compose服务启动顺序

时间:2017-11-22 07:48:26

标签: docker spring-boot docker-compose

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

  • app-service-db container - >数据库
  • config-service container - > Spring启动应用程序
  • app-service container - > Spring启动应用程序

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

这是我在docker-compose.yml

中的内容
df.loc[(df['date'].dt.day==25) & (cust_df['date'].dt.month==12), 'xmas'] = 1

config.dockerfile

    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

APP-db.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.dockerfile

FROM mariadb:10.3

当我运行' docker-compose up' cmd' app-service'容器是在'之前开始的。 app-service-db'和' config-service'已完成并退出,因为它无法找到任何连接。 我怎样才能完成这项工作并强行推动这项工作。 app-service'容器只在其他两个容器启动时启动。

提前致谢。

2 个答案:

答案 0 :(得分:1)

我在你的配置中看到了更多问题。 入口点和命令关系存在问题,要完全理解,请参阅此What is the difference between CMD and ENTRYPOINT in a Dockerfile? 所以你的入口点是运行java应用程序 - 这可能是等待不起作用的原因。 我建议通过在docker-compose中添加以下部分来覆盖app-service的入口点:

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

此外,我无法看到您将此脚本等待添加到docker镜像中的位置(在app的dockerfile中缺少ADD?)

答案 1 :(得分:0)

您可以使用docker-compose.yml关键字确保depends_on中定义的服务的开始排序:  https://docs.docker.com/compose/compose-file/#depends_on

这是Docker运行时的事情。您没有在Dockerfile中指定此内容,您可以从中构建Docker镜像。

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

  1. 使用工具等待https://github.com/vishnubob/wait-for-it)或 dockerize https://github.com/jwilder/dockerize
  2. 或编写自己的等待脚本
  3. 文章https://docs.docker.com/compose/startup-order/是两种解决方案的示例。