在构建之前让一个 Docker 镜像等待另一个完成

问题描述

我对 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 启动并运行才能正确设置的 actions are an extension of Hasura。这是 docker 文件的样子:

FROM node
workdir /app
copY package*.json .
RUN npm install
copY . .
CMD ["npm","run","graphql","&&","npm","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 标志或配置允许他们的代码继续重试下载架构,直到它准备好。

解决方法

这很hacky,但是您可以将撰写文件的版本恢复为 2.1,然后使用旧的和已弃用的“依赖项”以及健康检查,该健康检查可以发出从 SQL 命令到 CURL 命令的所有内容来证明依赖容器的就绪状态。

,

我能够通过对这个问题使用公认的解决方案来解决这个问题:Keep retrying yarn script until it passes