【问题标题】:Docker-compose services starting orderDocker-compose 服务启动顺序
【发布时间】:2018-05-05 20:58:29
【问题描述】:

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

  • app-service-db 容器 -> 数据库
  • config-service 容器 -> Spring Boot 应用程序
  • app-service 容器 -> Spring Boot 应用程序

我希望“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”完成之前启动并退出,因为它找不到任何联系。 我怎样才能使这项工作并强制“ app-service ”容器仅在其他两个容器启动时才启动。

提前致谢。

【问题讨论】:

    标签: docker spring-boot docker-compose


    【解决方案1】:

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

    这是一个 Docker 运行时的东西。您没有在 Dockerfile 中指定这一点,您可以从中构建 Docker 映像。

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

    1. 将工具用作wait-for-it (https://github.com/vishnubob/wait-for-it) 或dockerize (https://github.com/jwilder/dockerize)
    2. 或编写您自己的等待脚本

    在文章中https://docs.docker.com/compose/startup-order/ 是这两种解决方案的示例。

    【讨论】:

      【解决方案2】:

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

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

      我也看不到您将此脚本等待添加到 docker 映像中的位置(在应用程序的 dockerfile 中缺少 ADD?)

      【讨论】:

      • 就是这样....我在 docker 映像中缺少“ ADD ./wait-for wait-for ”,并且我删除了 ENTRYPOINT ...感谢您的帮助
      猜你喜欢
      • 2019-12-13
      • 2020-06-30
      • 2018-12-16
      • 1970-01-01
      • 1970-01-01
      • 2018-03-29
      • 2022-01-23
      • 2016-02-07
      • 1970-01-01
      相关资源
      最近更新 更多