问题描述
我对 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。