簡體   English   中英

Docker-compose服務啟動順序

[英]Docker-compose services starting order

我正在嘗試使用docker-compose按順序啟動3個docker容器。 我有以下容器:

  • app-service-db容器->數據庫
  • config-service容器-> Spring Boot應用程序
  • 應用程序服務容器-> Spring Boot應用程序

我希望僅在其他兩個容器完成啟動后才能啟動“ app-service”容器。 我正在使用“ wait-for”腳本來等待服務變得可用( 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”容器。

提前致謝。

您可以確保使用depends_on關鍵字在depends_on docker-compose.yml定義的服務的開始順序: https : depends_on

這是Docker運行時的事情。 您無需在Dockerfile指定此Dockerfile ,就可以從該文件中構建Docker映像。

Docker在啟動服務之前不會等待您的配置和數據庫服務完成啟動。 但是Docker在官方文檔中有一篇文章解釋了解決此用例的兩種方法: https : //docs.docker.com/compose/startup-order/

  1. 使用工具作為wait-for-ithttps://github.com/vishnubob/wait-for-it )或dockerizehttps://github.com/jwilder/dockerize
  2. 或編寫自己的等待腳本

文章https://docs.docker.com/compose/startup-order/中是這兩種解決方案的示例。

我在您的配置中看到更多問題。 入口點和命令關系存在問題,要完全理解請參閱此內容。Dockerfile中的CMD和ENTRYPOINT有什么區別? 因此,您的切入點是運行Java應用程序-這可能就是為什么wait無法正常工作的原因。 我建議通過在docker-compose中添加以下部分來覆蓋應用程序服務的入口點:

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

我也看不到您正在將此腳本等待添加到Docker映像的位置(在應用程序的dockerfile中缺少ADD嗎?)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM