0

我对 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 的扩展,需要 Hasura 启动并运行才能正确设置。这是 docker 文件的样子:

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

yarn graphql文件使用graphql-codegen.

是否可以编排 docker 在构建操作之前等待 Hasura 实例准备好?或者我是否需要一个 bash 脚本,如果需要,它会是什么样子并运行?我正在寻找的是一种解决方案,npm run graphql它会不断重新运行,直到它能够从 Hasura 下载 graphql 模式,然后运行npm run start​​.

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

4

2 回答 2

0

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

于 2021-08-09T03:43:40.337 回答
0

It's hacky, but you could revert your compose-file's version to 2.1 and then use the old and deprecated "depends-on" together with a health-check that can issue everything from an SQL-command to a CURL command to prove the readiness of the dependent container.

于 2021-07-23T06:04:52.177 回答