depends_on不等待docker-compose 1.22.0中的其他服务

Sun*_*nil 1 docker docker-compose

我当前的docker-compose.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}
Run Code Online (Sandbox Code Playgroud)

我的docker-compose.yml文件包含2个服务。我已指定postgrasdb服务在使用python-app服务之前启动,depends_ondocker -compose并未按指定顺序运行服务。我如何才能在python-app服务之前运行postgrasdb服务?我正在运行命令。docker-compose up --build --remove-orphans

gra*_*tii 7

请注意,depends_on仅等待另一个容器启动,而不等待它正在运行的进程。在您的情况下可能发生的事情是,您试图在postgres进程仍处于启动状态时在其指定的端口上连接该进程。

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

  1. restart为您的python-app容器指定某种子句-您可能会看到python-app容器处于失败状态,因此您已经发布了此问题。restart: on-failure:10python-app服务的docker-compose.yml中,如果连接到postgres容器失败,它将最多重启您的容器10次。这将确保您有足够的时间在postgres容器启动和运行之前……就是这个过程。

  2. 使用类似dockerize的外部工具,该工具可让您在启动容器之前等待其他服务。从本质上讲,这为您提供了所需的行为depends_on


Văn*_*yễn 6

depends_on只是保证数据库服务在 Web 服务之前运行。要在数据库准备好后运行 Web 服务,请使用 wait_for_it.sh 脚本 https://docs.docker.com/compose/startup-order/ 例如,我有一个docker-compose.yml包含两个服务的文件:app和,并且我想在之后db运行容器服务已准备就绪:appdb

docker-compose.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
Run Code Online (Sandbox Code Playgroud)

Dockerfile中构建employee-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"]
Run Code Online (Sandbox Code Playgroud)

wait_for_it.sh文件可以在以下位置下载: https ://github.com/vishnubob/wait-for-it