Overview
This guide shows how to diagnose and fix the Docker BuildKit error:
failed to solve with frontend dockerfile.v0: failed to create LLB definition
It typically means BuildKit couldn’t parse your Dockerfile, couldn’t build the dependency graph (LLB), or failed early (e.g., auth, missing files, or syntax issues).
Quickstart: Get Clear Logs and Try a Known-Good Build
- Force verbose logs:
- docker build: DOCKER_BUILDKIT=1 docker build --progress=plain .
- buildx: docker buildx build --progress=plain .
- Read the first error line above the message—often it names the real cause (e.g., missing file, auth, unknown flag).
- Test a minimal working example below. If it succeeds, your environment is fine and the issue is specific to your Dockerfile or context.
Minimal Working Example (MWE)
Create a tiny project that should build on any recent Docker Engine with BuildKit enabled.
mkdir mwe && cd mwe
cat > Dockerfile <<'EOF'
# syntax=docker/dockerfile:1.7
FROM alpine:3.20
RUN apk add --no-cache curl
COPY hello.sh /usr/local/bin/hello
RUN chmod +x /usr/local/bin/hello
ENTRYPOINT ["hello"]
EOF
cat > hello.sh <<'EOF'
#!/bin/sh
echo "Hello from BuildKit!"
EOF
DOCKER_BUILDKIT=1 docker build -t mwe:ok .
docker run --rm mwe:ok
If this builds and runs, BuildKit and your network are functional. Compare differences to your failing Dockerfile.
Step-by-Step Diagnosis and Fixes
- Turn on plain progress and inspect the real error
- Run: DOCKER_BUILDKIT=1 docker build --progress=plain .
- Look for lines mentioning: unknown flag, missing file, auth, cannot find stage, unsupported syntax.
- Add or update the Dockerfile frontend syntax directive
- Put this as the first line when using newer features:
syntax=docker/dockerfile:1.7
- Fixes parsing of features like RUN --mount, COPY --link, heredocs, and ARG in FROM.
- Verify base image pull and registry auth
- Ensure the base image exists: docker pull alpine:3.20 (replace accordingly).
- If private registry: docker login REGISTRY && docker pull REGISTRY/IMAGE:TAG
- If behind a proxy, configure Docker daemon proxy and retry.
- Check COPY/ADD sources and build context
- Files must exist inside the build context (the directory you pass to docker build).
- Common mistakes:
- COPY ../something /app ← invalid (outside context)
- .dockerignore excludes a file you COPY. Review .dockerignore.
- Validate by listing what’s sent to the daemon: run docker build with --no-cache and watch which files are included.
- Validate ARG usage, especially in FROM
- If you use ARG in FROM, declare it before the first FROM:
- ARG BASE=alpine:3.20
- FROM ${BASE}
- Ensure you pass required build args: docker build --build-arg BASE=alpine:3.20 .
- Fix multi-stage references
- Ensure stage names exist before referencing them:
- FROM node:20 AS builder
- ...
- COPY --from=builder /app/dist /srv
- Typos or missing stages cause LLB graph creation to fail.
- Remove unsupported flags for your frontend version
- Flags like RUN --mount or COPY --link require a recent frontend (see step 2).
- If you can’t upgrade, remove or gate these features.
- Refresh the builder and cache
- docker buildx ls
- docker buildx create --use --name fix-builder
- docker builder prune -af
- Retry the build.
- Update Docker and Buildx
- Ensure Docker Engine, Buildx, and the dockerfile frontend are reasonably current (e.g., Engine ≥ 24.x where possible).
- Isolate BuildKit vs legacy builder
- If you must bisect: DOCKER_BUILDKIT=0 docker build .
- If legacy works but BuildKit fails, you’re likely using a BuildKit-only feature incorrectly or missing the syntax directive.
Common Symptoms and Targeted Fixes
| Symptom in logs | Likely cause | Fix |
|---|---|---|
| unknown flag: --mount | Missing/old frontend | Add # syntax=…1.7 and update Docker/Buildx |
| failed to authorize / denied | Registry auth | docker login, check credentials, tokens, scopes |
| failed to copy files / no such file | COPY source absent | Ensure files exist within context; review .dockerignore |
| base image not found | Wrong image/tag | Use a valid image or registry mirror; verify pull works |
| invalid from flag target | Bad stage name | Verify multi-stage aliases and spelling |
| unexpected ARG in FROM | ARG placement | Declare ARG before the first FROM |
Practical Fix Patterns
- Start Dockerfile with: # syntax=docker/dockerfile:1.7
- Keep Dockerfile features aligned with your Engine/Buildx version.
- Confirm every COPY source exists inside the build context.
- Log in to private registries before building.
- Use explicit tags for base images.
- Prefer simple, deterministic steps; avoid relying on files generated at build time before they exist.
CI/CD Notes
- Ensure the CI runner has Docker Buildx enabled: docker buildx create --use
- Mirror configuration, proxies, and credentials between local and CI.
- Pin the dockerfile frontend and base image tags to reduce drift.
Pitfalls to Avoid
- Missing syntax directive when using modern instructions (RUN --mount, heredocs, COPY --link).
- .dockerignore excluding files you COPY (e.g., ignoring dist/ then COPY dist/…).
- Referring to paths outside the build context.
- Using ARG in FROM without declaring it first.
- Relying on implicit latest tags for base images that change unexpectedly.
Performance Notes (while fixing)
- Keep BuildKit enabled; it provides parallelism and caching.
- Use .dockerignore to shrink context, but double-check required files aren’t excluded.
- Consider RUN --mount=type=cache for package managers once your syntax directive is set.
- Use multi-stage builds to copy only final artifacts and reduce image size.
- Prune stale caches if builds behave inconsistently: docker builder prune -af
Tiny FAQ
What is LLB?
- The Low-Level Build graph created by BuildKit from your Dockerfile. This error means the graph couldn’t be created.
Why does it work locally but not in CI?
- Differences in Buildx version, frontend, network/proxy, or missing registry credentials. Align versions and config.
Can I just disable BuildKit?
- Temporarily, yes (DOCKER_BUILDKIT=0). Prefer fixing syntax or environment so you keep BuildKit benefits.
How do I pin the Dockerfile frontend?
- Add at the first line: # syntax=docker/dockerfile:1.7
How do I verify the real root cause?
- Rebuild with --progress=plain and read the first meaningful error line above the LLB message.