Compose spec coverage
This includes runtime only configurations, build and develop are out of scope. See the Compose specification for further info
Top-level networks
Missing:
Won't support
name — explicit name override. Not supported as namespacing is controlled by helios to avoid clashing.
external — declare a network that helios should not create/destroy. This can cause racing issues as the network needs to be created by an external process before helios can install the composition.
Top-level volumes
Implemented in helios-remote-model::Volume:
Won't support
name — explicit name override. Not supported as namespacing is controlled by helios to avoid clashing.
external — declare a volume that helios should not create/destroy. This can cause racing issues as the volume needs to be created by an external process before helios can install the composition.
Services — top-level fields
Lifecycle / ordering:
Networking:
Namespaces:
Security / capabilities:
Devices / kernel:
Mounts shortcut:
Composition references:
Out of scope (not part of the device-side target state — resolved by the backend or the CLI before delivery): extends, profiles, env_file, label_file, pull_policy, attach, models, provider, scale, deploy.
Won't support
cpu_count, cpu_percent, isolation, credential_spec, links, external_links, volumes_from (Windows-only or deprecated).
platform (would need multi-arch image resolution).
logging (logging is managed by the host OS).
container_name containers are namespaced by helios to avoid clashing
configs (mount declared configs into the service). It is not compatible with separate build and runtime environments
expose, is a documentation only property
stdin_open, meant for interactive sessions, not relevant for remote deployment
mem_swappiness, memswap_limit, there is no swap management interface on balenaOS
cpu_period, cpu_quota, related to CFS which is no longer available in newer kernels
blkio_config, not portable, since block device names may differ between devices in a fleet
gpus, equivalent to device deploy request
storage_opt, requires xfs enabled kernel which balenaOS doesn't include
oom_kill_disable, not supported with cgroups v2 (source)
Services — per-endpoint networks.<name>
Missing:
Services — volumes mount entries
Pending:
Rejected by design: npipe, cluster.
Notes / current restrictions:
- Bind mount sources are restricted to a fixed allowlist (
/var/run/docker.sock, /run/dbus, /sys, /proc, /lib/modules, /lib/firmware, /var/log/journal, /run/log/journal, /etc/machine-id).
- Short-form SELinux flags
z/Z are accepted but ignored (no SELinux enforcement assumed on the device).
- Mounts are canonicalized by target on deserialization so reorderings in the remote composition don't propagate downstream.
Other features
Compose spec coverage
This includes runtime only configurations, build and develop are out of scope. See the Compose specification for further info
Top-level networks
driverdriver_optsenable_ipv6internalipam(withdriver,config[].subnet|gateway|ip_range|aux_addresses,options)labels(map andkey=valuelist form)Missing:
enable_ipv4— modeled implicitly today (the engine sets it viacom.docker.network.enable_ipv4driver_opt, which helios strips on read); the explicit top-level field is not deserialized. The support of this property depends on the engine version and probably requires use of contracts.Won't support
name— explicit name override. Not supported as namespacing is controlled by helios to avoid clashing.external— declare a network that helios should not create/destroy. This can cause racing issues as the network needs to be created by an external process before helios can install the composition.Top-level volumes
Implemented in
helios-remote-model::Volume:driverdriver_optslabelsWon't support
name— explicit name override. Not supported as namespacing is controlled by helios to avoid clashing.external— declare a volume that helios should not create/destroy. This can cause racing issues as the volume needs to be created by an external process before helios can install the composition.Services — top-level fields
imagelabelsenvironment(map and list form; values typed as string / bool / int / float)command(string with shell-style splitting, or list)restart(no,always,on-failure[:N],unless-stopped; defaults toalways)healthcheck(bare string,CMD/CMD-SHELL/NONElist,disable: trueshorthand; per-field tracking viaLABEL_CONFIG_HEALTHCHECKso the engine doesn't bleed image defaults into the round-trip)networks(see per-endpoint section below)network_mode—none,host,bridge.service:<name>blocked ondepends_on;container:<name>rejected.volumes(see mount section below)cgroup(host/private)cgroup_parentcpusetcpu_rt_periodcpu_rt_runtimecpu_sharescpus(fractional, validated finite/non-negative and bounded byi64nano_cpus)domainnamehostnameinitmem_limitmem_reservationoom_score_adjpids_limitprivilegedread_onlyruntimeshm_sizestop_grace_periodstop_signalttyuseruserns_modeutsworking_dirLifecycle / ordering:
depends_on— also unblocksnetwork_mode: service:<name>and per-networkservice:references.post_start,pre_stop(lifecycle hooks). These probably won't be part of the initial release. These seem to be very specific to CLI usage of compose and is not evident how to handle failures on an automated deployment system, that needs additional discussion. Evenpodman composedoesn't implement these hooksentrypoint.Networking:
ports.extra_hosts.dns,dns_opt,dns_search.mac_address(top-level / default-network form — per-network is done). According to the spec, this configuration might get rejected by docker engine >= 25, so we'll probably need some contract support for thisNamespaces:
ipc(service:<name>requiresdepends_on,container:$NAMEwill not be supported).pid(service:<name>requiresdepends_on,container:$NAMEwill not be supported).Security / capabilities:
cap_add,cap_drop.security_opt(label=andapparmor=require OS support, won't be supported, forseccomp=, onlyseccomp=unconfinedwill be supported)sysctls.group_add.Devices / kernel:
devices(CDI syntax won't be supported)device_cgroup_rules.ulimits.annotations(OCI runtime annotations. Requires contract support as these are only available from Docker v24 and above).Mounts shortcut:
tmpfs(top-level shortcut). The long-form{ type: tmpfs, ... }entry insidevolumesalready works; what's missing is thetmpfs: [/run, /tmp]field.Composition references:
secrets(mount declared secrets into the service). This won't be part of the initial release as it requires design to work with the top levelssecretsconfigurationuse_api_socket— tightly coupled to the bind allowlist; equivalent toio.balena.features.balena-socketOut of scope (not part of the device-side target state — resolved by the backend or the CLI before delivery):
extends,profiles,env_file,label_file,pull_policy,attach,models,provider,scale,deploy.Won't support
cpu_count,cpu_percent,isolation,credential_spec,links,external_links,volumes_from(Windows-only or deprecated).platform(would need multi-arch image resolution).logging(logging is managed by the host OS).container_namecontainers are namespaced by helios to avoid clashingconfigs(mount declared configs into the service). It is not compatible with separate build and runtime environmentsexpose, is a documentation only propertystdin_open, meant for interactive sessions, not relevant for remote deploymentmem_swappiness,memswap_limit, there is no swap management interface on balenaOScpu_period,cpu_quota, related to CFS which is no longer available in newer kernelsblkio_config, not portable, since block device names may differ between devices in a fleetgpus, equivalent to device deploy requeststorage_opt, requires xfs enabled kernel which balenaOS doesn't includeoom_kill_disable, not supported with cgroups v2 (source)Services — per-endpoint
networks.<name>aliasesipv4_addressipv6_addresslink_local_ipsmac_addressdriver_optsgw_prioritypriorityMissing:
interface_name(recent spec addition).service:<network>form — blocked ondepends_on.Services —
volumesmount entriesvolume(shortsrc:dst[:ro|rw|z|Z], and long form withvolume.nocopy,volume.subpath,read_only)bind(short and long form;bind.propagation,bind.create_host_path,read_only)tmpfs(long form withtmpfs.size,tmpfs.mode)Pending:
image, depends on the engine version, needs contract supportRejected by design:
npipe,cluster.Notes / current restrictions:
/var/run/docker.sock,/run/dbus,/sys,/proc,/lib/modules,/lib/firmware,/var/log/journal,/run/log/journal,/etc/machine-id).z/Zare accepted but ignored (no SELinux enforcement assumed on the device).Other features