[@ant] fix(boot/Dockerfile): self-contained build без зависимости от mono-base

dicoop/mono-base тегается только под semver-релизы (build-containers.yaml
триггерится на refs/tags/*), поэтому :dev/:testnet/:main отсутствуют —
bootstrap workflow упал на pull этого тега.

Перепилил Dockerfile: COPY весь workspace из текущего checkout'а +
pnpm install --filter "@coopenomics/boot..." (тащит boot + транзитивные
cooptypes/factory). .dockerignore отрезает node_modules/dist/blockchain-data.

Workflow упростился — pull только dicoop/contracts, MONO_BASE_TAG больше
не нужен.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
This commit is contained in:
coopops
2026-05-01 09:04:56 +00:00
parent b0bbe05c56
commit 983e02a139
2 changed files with 24 additions and 10 deletions
+5 -6
View File
@@ -12,7 +12,9 @@ name: Build bootstrap container
#
# Зависимости в hub:
# dicoop/contracts:<branch> — пакет wasm/abi (build-contracts.yaml)
# dicoop/mono-base:<branch> — runtime с pnpm/node + workspace (build-containers.yaml)
#
# Образ self-contained: собирает workspace из текущего checkout'а,
# не зависит от dicoop/mono-base (который тегается только релиз-тегами).
#
# Секреты:
# DOCKERHUB_USERNAME / DOCKERHUB_TOKEN
@@ -60,17 +62,14 @@ jobs:
username: ${{ secrets.DOCKERHUB_USERNAME }}
password: ${{ secrets.DOCKERHUB_TOKEN }}
- name: Pull source images
run: |
docker pull dicoop/contracts:${{ env.DOCKER_TAG }}
docker pull dicoop/mono-base:${{ env.DOCKER_TAG }}
- name: Pull contracts image
run: docker pull dicoop/contracts:${{ env.DOCKER_TAG }}
- name: Build and push image
run: |
IMAGE="dicoop/bootcoop"
docker build \
--build-arg CONTRACTS_TAG=${{ env.DOCKER_TAG }} \
--build-arg MONO_BASE_TAG=${{ env.DOCKER_TAG }} \
--label "org.opencontainers.image.revision=${{ github.sha }}" \
--label "org.opencontainers.image.created=$(date -u +%Y-%m-%dT%H:%M:%SZ)" \
-f components/boot/Dockerfile \
+19 -4
View File
@@ -11,6 +11,10 @@
# build-contracts.yaml) и кладутся в /contracts. CLI находит их
# через CONTRACTS_DIR.
#
# Образ self-contained: собирает свежий workspace из текущего
# checkout'а, не зависит от dicoop/mono-base (который тегается
# только под релиз-теги).
#
# Окружение:
# CHAIN_URL — endpoint удалённой ноды (например http://node:8888)
# CONTRACTS_DIR=/contracts (выставлено по умолчанию)
@@ -34,11 +38,24 @@
# restart: "no"
ARG CONTRACTS_TAG=latest
ARG MONO_BASE_TAG=latest
FROM dicoop/contracts:${CONTRACTS_TAG} AS contracts
FROM dicoop/mono-base:${MONO_BASE_TAG} AS runtime
FROM node:22-slim AS runtime
WORKDIR /app
# pnpm под lockfile v9.0 (как в publish-packages.yaml)
RUN npm install -g pnpm@10.33.0
# Тащим весь workspace — pnpm-workspace.yaml ожидает components/*.
# Можно было бы перепилить workspace под slim-образ, но размер не
# критичен для bootstrap-контейнера, а так не дрейфит с корнем.
COPY . .
# --filter "@coopenomics/boot..." ставит только boot и его транзитивные
# workspace-deps (cooptypes, factory). --frozen-lockfile для воспроизводимости.
RUN pnpm install --frozen-lockfile --filter "@coopenomics/boot..."
# Контракты из готового артефакта в flat-layout
# (configs/contracts.ts читает из CONTRACTS_DIR).
@@ -48,7 +65,5 @@ ENV CONTRACTS_DIR=/contracts
WORKDIR /app/components/boot
# По умолчанию sideboot режим — против внешней ноды, без docker-управления.
# Переопределить можно: docker run dicoop/bootcoop:dev pnpm run boot:remote
# или подменив CMD/entrypoint в compose.
ENTRYPOINT ["pnpm", "run"]
CMD ["boot:remote"]