Docker: скрипт, ожидающий формирования manifest.json для flask-webpack

Я использую manifest-revision-webpack-plugin и flask-webpack в проекте с бэкендом на Flask. Для автоматизации развёртывания применяется Docker. Возникла проблема: как применить миграции, если манифест-файл еще не готов?

Конфигурация состоит из нескольких контейнеров:

version: '3.5'

services:
  node:
    build:
      context: .
      dockerfile: ./docker/node/Dockerfile
    volumes:
      - static:/frontend/public

  app:
    build:
      context: .
      dockerfile: ./docker/app/Dockerfile
    environment:
      - CONFIG=production
    volumes:
      - static:/app/public:ro
    networks:
      - db_network
      - web_network
    restart: always
    depends_on:
      - node
      - db

  db:
    image: postgres:10.7-alpine
    volumes:
      - db-data:/var/lib/postgresql/data
    restart: always
    environment:
      - TZ=Europe/Moscow
      - PGTZ=Europe/Moscow
    env_file:
      - ./.env
    networks:
      - db_network

  nginx:
    build: ./docker/nginx/
    volumes:
      - static:/static:ro
    ports:
      - "80:80"
      - "443:443"
    restart: always
    networks:
      - web_network
    depends_on: 
      - app

networks:
  db_network:
    driver: bridge
  web_network:
    driver: bridge

volumes:
  static:
  db-data:

flask-webpack требует наличия manifest.json, который генерируется webpack. Генерирование manifest.json контейнером с Node.js занимает несколько минут, и при первоначальном развертывании проекта, на этапе применения миграций, возникает проблема запустить flask-контейнер, поскольку flask-webpack выбрасывает исключение, что манифест-файл не найден. Очевидно, app-контейнер не дожидается, пока Node.js выполнит нужные команды для формирования manifest.json:

FROM node:10.15.3-alpine

LABEL maintainer="eu@zyatev.ru"

COPY package-lock.json package.json webpack.config.js frontend/

WORKDIR /frontend

RUN apk add --no-cache --virtual .build-deps \
    g++ \
    autoconf \
    automake \
    make \
    nasm \
    libtool \
    zlib-dev \
    libjpeg-turbo-dev \
    libjpeg-turbo-utils \
    libwebp-tools \
    git \
    && npm install \
    && apk del .build-deps \
    && apk add --no-cache libpng-dev

ADD src /frontend/src

CMD npm run prod

Для решения этой проблемы я написал скрипт (init.sh), ожидающий появления манифест-файла в контейнере с flask-приложением.

#!/usr/bin/env bash

MAX_RETRY=3
MANIFEST="./public/manifest.json"

echo "Wait for manifest..."

count=0
while [ $count -lt $MAX_RETRY ]
do
     count=$((count+1))
     if [ -f $MANIFEST ]; then
          echo "manifest.json is available after $count second(s)."
          echo "Apply app migrations..."
          python manage.py db upgrade
          exit 0
     fi
     echo "Retrying..."
     sleep 120
done

>&2 echo "Timeout occurred after waiting $MAX_RETRY seconds for manifest.json."
exit 1

И после сборки приложения в облаке я просто запускаю:

$ docker-compose run --rm app /bin/bash -c "./init.sh"

Конечно, скрипт нужно предварительно скопировать в образ с flask-приложением.