222 Commits
Author SHA1 Message Date
bryanmandBryan Mosley 86d31dbd94 Treat a missing log file as empty in container logs (#2393)
- Fixes #2392.
- `ContainersService.logs(id:)` opened `stdio.log` and
  `vminitd.log` eagerly, so either one missing failed the
  whole request. Both are created by `RuntimeLinux` at
  bootstrap, so a container that has never been started
  has neither. And only `RuntimeLinux` writes
  `vminitd.log`, so with another runtime plugin even
  plain `container logs` failed.
- A missing log now reads as empty: it's opened as
  `/dev/null`, with a debug log line. Any other failure
  to open a log still throws.

Co-authored-by: Bryan Mosley <342731628+bryanmosley@users.noreply.github.com>
2026-10-15 14:24:30 -07:00
J Logan b3eb70307a Add DNS aliases and subtree aliases for container network attachments (#2390)
- Closes #457.
- A container can now declare additional DNS names for
  a network attachment with a repeatable `alias` property
  on `--network`, including subtree aliases that match
  every name below a domain.
- With the default domain `test`, this container answers
  to `gateway.test` by its name, to `api.test` by the exact
  alias, and to `web.gateway.test`, `a.b.gateway.test`
  and every other name below `gateway.test` by the
  subtree alias. The motivating case is a gateway container
  in front of a local Kubernetes cluster that answers for
  `*.gateway.test`, with an ingress controller routing on
  the `Host` header.
- An alias is an exact name, or a name with a leading
  dot that matches every name below it. A name without
  a dot gets the default domain, as container names do.
  A subtree alias must be below a name the same
  attachment owns, and exact names are unique across
  all containers, so a container cannot claim another
  container's namespace. The rules for one attachment
  are checked when a container is created, again when
  a stored container starts, and again by the network
  helper when it registers the aliases. See
  `docs/architecture/dns.md` for the design, the
  invariants and the security considerations.
2026-10-14 10:11:00 -07:00
J Logan 7f3697804f Fix container image load for sparse images. (#2385)
- Fixes #2383.
- Bumps containerization to 0.50.0 to pick up
  apple/container#961 upon which this fix depends.
2026-10-12 16:31:01 -07:00
jwhur 763aea5bf0 Extract container build and container builder as a CLI plugin (#2298) 2026-10-08 11:14:49 -07:00
J Logan 0a48a1bdbf Remove machine user extension points, update machine docs. (#2322)
- Closes #2321.
- Removes image script and ORAS resource extension
  point handling for container machine user setup.
- Replaces image script resource with hardcoded script.
- Adds more flexible user setup options to
  `container machine`.
- Updates container machine documentation to clearly
  identify convenience-isolation tradeoffs.
2026-09-30 16:57:10 -07:00
Kathryn Baldauf 4a7d861524 Update to latest containerization@0.47.0 (#2301)
Signed-off-by: Kathryn Baldauf <k_baldauf@apple.com>
2026-09-24 17:14:52 -07:00
Daniel Syauqi dc276ee5f3 Run commands when image entrypoint is empty (#2296) 2026-09-22 16:36:20 -07:00
Raj b61450b6e8 Fix container egress loss after localhost DNS changes (#2256) 2026-09-10 19:00:07 -07:00
Di Warachet S. c82fe3c4be fix: handle container clean failing on read-only named volume mounts (#2228)
- Skips the rootfs when the container was created with
  `--read-only`, and skips block mounts whose options
  include `ro`.
- Keeps trimming the remaining targets after a failure,
  then throws one error listing each failed path with its
  underlying error.
2026-09-02 15:46:16 -07:00
Saehej Kang b8ffd38c73 [container]: add clean command (#1949)
- Closes #1763
- `container clean` marks deallocated filesystem blocks
  in the container VM so that the host can reclaim the
  unused capacity.
2026-09-01 11:32:31 -07:00
muk2andClaude Opus 4.8 d925dab865 Enhance container system status command output (#1769)
- Fixes #815.
- Relocates the API server info received from the health check
  XPC to a `server` property.
- Fixes the server `version` property in the health check result
  to contain only the version; previously it included text that was
  already in sibling properties. 
- Adds properties for host, client, paths, and resources.
- Adds these properties to the output of `container system status`,
  in a table or as JSON (`--format json`). Daemon-sourced fields
  populate only when the API server responds, so the command
  degrades gracefully to a "server not running" view when the
  daemon is stopped. System configuration values are not repeated
 here — `container system property ls` already reports them.

Co-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-08-30 12:56:09 -07:00
Kathryn Baldauf a9a62e28f6 Update to containerization 0.42.0 (#2207)
Signed-off-by: Kathryn Baldauf <k_baldauf@apple.com>
2026-08-28 15:38:56 -07:00
Siva Sathwik Kommi 388d964f38 Fix tmpfs mount source field left empty for --mount type=tmpfs (#2138) 2026-08-26 20:53:28 -07:00
Kathryn Baldauf 44374a237b Do not set default maskedPaths and readonlyPaths for container machines (#2137)
Signed-off-by: Kathryn Baldauf <k_baldauf@apple.com>
2026-08-19 09:44:25 -07:00
jshi991andJohn Logan b3357fdb2e Split K8sHelper, add WorkerProvisioner protocol, and add LinuxWorker … (#2110)
- Closes #2102.
- LinuxWorkerProvisioner sets up a kind-based node.
- Includes some test cleanups.

Co-authored-by: John Logan <john_logan@apple.com>
2026-08-18 13:12:06 -07:00
J Logan 5fcbeab570 Extracts createPluginLoader() for use by container k8s. (#2115) 2026-08-12 21:00:44 -07:00
Kathryn Baldauf ff5aa8a03b Validate volume name in volume disk usage call (#2107)
Signed-off-by: Kathryn Baldauf <k_baldauf@apple.com>
2026-08-10 13:42:16 -07:00
J Logan 497465635a Remove auto registry scheme. (#2100) 2026-08-10 09:55:53 -07:00
Pradeep BiswasandJohn Logan f13b7238d5 Refactor tmpfsMounts() to process tmpfs path correctly (#2103)
Co-authored-by: John Logan <john_logan@apple.com>
2026-08-10 09:49:58 -07:00
Aditya Ramani ddaf2ca5ac Add --read-only-path and --masked-path option to container run / create (#2069) 2026-08-04 19:04:50 -07:00
adityabagchi24 a58c5fe66c Adjust overcommit and max_map_count vm defaults in guest VMs (#2055)
Each container runs in its own guest VM sized to
`--memory` with no swap, so the guest kernel's
stock `vm` sysctl defaults are hit far too easily:

- `vm.overcommit_memory=0` (heuristic overcommit)
  rejects an oversized `mmap()` upfront whenever the
  reservation exceeds the small, swap-less VM's free
  RAM — even if the memory is never touched —
  returning `ENOMEM`.
- `vm.max_map_count=65530` caps per-process
  mapping count, which mapping-heavy applications
  (e.g. Elasticsearch, many JVMs) can exceed.
2026-08-02 15:33:52 -07:00
Saehej Kang da8bec6223 [container]: add container export for live containers (#1630)
- When container is not running, the runtime helper
  traverses the container's root fs and writes it to the
  specified tar archive or stdout.
- When the container is running, the helper performs
  the same operation but wraps it in freeze/thaw
  to ensure data integrity for the resulting archive.
2026-08-02 14:55:01 -07:00
48145ac7fb Fix image env vars, build context checks, TCP/UDP port forward buffer, and validate plugin name (#2027)
Signed-off-by: Kathryn Baldauf <k_baldauf@apple.com>
Co-authored-by: John Logan <john_logan@apple.com>
Co-authored-by: Raj Aryan Singh <rajaryan_singh@apple.com>
2026-07-28 10:13:10 -07:00
divyansh 13e976f88e fix: Increase XPC timeout for Machine API operations (#2006)
- Fixes #2003.
2026-07-27 13:49:18 -07:00
Ari RubinsteinandAri Rubinstein b229cecb53 Allow custom kernel boot args via --kernel-arg (#1744)
Signed-off-by: Ari Rubinstein <22369+arirubinstein@users.noreply.github.com>
Co-authored-by: Ari Rubinstein <22369+arirubinstein@users.noreply.github.com>
2026-07-27 13:44:51 -04:00
J Logan d1d763530d Fix BuilderStart race, parallelize container build tests. (#2002)
- Closes #2001.
- Handle "container exists" error gracefully instead
  of failing, when trying to start the buildkit container.
- Move build tests to parallel suites, while the builder
  lifecycle tests remain serial. Parallel builds don't
  use the fixture lock that deletes and restarts the
  builder and runs a build block in isolation.
2026-07-23 15:50:59 -07:00
J Logan 72431b0458 Add OCI maskedPaths and readonlyPaths support to Container API. (#1996) 2026-07-22 16:28:26 -07:00
J Logan b130babb15 Use ordered journal mode for unpacked images. (#1974) 2026-07-21 17:12:01 -07:00
Kathryn Baldauf 06127de1cd Update containerization dependency with new EXT4Unpacker func definition (#1973)
Signed-off-by: Kathryn Baldauf <k_baldauf@apple.com>
2026-07-21 13:52:31 -07:00
Kathryn Baldauf 9e1d6e8b6e Validate container ID from XPC requests (#1956)
Signed-off-by: Kathryn Baldauf <k_baldauf@apple.com>
2026-07-20 10:42:37 -07:00
0x4C33 57b07fa2ac Verify kernel archive integrity (#1703)
Closes https://github.com/apple/container/issues/1687

The default kernel archive is downloaded from a remote release URL
during first-run setup and via `container system kernel set
--recommended`. Previously, the archive contents were not verified after
download, so integrity depended on HTTPS and the release artifact
remaining unchanged.

This change adds digest verification for kernel archives. The
recommended/default kernel now has pinned digest metadata using an
algorithm-prefixed value such as `sha256:<hex>`. `container system
kernel set --tar` accepts `--digest`; remote tar URLs require it, and
local tar archives can also be verified before unpacking and
installation.

The system config also supports `kernel.digest`, and a custom
`kernel.url` must provide a digest for that archive.
2026-07-13 13:04:39 -07:00
Hugo, CY LAU 0c95007763 perf(parser): add collection capacity hints to known-size loops (#1791)
- For result sets with known sizes, it's more efficient
  to supply the size as a capacity hint.
2026-06-25 19:42:37 -07:00
J Logan 4a6084cc95 Remove network variant computation from API server. (#1814)
- Closes #1812.
- The network plugin is the source of truth for the variant, if any,
that applies to the network. Resolving a missing variant configuration
option in the API server can create a situation where the variant the
runtime uses for interface selection is incorrect.
- Adds serial suites trait to tests to see whether it helps current CI
issues.

## Type of Change
- [x] Bug fix
- [ ] New feature  
- [ ] Breaking change
- [ ] Documentation update

## Motivation and Context
Fixes a flaw in our interface strategy logic.

## Testing
- [x] Tested locally
- [ ] Added/updated tests
- [ ] Added/updated docs
2026-06-25 14:06:45 -07:00
Bhavesh Varma 1d70dd6ab9 Log the graceful-stop error instead of silently discarding it in gracefulStopContainer (#1782)
- Closes #1756.
- `RuntimeService.gracefulStopContainer(_:signal:timeout:)`
  wraps the graceful-stop attempt in `do { … } catch {}`. The
  empty catch silently discards any thrown error before falling
  through to the unconditional `lc.stop()`. It is the only catch
  in this file that does not log; every other one uses
  `self.log.error(…, metadata: ["error": "\(error)"])`.
- This adds a single log line matching that convention, so
  a failed graceful stop (and the resulting fall-through to a
  forced VM shutdown) is more diagnosable. The intentional
  fall-through to `lc.stop()` is unchanged.
2026-06-23 10:46:00 -07:00
SEPURI-SAI-KRISHNA 5e125d8e2a fix: remove force-unwrap on session dictionary in DefaultNetworkService (#1787)
- Instead of using force-unwrap to append to a list-valued
  dictionary entry that should always exist, assign the value
  with a default fallback and append to the (non-optional)
  result.
2026-06-23 09:52:05 -07:00
SEPURI-SAI-KRISHNA 0e3651b4f1 fix: replace try! with try? for stdout/stderr writes in ProcessIO (#1784)
- In `ProcessIO.swift`, the readability handlers for stdout and stderr
  used `try!` when writing data to the output file handles. This would
  cause crashes If the pipe is broken such that the force-try executes.
- Changed to handle a failed write similarly to an EOF.
2026-06-23 09:38:43 -07:00
J Logan 888582b4c8 Propagate permissions for all host-to-container socket mounts. (#1751)
- Closes #1750.
- Applies permission code used for the `--ssh` mount to all
host-to-container socket mounts.
- Adds a user option to the `doExec` test support function.
- Updates the `testRunCommandUnixSocketMount` to install `nc` in the
test container, and check the socket permission, and check the mounted
socket using `nc` as the guest user.
2026-06-18 11:45:24 -07:00
Michael Crosby c4a22389ac add container machine nested virt (#1742)
This also includes custom kernels for container machine. Its required
with nested virt as CONFIG_KVM needs to be enabled.

---------

Signed-off-by: michael_crosby <michael_crosby@apple.com>
2026-06-18 06:53:21 -07:00
Charlie Le b34cf390a6 Fix duplicate "(default: 3)" in --max-concurrent-downloads help text (#1725)
Remove manually specified default value from help string since
ArgumentParser already appends it automatically from the property's
default value.

Signed-off-by: Charlie Le <charlie_le@apple.com>
2026-06-16 14:13:59 -07:00
Kathryn Baldauf c8b4fd73a1 Always update default network with system configuration values (#1686)
Closes https://github.com/apple/container/issues/1677.
2026-06-11 11:42:21 -07:00
b2994ac369 Add container machine for managing persistent Linux VMs (#1662)
## Type of Change
- [ ] Bug fix
- [x] New feature  
- [ ] Breaking change
- [ ] Documentation update

## Motivation and Context
`container` runs each workload in an ephemeral VM, so there's no
built-in way to keep a persistent Linux environment you can log into and
work in. `container machine` adds one.

A container machine is a lightweight, persistent, and integrated Linux
environments that feel like an extension of your Mac, created from
standard OCI images with a familiar UX. The login user matches your host
account with passwordless `sudo`, your home directory is mounted inside
the VM, and each machine keeps its filesystem and runs the image's own
init system (such as`systemd` or `openrc`).

```bash
container machine create alpine:3.22 --name my-machine
container machine run -n my-machine # interactive shell
container machine set -n my-machine cpus=4 memory=8G
```

Subcommands: `create`, `run`, `list` (`ls`), `inspect`, `set`,
`set-default`, `logs`, `stop`, `delete` (`rm`); `m` aliases `machine`.
Docs added to `docs/command-reference.md` (Machine Management) and
`docs/how-to.md` ("Use container machines").

## Testing
- [x] Tested locally
- [x] Added/updated tests
- [x] Added/updated docs

Signed-off-by: Raj Aryan Singh <rajaryan_singh@apple.com>
Co-authored-by: Jaewon Hur <jaewon_hur@apple.com>
Co-authored-by: John Logan <john_logan@apple.com>
Co-authored-by: Michael Crosby <michael_crosby@apple.com>
Co-authored-by: Eric Ernst <eric_ernst@apple.com>
Co-authored-by: Danny Canter <danny_canter@apple.com>
2026-06-08 11:38:49 -07:00
J Logan 90cc3c15af Omit hash scheme from image.id. (#1658)
- Closes #1657.
- Also reduces `trimDigest()` output to 12 characters and gets rid of
the trailing ellipsis.
2026-06-05 14:43:20 -07:00
Kathryn Baldauf 1d0d43668d Rearrange shape of JSON output for images (#1652)
- This PR changes the shape of the JSON
  output for image resources to align closer with
  `VolumeResource` and `NetworkResource`.
  This includes adding `creationDate` in the
  `configuration` section of the image output.
- This PR additionally cleans up some of the logic
  around the `ImageResource` struct construction.

Signed-off-by: Kathryn Baldauf <k_baldauf@apple.com>
2026-06-05 08:09:53 -07:00
J Logan 59e015acd1 Use name instead of id in NetworkConfiguration. (#1648)
- Closes #1647.
- `id` will become a system assigned (Docker-like) identifier
  for the managed resource, and `configuration.name` is the
  user-assigned name.
2026-06-04 13:03:29 -07:00
Danny Canter 796630258b kill: Wait for container to exit after sigkill (#1589)
Today when we send a signal we don't wait for the container to exit, as
we don't know what signals the program will actually do anything with.
However, sigkill does not fit this mold, and we should wait for the
container to exit (or be removed for --rm containers).
2026-06-02 14:26:17 -07:00
J Logan e20aca8203 Normalize JSON output for network and volume resources. (#1624)
Normalize JSON output for network and volume resources. (#1624)
- Reworks both JSON output presets to use sorted keys, ISO timestamps.
`compact` is used for `ls` output, and `pretty` is used for `inspect`.
- Extracts non-DRY option configuration into presets.
- Closes #1623.
2026-06-01 21:42:10 -07:00
Kathryn Baldauf 55f1e4fdf4 Create ImageResource conforming to ManagedResource (#1619)
- Closes #1625.
- For now, the ImageResource compliance happens
  at the CLI level. We will work on pushing that into or
  closer to the APIServer at a later time.

## Testing
- [x] Tested locally

---------

Signed-off-by: Kathryn Baldauf <k_baldauf@apple.com>
2026-06-01 17:01:20 -07:00
Raj 7358102c68 Fix system df to count content blobs and deduplicate shared storage (#1555)
- Closes #1526 and #1527.

## Type of Change
- [x] Bug fix
- [ ] New feature  
- [ ] Breaking change
- [ ] Documentation update

## Motivation and Context
This PR fixes `system df` to report actual on-disk allocated bytes
(content blobs + snapshots) instead of summing per-image snapshot sizes.
Orphaned blobs are now included as reclaimable, and storage shared
across tags is no longer double counted. Also consolidates three
identical `calculateDirectorySize` implementations into a shared
`FileManager.allocatedSize(of:)` extension.

## Testing
- [x] Tested locally
- [x] Added/updated tests
- [ ] Added/updated docs
2026-06-01 15:44:43 -07:00
Chris George da8daf31de Use FilePath for PublishSocket (#1594)
- Closes #1593.
2026-06-01 13:35:58 -07:00
J Logan 37595a734c Remove XPC compatibility code, simplify network model. (#1616)
- Refactor network model types: replace `NetworkState` enum and
phase-based NetworkStatus with a flat `NetworkStatus` struct.
- Simplify API server ↔ plugin protocol: plugin `status()` returns
runtime status only, API server owns configuration.
- `NetworksService` `list()`/`create()` now return `NetworkResource`
directly.
- Remove lifecycle phase checks and state machine guards throughout CLI
and API server.
- `variant` is plugin-specific, it's not a required property. This PR
replaces `NetworkPluginInfo` with a `plugin` name property on
`NetworkConfiguration` and an `options` list similar to that for
volumes.
- Moved `variant` to the option list.
2026-05-29 12:33:45 -07:00