github psviderski/uncloud v0.13.0

latest releases: v0.16.0, v0.15.1, v0.15.0...
3 months ago

This release features 3 weeks of work from 3 contributors. It's focused on unregistry integration and expanding Compose support.

Highlights

Unregistry integration (push images to cluster)

We've integrated unregistry to make image distribution way easier. You can build your Docker images locally or on CI and push them directly to your Uncloud cluster without needing an external registry. Only the missing layers are transferred, making it efficient and fast.

# Push local Docker image to a specific or multiple machines.
uc image push IMAGE [-m/--machine NAME[,NAME]]

# Push local Docker image to all machines.
uc image push IMAGE -m all

See uc image push documentation for more details and examples.

Screen.Recording.2025-09-30.at.8.01.39.pm.mov

Under the hood, uncloudd daemon on each machine runs an embedded unregistry server that handles the image receiving and storage in containerd. uc image push requires containerd image store to be enabled for Docker on the target machines.

This brings us one step closer to an end-to-end uc deploy experience which will handle building, pushing, and deploying images in one go.

Inspect images

You can now inspect what images you have on your machines in the cluster.

# List all images on all machines.
uc images

# List images on specific machines.
uc images -m machine1,machine2

# List images filtered by name pattern.
uc images "myapp:1.*"

See uc images documentation for more details and examples.

Untitled.mp4

Compose configs

PR: #116 Thank you @tonyo for the contribution! ❤️

Uncloud now supports Compose configs for managing configuration files in your services. Configs allow you to store non-sensitive configuration data separately from your container images and mount them into containers at runtime.

Example compose.yaml using configs:

services:
  app:
    image: myapp:latest
    configs:
      - source: app_config
        target: /app/config.yaml

configs:
  app_config:
    # Local path is relative to compose.yaml location
    file: ./config.yaml

See Configs documentation for more details.

Internal DNS improvements

PR: #123 Thank you @jabr for the contribution! ❤️

New machine-scoped DNS entries <machine-id>.m.<service-name>.internal allow targeting services on specific machines.
This is useful for debugging, health checks, or machine-specific routing needs.

See Internal DNS documentation for more details.

Containerd image store integration

Uncloud now automatically configures Docker to use the containerd image store by default on new machines, enabling:

  • uc image push feature to push images directly to the cluster machines via unregistry
  • ability to push and store multi-platform images

The system gracefully handles machines without containerd support and provides clear error messages when required features aren't available.

Improvements

  • uc ls now displays the IMAGE column showing which container image(s) each service is running
  • Service containers now receive UNCLOUD_MACHINE_ID environment variable with the machine ID they are running on
  • Updated Docker and Compose Go dependencies to latest versions for better compatibility

Bug fixes

  • Fixed panic in Docker when pushing images without authentication
  • Fixed error handling when removing non-existent services

Changelog

  • 2d361d3 Adding machine.service.internal dns entries (#123)
  • a2c6cbe chore(images): filter images by name with wildcard pattern using Docker filter
  • 509c9eb chore(images): format platforms as pills, sort images by name
  • 59074a2 chore(images): initialise Docker service with containerd client
  • cce81ec chore(images): simplifies ListImages service, server, and client to only list Docker images and not directly access containerd
  • e8b4dd0 chore(push): fail 'image push' when containerd image store not used on target machine
  • 521ccf2 chore(push): run unregistry only if containerd image store enabled for docker
  • 337c15d chore: Add node to Mise
  • c6d18f5 chore: NAME -> IMAGE column name
  • 782f4cb chore: Update AI.md with instructions around tests and docs
  • 977fdf3 chore: add Proxy for proxing local connections to a remote TCP address using the dialer
  • fa004d6 chore: add firewall rule to allow cluster machines to push to other machines unregistry
  • e0d11a8 chore: configure Docker to use containerd image store by default (closes #129)
  • 458d282 chore: correct comment and add TODO to move machine resolution to grpc-proxy router
  • bc6f2fd chore: fix docker client CreateContainerWithImagePull, add WaitPortPublished
  • 3bac1e6 chore: go mod tidy
  • fc3297c chore: go mod tidy
  • bcc504b chore: internal Docker client PushImage
  • 27bbbe7 chore: internal docker package with handy PullImage and CreateContainerWithImagePull methods
  • ae458d2 chore: refactor duplication
  • e0045c7 chore: refactor gRPC docker client
  • 82fd974 chore: remove unused imports
  • 2969b40 chore: return a proxy dialer for SSH connections
  • a217643 chore: shorten socat proxy container progress message
  • a30ed60 chore: update docker and compose Go dependencies to the latest versions
  • 6d2e100 feat(images): 'uc image ls' and 'uc images' (alias) commands to list images on machines
  • 0fc5032 feat(images): add IN USE column to highlight which images are used by any container
  • 92975ee feat(images): add gRPC proto ListImages
  • cdff036 feat(images): gRPC client and server for ListImages
  • fba03b3 feat(images): list image platforms and do not group images by machine
  • 1f9c2c8 feat(images): list images filtered by name
  • 684f0d3 feat(push): '--platform all' to push image to all machines in cluster
  • ffed906 feat(push): 'image push' to single or multiple machines via unregistry proxy
  • 332e7bc feat(push): --platform flag to push a specific platform of a multi-platform image
  • 9f6880b feat(push): stub for 'image push' command and Dialer interface for cluster connectors
  • 63c4de5 feat: Initial support for Compose configs (#116)
  • b6b8286 feat: run embedded unregistry on machine IP in uncloudd daemon
  • 3e804d9 feat: set UNCLOUD_MACHINE_ID in service container ENV (#135)
  • 60926f6 feat: show IMAGE column when listing services (uc ls) #13
  • 5aa85ab fix(push): always provide encoded empty auth config to work around panic in Docker
  • 08f233c fix: auto-detect containerd.sock path and conditionally start unregistry
  • cd25b97 fix: docker client PullImage
  • 1a1afec fix: e2e test rebind the registry port to unoccupied 5001
  • 893ab1f fix: negotiate docker client API version in e2e test
  • 20cf98d fix: return an error if 'uc rm' tries to remove a service that doesn't exist
  • 784d86d fix: test build for docker server
  • 265042e lint

Don't miss a new uncloud release

NewReleases is sending notifications on new releases.