当前位置: 首页 > 知识库问答 >
问题:

依赖于docker compose 1.22.0中不等待其他服务

许振海
2023-03-14

我现在的码头工人。yml-

# This docker-compose file uses '.env' file present in the current directory, 
# for database credentials. If you want to change the credentials please 
# change the data in '.env'.
# '.env' file might be hidden as dot files are hidden please unhide to see it.
# Know more about '.env' file: https://docs.docker.com/compose/env-file/

version: '3'

services: 
  postgresdb:
    image: postgres:9.5
    environment: 
      POSTGRES_USER: ${ENV_POSTGRES_USER}
      POSTGRES_PASSWORD: ${ENV_POSTGRES_PASSWORD}
      POSTGRES_DB: ${ENV_POSTGRES_DB}
    volumes: 
      - "../app/volumes/postgres/data:/var/lib/postgresql/data"

  # This is python service. It uses python 3.6 as base image.
  # It will build this service using the Dockerfile present in current directory
  # To modify the values of environment variables please open '.env' file.
  # This service will not run until postgresdb service gets started
  python-app:
    image: python:3.6
    build: .    # Builds using Dockerfile from current directory
    depends_on: 
      - postgresdb
    ports: 
      - "5001:5001"
    tty: true
    volumes: 
      - "../app/volumes/trained_knn_model.clf:/usr/src/app/my-app/trained_knn_model.clf"
      - "../app/volumes/XYPickle.pickle:/usr/src/app/my-app/XYPickle.pickle"
    environment: 
      - POSTGRES_USER=${ENV_POSTGRES_USER}
      - POSTGRES_PASSWORD=${ENV_POSTGRES_PASSWORD}
      - POSTGRES_HOST=${ENV_POSTGRES_HOST}
      - POSTGRES_PORT=${ENV_POSTGRES_PORT}
      - POSTGRES_DB=${ENV_POSTGRES_DB}

我的码头工人。yml文件包含2个服务。我已经指定postgrasdb服务在python应用程序服务使用dependens\u on之前启动,但是docker没有按照指定的顺序运行服务。如何让postgrasdb服务在python应用程序服务之前运行?我正在运行docker compose-up--build--remove孤儿命令。

共有2个答案

戈博易
2023-03-14

取决于刚刚保证的数据库服务在web服务之前运行。若要在数据库就绪后运行web服务,请使用wait_for_。sh脚本https://docs.docker.com/compose/startup-order/例如,我有一个docker组合。yml文件包含两个服务:appdb,我想在db服务就绪后运行containerapp

docker撰写。yml

version: "2"
services:
  app:
    image: employee-jdbc
    ports:
      - "8080:8080"
    networks:
      - employee-mysql
    depends_on:
      - mysqldb
    container_name: employee-jdbc
  db:
    image: mysql:5.7
    networks:
      - employee-mysql
    environment:
      - MYSQL_ROOT_PASSWORD=root
      - MYSQL_DATABASE=bootdb  
    container_name: mysqldb
networks:
  employee-mysql:
    external: true

在Dockerfile中构建雇员-jdbc映像:

Dockerfile

FROM openjdk:8
COPY ./target/*.jar ROOT.jar
COPY wait-for-it.sh /wait-for-it.sh
RUN chmod +x /wait-for-it.sh
ENTRYPOINT ["./wait-for-it.sh","db:3306","--","java","-jar","ROOT.jar"]

等着吧。sh文件可从以下网址下载:https://github.com/vishnubob/wait-for-it

澹台景辉
2023-03-14

请注意,依赖于只等待另一个容器启动,而不等待它正在运行的进程启动。在您的案例中可能会发生的事情是,您正在尝试连接到指定端口上的postgres进程,而该进程仍在启动中。

有两种方法可以解决这种情况-

>

  • 为您的python-app容器指定某种类型的restart子句-您可能会看到您的python-app容器处于失败状态,因此您发布了此问题。失败:如果连接到postgres容器失败,Python-app服务的docker-compose.yml中的10将重新启动容器多达10次。这将确保您在postgres容器启动并运行之前给它足够的时间...

    使用dockerize这样的外部工具,它允许您在启动容器之前等待其他服务。这本质上是为您提供所需的依赖的行为。

  •  类似资料:
    • 我有两个Maven(GWT)项目,其中一个应该依赖于另一个。我只是添加了依赖项,比如: 这些类被正确引用,我可以在我的其他项目中使用它们。但如果我想触发maven构建,它会抱怨:“无法解析项目的依赖项:找不到工件myGroup:MyArtifact:jar:1.0-SNAPSHOT” 该项目没有jar,因为它是一个GWT Web应用程序。它有一个“战争”档案。我测试了一下论点,尝试了“pom”或“

    • 我有下面的docker-compose,在启动myprogram-app之前,我需要等待jhipster-registry服务启动并接受连接。 我尝试了 healtcheck 方式,遵循官方文档 https://docs.docker.com/compose/compose-file/compose-file-v2/ 但在运行<code>docker compose up</code>时,我遇到了

    • 我面对的是Bean(...)没有资格被所有BeanPostProcess处理。我已经将问题缩小到@Configuration类中的@Bean方法,我认为这是罪魁祸首: 配置类 据我所知,BeanPostProcessor bean创建得相当快,需要过早地实例化MeterRegistry bean,这使得它不合格(因为BeanPostProcessor正在操作尚未注入的bean)。 我在博客上看到一

    • 问题内容: 我有一个发布功能,如下所示: 现在假设在某些时候对Projects进行了更改,结果是上面返回了一个不同的项目,因此Tasks.find将返回其他任务。但是,对项目所做的更改不会重新发布 任务 我已经使用了reactPublish,但事实证明该程序包存在问题(并且也没有任何单元测试)。因此,是否有一种简单的方法可以在项目更改时重新发布此发布功能? 问题答案: 通过调用安装软件包。 添加软

    • 用户和首选项由objectProperty链接。 objectProperty断言需要通过SWRL规则从其他用户方面推断。例如,如果用户有听力困难,则需要将设置为,因此: 这很好用。但是,由于我有其他SWRL规则,这些规则也为相同的用户推断,例如: 我需要的是一个规则,不知怎么的,只有在没有更高的级别已经断言的情况下才会断言偏好。在给定的示例中,即使为true,唯一断言的级别也应该是,因为是其他规

    • 问题内容: 在JFrame中,当我单击“登录”时,我弹出另一个Jframe,即登录窗口。 在执行其他操作之前,如何使主Jframe等待登录Jframe退出? 问题答案: 只需使用模式对话框代替框架即可,这样在关闭对话框之前您无法做其他任何事情 有关说明,请参见http://mindprod.com/jgloss/modal.html;有关代码示例,请参见http://www.java2s.com/