A Flutter + Dart image with a pre-installed RFW (Remote Flutter Widgets) validator and the AWS CLI, published as ghcr.io/pyck-ai/flutter-rfw. Supports linux/amd64 and linux/arm64.
Split out of pyck-ai/baseimages, where it was published as ghcr.io/pyck-ai/baseimages/flutter. That name is frozen and no longer built.
| Variant | Tag | Based on |
|---|---|---|
| Alpine | flutter-rfw:alpine |
ghcr.io/pyck-ai/baseimages/base:alpine + Flutter SDK |
| Debian | flutter-rfw:debian |
ghcr.io/pyck-ai/baseimages/base:debian + Flutter SDK |
The Flutter version is pinned in buildargs.conf. The Alpine and Debian versions are not pinned here — they belong to the base images and arrive with each scheduled rebuild.
| Tag | Description |
|---|---|
flutter-rfw:latest |
Most recent Flutter version (Alpine) |
flutter-rfw:alpine |
Most recent Flutter version (Alpine) |
flutter-rfw:<major> |
Major-version alias |
flutter-rfw:<major>.<minor> |
Minor-version alias |
flutter-rfw:<version> |
Exact pinned version |
flutter-rfw:<major>-alpine |
Major alias on Alpine |
flutter-rfw:<major>.<minor>-alpine |
Minor alias on Alpine |
flutter-rfw:<version>-alpine |
Exact version on Alpine |
| Tag | Description |
|---|---|
flutter-rfw:debian |
Most recent Flutter version (Debian) |
flutter-rfw:<major>-debian |
Major alias on Debian |
flutter-rfw:<major>.<minor>-debian |
Minor alias on Debian |
flutter-rfw:<version>-debian |
Exact version on Debian |
| Path | Alpine | Debian | Description |
|---|---|---|---|
/opt/flutter |
✅ | ✅ | Full Flutter SDK (including bundled Dart SDK) |
/usr/local/bin/flutter |
✅ | ✅ | Symlink to the flutter binary |
/usr/local/bin/dart |
✅ | ✅ | Symlink to the dart binary |
Every file directly under /opt/flutter/bin is symlinked into /usr/local/bin, so flutter and dart are on PATH. Flutter analytics and Dart telemetry are suppressed via environment variables that apply at both build time and run time.
Flutter only ships a Linux x86_64 release archive. For linux/arm64 builds the image automatically:
- Replaces the bundled x86_64 Dart SDK with an arm64 build downloaded from the Dart archive.
- Clears pre-compiled snapshots and engine artifacts so Flutter regenerates them for arm64.
- Runs
flutter precacheto download arm64 engine artifacts and recompileflutter_tools.snapshot.
The precache result is persisted in a BuildKit cache mount keyed by Flutter version + arch, so repeat arm64 builds restore in seconds rather than recompiling.
Pre-installed at /opt/rfw-validator. Validates Remote Flutter Widgets (RFW) files for syntax errors.
| File | Description |
|---|---|
/opt/rfw-validator/pubspec.yaml |
Pub dependencies for the validator |
/opt/rfw-validator/pubspec.lock |
Resolved/pinned dependency versions, produced by dart pub get at build time |
/opt/rfw-validator/validate_rfw.dart |
Validates .rfwtxt (text) and .rfw (binary) files |
/opt/rfw-validator/generate_binary.dart |
Converts text RFW to binary format |
/usr/local/bin/validate-rfw |
Wrapper script (validate-rfw.sh) for simplified CLI use |
| Package | Alpine | Debian | Purpose |
|---|---|---|---|
| AWS CLI | aws-cli |
awscli |
Pushing build artefacts to S3/ECR from CI |
| OpenGL | glu |
libglu1-mesa |
Required by the Flutter engine |
| C++ runtime | (via gcompat) | libgcc-s1, libstdc++6 |
Required by the Flutter engine |
| Variable | Value | Description |
|---|---|---|
PUB_CACHE |
/opt/pub-cache |
Dart pub cache directory; resolves identically at build time and run time |
FLUTTER_SUPPRESS_ANALYTICS |
true |
Suppresses Flutter analytics regardless of $HOME |
DASH__SUPPRESS_ANALYTICS |
true |
Suppresses Dart telemetry regardless of $HOME |
The Debian variant also inherits DEBIAN_FRONTEND from the base image.
Runs as nonroot (UID/GID 1001) by default. WORKDIR is /app. GitHub Actions job containers honour the image's USER and start as nonroot; uid 1001 matches the uid our GitHub Actions runners execute as, which is precisely what makes a bind-mounted CI workspace writable. A directory owned by a different uid (your local user, for instance) is not writable — mount inputs read-only and write generated output to a container-local path (see the Usage examples below).
Conversely, run with --user 0 to get a root shell for installing packages or using the image as a build environment.
There is deliberately no ENTRYPOINT, so /usr/local/bin/validate-rfw is invoked as a normal command and its first argument is the subcommand (validate-rfw or generate-binary).
docker run --rm -v "$PWD:/app:ro" ghcr.io/pyck-ai/flutter-rfw:latest \
validate-rfw validate-rfw /app/example.dartThe doubled word is intentional: the container command (validate-rfw), then the subcommand (validate-rfw).
docker run --rm -v "$PWD:/app:ro" ghcr.io/pyck-ai/flutter-rfw:latest \
validate-rfw generate-binary /app/in.rfwtxt /tmp/out.rfwFROM ghcr.io/pyck-ai/flutter-rfw:latest
COPY --chown=nonroot:nonroot . /app
RUN dart pub gettask setup # create the buildx builder (once per machine)
task build # both variants, for the host architecture
task build -- alpine # Alpine only
task build ARCH=arm64 # cross-build for arm64There is no local task verify. CI verifies the exact pushed digest of each variant by running verify.sh inside the image before any tag is applied — default user, WORKDIR, ENV, tool versions against buildargs.conf, the validator's files, and a real text → binary → validate round trip.