Initial base distro with apko/Wolfi configs
Five minimal OCI image variants built with apko: - base: ~5.5MB glibc runtime (wolfi-baselayout, libstdc++, ca-certs, tzdata) - build: base + build tools (bash, git, curl, wget, unzip, xz) - dotnet-runtime: base + ICU, OpenSSL, zlib for .NET runtime - dotnet-sdk: build + ICU, OpenSSL, zlib for .NET SDK - flutter: build variant configured for Flutter SDK Includes melange package definitions for .NET 10 SDK/runtime and Flutter SDK (for future use when building custom APKs). CI/CD pipelines: publish on release, Scout CVE comparison on PRs, weekly rebuild for Wolfi security patches. Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
This commit is contained in:
commit
734939fd12
66
.gitea/workflows/publish.yaml
Normal file
66
.gitea/workflows/publish.yaml
Normal file
@ -0,0 +1,66 @@
|
|||||||
|
name: Build and Push Base Distro Images
|
||||||
|
|
||||||
|
on:
|
||||||
|
release:
|
||||||
|
types: [published, prereleased]
|
||||||
|
workflow_dispatch:
|
||||||
|
|
||||||
|
permissions:
|
||||||
|
contents: read
|
||||||
|
|
||||||
|
env:
|
||||||
|
IMAGE_NAME: base-distro
|
||||||
|
|
||||||
|
jobs:
|
||||||
|
build-and-push:
|
||||||
|
runs-on: ubuntu-latest
|
||||||
|
strategy:
|
||||||
|
matrix:
|
||||||
|
include:
|
||||||
|
- config: apko/base.yaml
|
||||||
|
variant: base
|
||||||
|
- config: apko/build.yaml
|
||||||
|
variant: build
|
||||||
|
- config: apko/dotnet-runtime.yaml
|
||||||
|
variant: dotnet-runtime
|
||||||
|
- config: apko/dotnet-sdk.yaml
|
||||||
|
variant: dotnet-sdk
|
||||||
|
- config: apko/flutter.yaml
|
||||||
|
variant: flutter
|
||||||
|
steps:
|
||||||
|
- name: Checkout code
|
||||||
|
uses: actions/checkout@v3
|
||||||
|
|
||||||
|
- name: Determine tag
|
||||||
|
id: tag
|
||||||
|
run: |
|
||||||
|
if [[ "${{ github.event.release.prerelease }}" == "true" ]]; then
|
||||||
|
echo "suffix=dev" >> $GITHUB_OUTPUT
|
||||||
|
else
|
||||||
|
echo "suffix=latest" >> $GITHUB_OUTPUT
|
||||||
|
fi
|
||||||
|
|
||||||
|
- name: Install apko
|
||||||
|
run: |
|
||||||
|
curl -fsSL "https://github.com/chainguard-dev/apko/releases/latest/download/apko_$(uname -s)_$(uname -m).tar.gz" | tar xz -C /usr/local/bin apko
|
||||||
|
|
||||||
|
- name: Login to Docker Registry
|
||||||
|
uses: docker/login-action@v3
|
||||||
|
with:
|
||||||
|
username: ${{ secrets.REGISTRY_USERNAME }}
|
||||||
|
password: ${{ secrets.REGISTRY_PASSWORD }}
|
||||||
|
|
||||||
|
- name: Build and push image
|
||||||
|
run: |
|
||||||
|
apko publish ${{ matrix.config }} \
|
||||||
|
${{ secrets.REGISTRY_URL }}/${{ env.IMAGE_NAME }}:${{ matrix.variant }}-${{ steps.tag.outputs.suffix }}
|
||||||
|
|
||||||
|
- name: Install Docker Scout
|
||||||
|
run: |
|
||||||
|
curl -fsSL https://raw.githubusercontent.com/docker/scout-cli/main/install.sh -o install-scout.sh
|
||||||
|
sh install-scout.sh
|
||||||
|
|
||||||
|
- name: Docker Scout CVE Scan
|
||||||
|
run: |
|
||||||
|
docker pull ${{ secrets.REGISTRY_URL }}/${{ env.IMAGE_NAME }}:${{ matrix.variant }}-${{ steps.tag.outputs.suffix }}
|
||||||
|
docker scout cves ${{ secrets.REGISTRY_URL }}/${{ env.IMAGE_NAME }}:${{ matrix.variant }}-${{ steps.tag.outputs.suffix }} --only-severity critical,high
|
||||||
58
.gitea/workflows/rebuild.yaml
Normal file
58
.gitea/workflows/rebuild.yaml
Normal file
@ -0,0 +1,58 @@
|
|||||||
|
name: Weekly Rebuild (CVE Updates)
|
||||||
|
|
||||||
|
on:
|
||||||
|
schedule:
|
||||||
|
# Rebuild weekly to pick up Wolfi security patches
|
||||||
|
- cron: '0 6 * * 1'
|
||||||
|
workflow_dispatch:
|
||||||
|
|
||||||
|
permissions:
|
||||||
|
contents: read
|
||||||
|
|
||||||
|
env:
|
||||||
|
IMAGE_NAME: base-distro
|
||||||
|
|
||||||
|
jobs:
|
||||||
|
rebuild:
|
||||||
|
runs-on: ubuntu-latest
|
||||||
|
strategy:
|
||||||
|
matrix:
|
||||||
|
include:
|
||||||
|
- config: apko/base.yaml
|
||||||
|
variant: base
|
||||||
|
- config: apko/build.yaml
|
||||||
|
variant: build
|
||||||
|
- config: apko/dotnet-runtime.yaml
|
||||||
|
variant: dotnet-runtime
|
||||||
|
- config: apko/dotnet-sdk.yaml
|
||||||
|
variant: dotnet-sdk
|
||||||
|
- config: apko/flutter.yaml
|
||||||
|
variant: flutter
|
||||||
|
steps:
|
||||||
|
- name: Checkout code
|
||||||
|
uses: actions/checkout@v3
|
||||||
|
|
||||||
|
- name: Install apko
|
||||||
|
run: |
|
||||||
|
curl -fsSL "https://github.com/chainguard-dev/apko/releases/latest/download/apko_$(uname -s)_$(uname -m).tar.gz" | tar xz -C /usr/local/bin apko
|
||||||
|
|
||||||
|
- name: Login to Docker Registry
|
||||||
|
uses: docker/login-action@v3
|
||||||
|
with:
|
||||||
|
username: ${{ secrets.REGISTRY_USERNAME }}
|
||||||
|
password: ${{ secrets.REGISTRY_PASSWORD }}
|
||||||
|
|
||||||
|
- name: Rebuild and push with latest Wolfi packages
|
||||||
|
run: |
|
||||||
|
apko publish ${{ matrix.config }} \
|
||||||
|
${{ secrets.REGISTRY_URL }}/${{ env.IMAGE_NAME }}:${{ matrix.variant }}-latest
|
||||||
|
|
||||||
|
- name: Install Docker Scout
|
||||||
|
run: |
|
||||||
|
curl -fsSL https://raw.githubusercontent.com/docker/scout-cli/main/install.sh -o install-scout.sh
|
||||||
|
sh install-scout.sh
|
||||||
|
|
||||||
|
- name: Docker Scout CVE Scan
|
||||||
|
run: |
|
||||||
|
docker pull ${{ secrets.REGISTRY_URL }}/${{ env.IMAGE_NAME }}:${{ matrix.variant }}-latest
|
||||||
|
docker scout cves ${{ secrets.REGISTRY_URL }}/${{ env.IMAGE_NAME }}:${{ matrix.variant }}-latest --only-severity critical,high
|
||||||
72
.gitea/workflows/scout.yaml
Normal file
72
.gitea/workflows/scout.yaml
Normal file
@ -0,0 +1,72 @@
|
|||||||
|
name: Docker Scout Analysis
|
||||||
|
|
||||||
|
on:
|
||||||
|
pull_request:
|
||||||
|
branches: ["**"]
|
||||||
|
|
||||||
|
permissions:
|
||||||
|
contents: read
|
||||||
|
pull-requests: write
|
||||||
|
|
||||||
|
env:
|
||||||
|
IMAGE_NAME: base-distro
|
||||||
|
|
||||||
|
jobs:
|
||||||
|
scout:
|
||||||
|
runs-on: ubuntu-latest
|
||||||
|
strategy:
|
||||||
|
matrix:
|
||||||
|
include:
|
||||||
|
- config: apko/base.yaml
|
||||||
|
variant: base
|
||||||
|
- config: apko/build.yaml
|
||||||
|
variant: build
|
||||||
|
- config: apko/dotnet-runtime.yaml
|
||||||
|
variant: dotnet-runtime
|
||||||
|
- config: apko/dotnet-sdk.yaml
|
||||||
|
variant: dotnet-sdk
|
||||||
|
- config: apko/flutter.yaml
|
||||||
|
variant: flutter
|
||||||
|
steps:
|
||||||
|
- name: Login to Docker Registry
|
||||||
|
uses: docker/login-action@v3
|
||||||
|
with:
|
||||||
|
username: ${{ secrets.REGISTRY_USERNAME }}
|
||||||
|
password: ${{ secrets.REGISTRY_PASSWORD }}
|
||||||
|
|
||||||
|
- name: Check if latest image exists
|
||||||
|
id: should_run
|
||||||
|
run: |
|
||||||
|
if docker manifest inspect ${{ secrets.REGISTRY_URL }}/${{ env.IMAGE_NAME }}:${{ matrix.variant }}-latest > /dev/null 2>&1; then
|
||||||
|
echo "run=true" >> $GITHUB_OUTPUT
|
||||||
|
echo "${{ matrix.variant }}-latest found, Scout compare will run"
|
||||||
|
else
|
||||||
|
echo "run=false" >> $GITHUB_OUTPUT
|
||||||
|
echo "No ${{ matrix.variant }}-latest found, skipping"
|
||||||
|
fi
|
||||||
|
|
||||||
|
- name: Checkout code
|
||||||
|
if: steps.should_run.outputs.run == 'true'
|
||||||
|
uses: actions/checkout@v3
|
||||||
|
|
||||||
|
- name: Install apko
|
||||||
|
if: steps.should_run.outputs.run == 'true'
|
||||||
|
run: |
|
||||||
|
curl -fsSL "https://github.com/chainguard-dev/apko/releases/latest/download/apko_$(uname -s)_$(uname -m).tar.gz" | tar xz -C /usr/local/bin apko
|
||||||
|
|
||||||
|
- name: Build image locally
|
||||||
|
if: steps.should_run.outputs.run == 'true'
|
||||||
|
run: |
|
||||||
|
apko build ${{ matrix.config }} ${{ secrets.REGISTRY_URL }}/${{ env.IMAGE_NAME }}:${{ matrix.variant }}-pr-${{ github.event.pull_request.number }} ${{ matrix.variant }}.tar
|
||||||
|
docker load < ${{ matrix.variant }}.tar
|
||||||
|
|
||||||
|
- name: Install Docker Scout
|
||||||
|
if: steps.should_run.outputs.run == 'true'
|
||||||
|
run: |
|
||||||
|
curl -fsSL https://raw.githubusercontent.com/docker/scout-cli/main/install.sh -o install-scout.sh
|
||||||
|
sh install-scout.sh
|
||||||
|
|
||||||
|
- name: Docker Scout Compare
|
||||||
|
if: steps.should_run.outputs.run == 'true'
|
||||||
|
run: |
|
||||||
|
docker scout compare ${{ secrets.REGISTRY_URL }}/${{ env.IMAGE_NAME }}:${{ matrix.variant }}-pr-${{ github.event.pull_request.number }} --to ${{ secrets.REGISTRY_URL }}/${{ env.IMAGE_NAME }}:${{ matrix.variant }}-latest --ignore-unchanged --only-severity critical,high
|
||||||
7
.gitignore
vendored
Normal file
7
.gitignore
vendored
Normal file
@ -0,0 +1,7 @@
|
|||||||
|
.DS_Store
|
||||||
|
*.tar
|
||||||
|
*.tar.gz
|
||||||
|
packages/
|
||||||
|
signing-key.*
|
||||||
|
!signing-key.rsa.pub.example
|
||||||
|
sbom-*.spdx.json
|
||||||
67
Makefile
Normal file
67
Makefile
Normal file
@ -0,0 +1,67 @@
|
|||||||
|
REGISTRY ?= svrnty/base-distro
|
||||||
|
APKO_FLAGS ?= --log-level info
|
||||||
|
|
||||||
|
# Image variants
|
||||||
|
VARIANTS = base build dotnet-runtime dotnet-sdk flutter
|
||||||
|
|
||||||
|
.PHONY: all clean $(VARIANTS) test
|
||||||
|
|
||||||
|
all: $(VARIANTS)
|
||||||
|
|
||||||
|
# Build each variant with apko
|
||||||
|
base:
|
||||||
|
apko build $(APKO_FLAGS) apko/base.yaml $(REGISTRY):base base.tar
|
||||||
|
docker load < base.tar
|
||||||
|
@echo "Built $(REGISTRY):base"
|
||||||
|
|
||||||
|
build:
|
||||||
|
apko build $(APKO_FLAGS) apko/build.yaml $(REGISTRY):build build.tar
|
||||||
|
docker load < build.tar
|
||||||
|
@echo "Built $(REGISTRY):build"
|
||||||
|
|
||||||
|
dotnet-runtime:
|
||||||
|
apko build $(APKO_FLAGS) apko/dotnet-runtime.yaml $(REGISTRY):dotnet-runtime dotnet-runtime.tar
|
||||||
|
docker load < dotnet-runtime.tar
|
||||||
|
@echo "Built $(REGISTRY):dotnet-runtime"
|
||||||
|
|
||||||
|
dotnet-sdk:
|
||||||
|
apko build $(APKO_FLAGS) apko/dotnet-sdk.yaml $(REGISTRY):dotnet-sdk dotnet-sdk.tar
|
||||||
|
docker load < dotnet-sdk.tar
|
||||||
|
@echo "Built $(REGISTRY):dotnet-sdk"
|
||||||
|
|
||||||
|
flutter:
|
||||||
|
apko build $(APKO_FLAGS) apko/flutter.yaml $(REGISTRY):flutter flutter.tar
|
||||||
|
docker load < flutter.tar
|
||||||
|
@echo "Built $(REGISTRY):flutter"
|
||||||
|
|
||||||
|
# Test all images
|
||||||
|
test: all
|
||||||
|
@echo "=== Testing base ==="
|
||||||
|
docker run --rm $(REGISTRY):base /bin/sh -c "cat /etc/os-release"
|
||||||
|
@echo ""
|
||||||
|
@echo "=== Testing build ==="
|
||||||
|
docker run --rm $(REGISTRY):build bash -c "git --version && curl --version | head -1"
|
||||||
|
@echo ""
|
||||||
|
@echo "=== Testing dotnet-runtime ==="
|
||||||
|
docker run --rm $(REGISTRY):dotnet-runtime /bin/sh -c "ls /usr/lib/libicu*"
|
||||||
|
@echo ""
|
||||||
|
@echo "=== Testing dotnet-sdk ==="
|
||||||
|
docker run --rm $(REGISTRY):dotnet-sdk bash -c "git --version && ls /usr/lib/libicu*"
|
||||||
|
@echo ""
|
||||||
|
@echo "=== Testing flutter ==="
|
||||||
|
docker run --rm $(REGISTRY):flutter bash -c "git --version && echo PATH=\$$PATH"
|
||||||
|
@echo ""
|
||||||
|
@echo "All tests passed!"
|
||||||
|
|
||||||
|
# Show image sizes
|
||||||
|
sizes: all
|
||||||
|
@echo "=== Image Sizes ==="
|
||||||
|
@for variant in $(VARIANTS); do \
|
||||||
|
echo -n "$(REGISTRY):$$variant "; \
|
||||||
|
docker image inspect $(REGISTRY):$$variant --format '{{.Size}}' | numfmt --to=iec 2>/dev/null || \
|
||||||
|
docker image inspect $(REGISTRY):$$variant --format '{{.Size}}'; \
|
||||||
|
done
|
||||||
|
|
||||||
|
clean:
|
||||||
|
rm -f *.tar
|
||||||
|
rm -rf packages/
|
||||||
30
apko/base.yaml
Normal file
30
apko/base.yaml
Normal file
@ -0,0 +1,30 @@
|
|||||||
|
contents:
|
||||||
|
keyring:
|
||||||
|
- https://packages.wolfi.dev/os/wolfi-signing.rsa.pub
|
||||||
|
repositories:
|
||||||
|
- https://packages.wolfi.dev/os
|
||||||
|
packages:
|
||||||
|
- wolfi-baselayout
|
||||||
|
- glibc
|
||||||
|
- glibc-locale-posix
|
||||||
|
- libstdc++
|
||||||
|
- ca-certificates-bundle
|
||||||
|
- tzdata
|
||||||
|
- busybox
|
||||||
|
|
||||||
|
accounts:
|
||||||
|
groups:
|
||||||
|
- groupname: app
|
||||||
|
gid: 65532
|
||||||
|
users:
|
||||||
|
- username: app
|
||||||
|
uid: 65532
|
||||||
|
gid: 65532
|
||||||
|
run-as: 65532
|
||||||
|
|
||||||
|
archs:
|
||||||
|
- x86_64
|
||||||
|
- aarch64
|
||||||
|
|
||||||
|
environment:
|
||||||
|
TZ: UTC
|
||||||
42
apko/build.yaml
Normal file
42
apko/build.yaml
Normal file
@ -0,0 +1,42 @@
|
|||||||
|
contents:
|
||||||
|
keyring:
|
||||||
|
- https://packages.wolfi.dev/os/wolfi-signing.rsa.pub
|
||||||
|
repositories:
|
||||||
|
- https://packages.wolfi.dev/os
|
||||||
|
packages:
|
||||||
|
# Base runtime
|
||||||
|
- wolfi-baselayout
|
||||||
|
- glibc
|
||||||
|
- glibc-locale-posix
|
||||||
|
- libstdc++
|
||||||
|
- ca-certificates-bundle
|
||||||
|
- tzdata
|
||||||
|
# Build tools
|
||||||
|
- bash
|
||||||
|
- busybox
|
||||||
|
- coreutils
|
||||||
|
- git
|
||||||
|
- curl
|
||||||
|
- wget
|
||||||
|
- unzip
|
||||||
|
- xz
|
||||||
|
|
||||||
|
accounts:
|
||||||
|
groups:
|
||||||
|
- groupname: app
|
||||||
|
gid: 65532
|
||||||
|
users:
|
||||||
|
- username: app
|
||||||
|
uid: 65532
|
||||||
|
gid: 65532
|
||||||
|
run-as: 65532
|
||||||
|
|
||||||
|
archs:
|
||||||
|
- x86_64
|
||||||
|
- aarch64
|
||||||
|
|
||||||
|
environment:
|
||||||
|
TZ: UTC
|
||||||
|
|
||||||
|
entrypoint:
|
||||||
|
command: /bin/bash
|
||||||
37
apko/dotnet-runtime.yaml
Normal file
37
apko/dotnet-runtime.yaml
Normal file
@ -0,0 +1,37 @@
|
|||||||
|
contents:
|
||||||
|
keyring:
|
||||||
|
- https://packages.wolfi.dev/os/wolfi-signing.rsa.pub
|
||||||
|
repositories:
|
||||||
|
- https://packages.wolfi.dev/os
|
||||||
|
packages:
|
||||||
|
# Base runtime
|
||||||
|
- wolfi-baselayout
|
||||||
|
- glibc
|
||||||
|
- glibc-locale-posix
|
||||||
|
- libstdc++
|
||||||
|
- ca-certificates-bundle
|
||||||
|
- tzdata
|
||||||
|
- busybox
|
||||||
|
# .NET runtime dependencies
|
||||||
|
- icu
|
||||||
|
- libssl3
|
||||||
|
- zlib
|
||||||
|
|
||||||
|
accounts:
|
||||||
|
groups:
|
||||||
|
- groupname: app
|
||||||
|
gid: 65532
|
||||||
|
users:
|
||||||
|
- username: app
|
||||||
|
uid: 65532
|
||||||
|
gid: 65532
|
||||||
|
run-as: 65532
|
||||||
|
|
||||||
|
archs:
|
||||||
|
- x86_64
|
||||||
|
- aarch64
|
||||||
|
|
||||||
|
environment:
|
||||||
|
TZ: UTC
|
||||||
|
DOTNET_SYSTEM_GLOBALIZATION_INVARIANT: "false"
|
||||||
|
DOTNET_RUNNING_IN_CONTAINER: "true"
|
||||||
49
apko/dotnet-sdk.yaml
Normal file
49
apko/dotnet-sdk.yaml
Normal file
@ -0,0 +1,49 @@
|
|||||||
|
contents:
|
||||||
|
keyring:
|
||||||
|
- https://packages.wolfi.dev/os/wolfi-signing.rsa.pub
|
||||||
|
repositories:
|
||||||
|
- https://packages.wolfi.dev/os
|
||||||
|
packages:
|
||||||
|
# Base runtime
|
||||||
|
- wolfi-baselayout
|
||||||
|
- glibc
|
||||||
|
- glibc-locale-posix
|
||||||
|
- libstdc++
|
||||||
|
- ca-certificates-bundle
|
||||||
|
- tzdata
|
||||||
|
# .NET runtime dependencies
|
||||||
|
- icu
|
||||||
|
- libssl3
|
||||||
|
- zlib
|
||||||
|
# Build tools
|
||||||
|
- bash
|
||||||
|
- busybox
|
||||||
|
- coreutils
|
||||||
|
- git
|
||||||
|
- curl
|
||||||
|
- wget
|
||||||
|
- unzip
|
||||||
|
- xz
|
||||||
|
|
||||||
|
accounts:
|
||||||
|
groups:
|
||||||
|
- groupname: app
|
||||||
|
gid: 65532
|
||||||
|
users:
|
||||||
|
- username: app
|
||||||
|
uid: 65532
|
||||||
|
gid: 65532
|
||||||
|
run-as: 65532
|
||||||
|
|
||||||
|
archs:
|
||||||
|
- x86_64
|
||||||
|
- aarch64
|
||||||
|
|
||||||
|
environment:
|
||||||
|
TZ: UTC
|
||||||
|
DOTNET_SYSTEM_GLOBALIZATION_INVARIANT: "false"
|
||||||
|
DOTNET_RUNNING_IN_CONTAINER: "true"
|
||||||
|
DOTNET_CLI_TELEMETRY_OPTOUT: "true"
|
||||||
|
|
||||||
|
entrypoint:
|
||||||
|
command: /bin/bash
|
||||||
44
apko/flutter.yaml
Normal file
44
apko/flutter.yaml
Normal file
@ -0,0 +1,44 @@
|
|||||||
|
contents:
|
||||||
|
keyring:
|
||||||
|
- https://packages.wolfi.dev/os/wolfi-signing.rsa.pub
|
||||||
|
repositories:
|
||||||
|
- https://packages.wolfi.dev/os
|
||||||
|
packages:
|
||||||
|
# Base runtime
|
||||||
|
- wolfi-baselayout
|
||||||
|
- glibc
|
||||||
|
- glibc-locale-posix
|
||||||
|
- libstdc++
|
||||||
|
- ca-certificates-bundle
|
||||||
|
- tzdata
|
||||||
|
# Build tools
|
||||||
|
- bash
|
||||||
|
- busybox
|
||||||
|
- coreutils
|
||||||
|
- git
|
||||||
|
- curl
|
||||||
|
- wget
|
||||||
|
- unzip
|
||||||
|
- xz
|
||||||
|
|
||||||
|
accounts:
|
||||||
|
groups:
|
||||||
|
- groupname: flutter
|
||||||
|
gid: 65532
|
||||||
|
users:
|
||||||
|
- username: flutter
|
||||||
|
uid: 65532
|
||||||
|
gid: 65532
|
||||||
|
run-as: 65532
|
||||||
|
|
||||||
|
archs:
|
||||||
|
- x86_64
|
||||||
|
- aarch64
|
||||||
|
|
||||||
|
environment:
|
||||||
|
TZ: UTC
|
||||||
|
FLUTTER_HOME: /opt/flutter
|
||||||
|
PATH: /opt/flutter/bin:/opt/flutter/bin/cache/dart-sdk/bin:/usr/bin:/bin:/usr/sbin:/sbin
|
||||||
|
|
||||||
|
entrypoint:
|
||||||
|
command: /bin/bash
|
||||||
43
examples/Dockerfile.dotnet-runtime
Normal file
43
examples/Dockerfile.dotnet-runtime
Normal file
@ -0,0 +1,43 @@
|
|||||||
|
# Example: .NET 10 runtime image using base-distro
|
||||||
|
#
|
||||||
|
# Usage in accounting-api or route-api:
|
||||||
|
# FROM svrnty/base-distro:dotnet-sdk-latest AS build
|
||||||
|
# ... (build stage with .NET SDK installed on top) ...
|
||||||
|
#
|
||||||
|
# FROM svrnty/base-distro:dotnet-runtime-latest AS final
|
||||||
|
# COPY --from=build /app .
|
||||||
|
# ENTRYPOINT ["dotnet", "MyApp.dll"]
|
||||||
|
|
||||||
|
# Build stage: use the SDK base + install .NET SDK
|
||||||
|
FROM svrnty/base-distro:dotnet-sdk-latest AS build
|
||||||
|
|
||||||
|
# Install .NET 10 SDK (not yet in Wolfi, manual tarball install)
|
||||||
|
USER root
|
||||||
|
RUN curl -fsSL "https://dotnetcli.azureedge.net/dotnet/Sdk/10.0.100/dotnet-sdk-10.0.100-linux-$(uname -m | sed 's/x86_64/x64/;s/aarch64/arm64/').tar.gz" \
|
||||||
|
-o /tmp/dotnet-sdk.tar.gz && \
|
||||||
|
mkdir -p /usr/share/dotnet && \
|
||||||
|
tar xf /tmp/dotnet-sdk.tar.gz -C /usr/share/dotnet && \
|
||||||
|
ln -sf /usr/share/dotnet/dotnet /usr/bin/dotnet && \
|
||||||
|
rm /tmp/dotnet-sdk.tar.gz
|
||||||
|
|
||||||
|
WORKDIR /source
|
||||||
|
COPY . .
|
||||||
|
RUN dotnet publish -o /app
|
||||||
|
|
||||||
|
# Runtime stage: minimal base + .NET runtime only
|
||||||
|
FROM svrnty/base-distro:dotnet-runtime-latest AS final
|
||||||
|
|
||||||
|
# Install .NET 10 ASP.NET runtime
|
||||||
|
USER root
|
||||||
|
RUN curl -fsSL "https://dotnetcli.azureedge.net/dotnet/aspnetcore/Runtime/10.0.0/aspnetcore-runtime-10.0.0-linux-$(uname -m | sed 's/x86_64/x64/;s/aarch64/arm64/').tar.gz" \
|
||||||
|
-o /tmp/aspnet-runtime.tar.gz && \
|
||||||
|
mkdir -p /usr/share/dotnet && \
|
||||||
|
tar xf /tmp/aspnet-runtime.tar.gz -C /usr/share/dotnet && \
|
||||||
|
ln -sf /usr/share/dotnet/dotnet /usr/bin/dotnet && \
|
||||||
|
rm /tmp/aspnet-runtime.tar.gz
|
||||||
|
|
||||||
|
WORKDIR /app
|
||||||
|
COPY --from=build /app .
|
||||||
|
|
||||||
|
USER 65532
|
||||||
|
ENTRYPOINT ["dotnet", "MyApp.dll"]
|
||||||
30
examples/Dockerfile.flutter-web
Normal file
30
examples/Dockerfile.flutter-web
Normal file
@ -0,0 +1,30 @@
|
|||||||
|
# Example: Flutter web build image using base-distro
|
||||||
|
#
|
||||||
|
# Usage in flutter-admin-console or other Flutter web projects:
|
||||||
|
# FROM svrnty/base-distro:flutter-latest AS build
|
||||||
|
# ... (install Flutter SDK, build web app) ...
|
||||||
|
|
||||||
|
FROM svrnty/base-distro:flutter-latest AS build
|
||||||
|
|
||||||
|
# Install Flutter SDK on top of the base
|
||||||
|
USER root
|
||||||
|
ARG FLUTTER_VERSION=3.38.9
|
||||||
|
RUN curl -fsSL "https://storage.googleapis.com/flutter_infra_release/releases/stable/linux/flutter_linux_${FLUTTER_VERSION}-stable.tar.xz" \
|
||||||
|
-o /tmp/flutter.tar.xz && \
|
||||||
|
mkdir -p /opt && \
|
||||||
|
tar xf /tmp/flutter.tar.xz -C /opt && \
|
||||||
|
rm /tmp/flutter.tar.xz && \
|
||||||
|
git config --global --add safe.directory /opt/flutter && \
|
||||||
|
flutter config --enable-web \
|
||||||
|
--no-enable-android --no-enable-ios \
|
||||||
|
--no-enable-linux-desktop --no-enable-macos-desktop \
|
||||||
|
--no-enable-windows-desktop && \
|
||||||
|
flutter precache --web \
|
||||||
|
--no-android --no-ios --no-linux \
|
||||||
|
--no-macos --no-windows --no-fuchsia --no-universal && \
|
||||||
|
chown -R 65532:65532 /opt/flutter
|
||||||
|
|
||||||
|
USER 65532
|
||||||
|
WORKDIR /app
|
||||||
|
COPY . .
|
||||||
|
RUN flutter pub get && flutter build web --wasm --release
|
||||||
42
melange/dotnet-10-runtime.melange.yaml
Normal file
42
melange/dotnet-10-runtime.melange.yaml
Normal file
@ -0,0 +1,42 @@
|
|||||||
|
package:
|
||||||
|
name: dotnet-10-runtime
|
||||||
|
version: 10.0.0
|
||||||
|
epoch: 0
|
||||||
|
description: ".NET 10 Runtime from official Microsoft binaries"
|
||||||
|
copyright:
|
||||||
|
- license: MIT
|
||||||
|
|
||||||
|
environment:
|
||||||
|
contents:
|
||||||
|
keyring:
|
||||||
|
- https://packages.wolfi.dev/os/wolfi-signing.rsa.pub
|
||||||
|
repositories:
|
||||||
|
- https://packages.wolfi.dev/os
|
||||||
|
packages:
|
||||||
|
- wolfi-baselayout
|
||||||
|
- busybox
|
||||||
|
- curl
|
||||||
|
|
||||||
|
pipeline:
|
||||||
|
- runs: |
|
||||||
|
case "$(uname -m)" in
|
||||||
|
x86_64) ARCH="x64" ;;
|
||||||
|
aarch64) ARCH="arm64" ;;
|
||||||
|
*) echo "Unsupported arch: $(uname -m)" && exit 1 ;;
|
||||||
|
esac
|
||||||
|
|
||||||
|
DOTNET_VERSION="${{package.version}}"
|
||||||
|
|
||||||
|
# Download .NET runtime from Microsoft
|
||||||
|
curl -fsSL "https://dotnetcli.azureedge.net/dotnet/Runtime/${DOTNET_VERSION}/dotnet-runtime-${DOTNET_VERSION}-linux-${ARCH}.tar.gz" \
|
||||||
|
-o /tmp/dotnet-runtime.tar.gz
|
||||||
|
|
||||||
|
# Install to package destination
|
||||||
|
mkdir -p "${{targets.destdir}}/usr/share/dotnet"
|
||||||
|
tar xf /tmp/dotnet-runtime.tar.gz -C "${{targets.destdir}}/usr/share/dotnet"
|
||||||
|
|
||||||
|
# Create symlink
|
||||||
|
mkdir -p "${{targets.destdir}}/usr/bin"
|
||||||
|
ln -s /usr/share/dotnet/dotnet "${{targets.destdir}}/usr/bin/dotnet"
|
||||||
|
|
||||||
|
rm /tmp/dotnet-runtime.tar.gz
|
||||||
42
melange/dotnet-10-sdk.melange.yaml
Normal file
42
melange/dotnet-10-sdk.melange.yaml
Normal file
@ -0,0 +1,42 @@
|
|||||||
|
package:
|
||||||
|
name: dotnet-10-sdk
|
||||||
|
version: 10.0.100
|
||||||
|
epoch: 0
|
||||||
|
description: ".NET 10 SDK from official Microsoft binaries"
|
||||||
|
copyright:
|
||||||
|
- license: MIT
|
||||||
|
|
||||||
|
environment:
|
||||||
|
contents:
|
||||||
|
keyring:
|
||||||
|
- https://packages.wolfi.dev/os/wolfi-signing.rsa.pub
|
||||||
|
repositories:
|
||||||
|
- https://packages.wolfi.dev/os
|
||||||
|
packages:
|
||||||
|
- wolfi-baselayout
|
||||||
|
- busybox
|
||||||
|
- curl
|
||||||
|
|
||||||
|
pipeline:
|
||||||
|
- runs: |
|
||||||
|
case "$(uname -m)" in
|
||||||
|
x86_64) ARCH="x64" ;;
|
||||||
|
aarch64) ARCH="arm64" ;;
|
||||||
|
*) echo "Unsupported arch: $(uname -m)" && exit 1 ;;
|
||||||
|
esac
|
||||||
|
|
||||||
|
SDK_VERSION="${{package.version}}"
|
||||||
|
|
||||||
|
# Download .NET SDK from Microsoft
|
||||||
|
curl -fsSL "https://dotnetcli.azureedge.net/dotnet/Sdk/${SDK_VERSION}/dotnet-sdk-${SDK_VERSION}-linux-${ARCH}.tar.gz" \
|
||||||
|
-o /tmp/dotnet-sdk.tar.gz
|
||||||
|
|
||||||
|
# Install to package destination
|
||||||
|
mkdir -p "${{targets.destdir}}/usr/share/dotnet"
|
||||||
|
tar xf /tmp/dotnet-sdk.tar.gz -C "${{targets.destdir}}/usr/share/dotnet"
|
||||||
|
|
||||||
|
# Create symlink
|
||||||
|
mkdir -p "${{targets.destdir}}/usr/bin"
|
||||||
|
ln -s /usr/share/dotnet/dotnet "${{targets.destdir}}/usr/bin/dotnet"
|
||||||
|
|
||||||
|
rm /tmp/dotnet-sdk.tar.gz
|
||||||
48
melange/flutter-sdk.melange.yaml
Normal file
48
melange/flutter-sdk.melange.yaml
Normal file
@ -0,0 +1,48 @@
|
|||||||
|
package:
|
||||||
|
name: flutter-sdk
|
||||||
|
version: 3.38.9
|
||||||
|
epoch: 0
|
||||||
|
description: "Flutter SDK for web/WASM builds"
|
||||||
|
copyright:
|
||||||
|
- license: BSD-3-Clause
|
||||||
|
|
||||||
|
environment:
|
||||||
|
contents:
|
||||||
|
keyring:
|
||||||
|
- https://packages.wolfi.dev/os/wolfi-signing.rsa.pub
|
||||||
|
repositories:
|
||||||
|
- https://packages.wolfi.dev/os
|
||||||
|
packages:
|
||||||
|
- wolfi-baselayout
|
||||||
|
- busybox
|
||||||
|
- curl
|
||||||
|
- git
|
||||||
|
- xz
|
||||||
|
|
||||||
|
pipeline:
|
||||||
|
- runs: |
|
||||||
|
FLUTTER_VERSION="${{package.version}}"
|
||||||
|
|
||||||
|
# Download Flutter SDK tarball (linux x86_64 only for now)
|
||||||
|
curl -fsSL "https://storage.googleapis.com/flutter_infra_release/releases/stable/linux/flutter_linux_${FLUTTER_VERSION}-stable.tar.xz" \
|
||||||
|
-o /tmp/flutter.tar.xz
|
||||||
|
|
||||||
|
# Install to package destination
|
||||||
|
mkdir -p "${{targets.destdir}}/opt"
|
||||||
|
tar xf /tmp/flutter.tar.xz -C "${{targets.destdir}}/opt"
|
||||||
|
|
||||||
|
# Mark git safe directory
|
||||||
|
git config --global --add safe.directory /opt/flutter
|
||||||
|
|
||||||
|
# Configure for web-only
|
||||||
|
"${{targets.destdir}}/opt/flutter/bin/flutter" config --enable-web \
|
||||||
|
--no-enable-android --no-enable-ios \
|
||||||
|
--no-enable-linux-desktop --no-enable-macos-desktop \
|
||||||
|
--no-enable-windows-desktop
|
||||||
|
|
||||||
|
# Precache web artifacts
|
||||||
|
"${{targets.destdir}}/opt/flutter/bin/flutter" precache --web \
|
||||||
|
--no-android --no-ios --no-linux \
|
||||||
|
--no-macos --no-windows --no-fuchsia --no-universal
|
||||||
|
|
||||||
|
rm /tmp/flutter.tar.xz
|
||||||
Loading…
Reference in New Issue
Block a user