制作一张 Docker 图像等待另一张图像完成后再构建

Make one Docker image wait for another to finish before building

我是 docker 的新手(提前为我的术语错误/我的知识空白道歉)并且有三个服务,其中一个依赖于一个在构建之前完成。

repo 设置为将它们都作为子模块,并由以下 docker 文件组成。

version: "3"
services:
  db:
    image: postgres:12.3
    restart: always
    volumes:
      - db_data:/var/lib/postgresql/data
    environment:
      POSTGRES_DB: ${DB_NAME}
      POSTGRES_INITDB_ARGS: "--data-checksums"
      POSTGRES_PASSWORD: postgres
      POSTGRES_USER: postgres
  actions:
    build:
      context: ./action-handlers
      dockerfile: Dockerfile.stg
    depends_on:
      - hasura
    environment:
      HASURA_GRAPHQL_ENDPOINT: http://hasura:8080/v1/graphql
      HASURA_GRAPHQL_ADMIN_SECRET: my-super-secret-password
      ENVIRONMENT: ${ENVIRONMENT}
      NODE_ENV: ${NODE_ENV}
      PORT: 5000
  hasura:
    ports:
      - 8080:8080
      - 9691:9691
    build:
      context: ./hasura
      dockerfile: .docker/Dockerfile.stg
    depends_on:
      - db
    environment:
      ACTION_BASE_URL: http://actions:5000
      HASURA_GRAPHQL_ACTIONS_HANDLER_WEBHOOK_BASEURL: http://actions:5000
      HASURA_GRAPHQL_ADMIN_SECRET: my-super-secret-password
      HASURA_GRAPHQL_CONTAINER_HOST_PORT: 8080
      HASURA_GRAPHQL_ENABLE_CONSOLE: "true"
      HASURA_GRAPHQL_UNAUTHORIZED_ROLE: "public"
      DB_NAME: $DB_NAME
      HASURA_GRAPHQL_DATABASE_URL: "postgres://postgres:postgres@db:5432/$DB_NAME"

volumes:
  db_data:

需要 Hasura 启动和 运行ning 才能正确设置的 actions are an extension of Hasura。 docker 文件如下所示:

FROM node
WORKDIR /app
COPY package*.json .
RUN npm install
COPY . .
CMD ["npm", "run", "graphql", "&&", "npm", "run", "start"]

yarn graphql 文件使用 graphql-codegen 从 Hasura 下载 graphql 模式。

是否可以编排 docker 等待 Hasura 实例准备就绪后再构建操作?或者我是否需要一个 bash 脚本,如果是这样的话,它看起来像什么 运行?我正在寻找的是一个解决方案,其中 npm run graphql 不断重新 运行 直到它能够从 Hasura 下载 graphql 模式,然后 运行 npm run start.

我有点力不从心,所以任何见解或提示都将不胜感激。我已经尝试在本地存储 graphql 模式(所以我不需要等待 Hasura 准备好获取它)但这实际上不起作用,因为我需要 Hasura 和同步的操作(因此从中获取模式) Hasura 在构建时)。我还联系了 graphql-coden 的团队,他们提到没有 CLI 标志或配置允许他们的代码继续重试下载架构,直到它准备就绪。

这很老套,但您可以将撰写文件的版本还原为 2.1,然后使用旧的和已弃用的“依赖项”以及可以从 SQL 命令发出所有内容的健康检查到 CURL 命令以证明相关容器已准备就绪。

我能够通过使用这个问题的公认解决方案来解决这个问题: