quality / commitlint (push) Skipped
quality / changes (push) Successful in 8s
quality / openapi (push) Skipped
quality / web (push) Skipped
quality / docker-check (push) Skipped
quality / go (push) Successful in 57s
quality / bird2 (push) Successful in 15s
CD / quality (push) Successful in 1m27s
CD / publish (push) Failing after 4m13s
- Changed base image references in `docker-bake.hcl`, Dockerfiles, and `mirror-base-images.sh` from public ECR to Docker Hub to avoid 429 errors and improve reliability. - Updated README documentation to reflect the new source for base images, clarifying the mirroring process and behavior when tags already exist.
70 lines
3.5 KiB
Markdown
70 lines
3.5 KiB
Markdown
# Docker-образы EvoBGP
|
||
|
||
## CI (Gitea Actions)
|
||
|
||
Сборка образов — **`docker buildx bake`** ([docker-bake.hcl](docker-bake.hcl)), не отдельные `docker build`.
|
||
|
||
**Publish:** push в `main` после quality gates — workflow [CD](../../.gitea/workflows/cd.yaml) job **publish**: semantic-release + зеркало base-образов + bake с `VERSION` из релиза.
|
||
|
||
Bake читает переменные из **окружения** (`REGISTRY`, `IMAGE_TAG`, `CACHE_REF_*`, `BASE_*`). Скрипт [write-bake-override.sh](write-bake-override.sh) — опциональный helper для локальной отладки.
|
||
|
||
BuildKit кэширует `/go/pkg/mod`, `~/.cache/go-build` и pnpm store через `RUN --mount=type=cache`. На CI mounts живут, пока named builder `evobgp` не удаляют (`cleanup: false`).
|
||
|
||
### Слои и runtime
|
||
|
||
| Образ | Runtime base | Заметка |
|
||
|-------|----------------|---------|
|
||
| scheduler, ingest, render, deploy, node | `gcr.io/distroless/static-debian12:nonroot` | static Go (`CGO_ENABLED=0`), без shell |
|
||
| api, all | `debian:bookworm-slim` + `birdc` | только клиент birdc, без демона `bird` |
|
||
| agent | тот же Ubuntu+bird2, что bird2 | общие слои с `evobgp-bird2` |
|
||
| bird2 | Ubuntu Noble + пакет bird2 | |
|
||
| web, web-all | `nginx:1.27-alpine` | `worker_processes 1` |
|
||
|
||
Сборка Go: `golang:1.24-alpine`. Context режется корневым [.dockerignore](../../.dockerignore).
|
||
|
||
### Кэш registry
|
||
|
||
- `git.shx.one/<owner>/evobgp-buildcache:go-buildcache` — **запись** только из `go-build-all`
|
||
- `git.shx.one/<owner>/evobgp-buildcache:web-buildcache` — **запись** только из `web-build`
|
||
- `git.shx.one/<owner>/evobgp-buildcache:birdc-buildcache` — **запись** только из `go-birdc`
|
||
- `git.shx.one/<owner>/evobgp-buildcache:base-*` — зеркало FROM с **Docker Hub** (`docker.io/library/…`; distroless — `gcr.io`). Только `linux/amd64`; skip если тег уже в Gitea. Неуспешный copy не валит CD — bake берёт Docker Hub FROM для этой базы.
|
||
|
||
`pull = false` в bake: не перекачивать FROM, если слой уже в builder. Не запускайте `docker system prune -a` на runner.
|
||
|
||
Параллельный `cache-to` в один ref ломает manifest (`content descriptor … not found`).
|
||
|
||
Если CI падает на «not found» после смены схемы кэша — один раз удалите теги `evobgp-buildcache:*` в registry и пересоберите.
|
||
|
||
## Локальная сборка
|
||
|
||
Из корня репозитория:
|
||
|
||
```bash
|
||
cd deploy/docker
|
||
export REGISTRY=git.shx.one/<owner>
|
||
export IMAGE_TAG=latest
|
||
export SHORT_SHA=$(git rev-parse --short HEAD)
|
||
export VERSION=dev
|
||
export BUILD_TIME=
|
||
docker buildx bake --allow=fs.read=../.. -f docker-bake.hcl go-images
|
||
docker buildx bake --allow=fs.read=../.. -f docker-bake.hcl web-images
|
||
```
|
||
|
||
Проверка манифеста без сборки:
|
||
|
||
```bash
|
||
docker buildx bake --allow=fs.read=../.. -f docker-bake.hcl --print default
|
||
```
|
||
|
||
В `docker-bake.hcl`: `context = "../.."` (корень репо), `dockerfile = "deploy/docker/…"` (путь от корня репо).
|
||
|
||
Один образ (legacy, target `build-all`):
|
||
|
||
```bash
|
||
docker build -f deploy/docker/gobinary/Dockerfile \
|
||
--target build-all \
|
||
-t evobgp-build-all:local .
|
||
```
|
||
|
||
Runtime-образы в bake ожидают stage `build-all` (через bake contexts).
|