Skip to content

Throw error when starting a container with invalid virtiofs source - #1051

Merged
jglogan merged 2 commits into
apple:mainfrom
JaewonHur:check-virtiofs-deleted
Jan 19, 2026
Merged

Throw error when starting a container with invalid virtiofs source#1051
jglogan merged 2 commits into
apple:mainfrom
JaewonHur:check-virtiofs-deleted

Conversation

@JaewonHur

Copy link
Copy Markdown
Contributor

Run = Create + Start

  1. Mount source points to a valid directory

    • Run and Create + Start both correctly create the container with mount.
  2. Mount source points to a file

    • Run fails bootstrapping the container, thus container not created.
    • Create creates the container, but Start fails bootstrapping, removing the container. (Thus, both are the same.)
  3. Mount source deleted or replaced to file after container created

    • Start throw errors but do not delete the container.

Type of Change

  • Bug fix
  • New feature
  • Breaking change
  • Documentation update

Motivation and Context

User can encounter unexpected container removal when shared volume source is in wrong state.

Testing

  • Tested locally
  • Added/updated tests
  • Added/updated docs

@JaewonHur
JaewonHurforce-pushed the check-virtiofs-deleted branch from 2841247 to b7f738dCompareJanuary 14, 2026 20:10
@jglogan

Copy link
Copy Markdown
Contributor

Seeing this test failure:

◇ Suite TestCLINoParallelCases started.
◇ Test testImageSingleConcurrentDownload() started.
✔ Test testImageSingleConcurrentDownload() passed after 0.862 seconds.
◇ Test testImageManyConcurrentDownloads() started.
✔ Test testImageManyConcurrentDownloads() passed after 0.704 seconds.
◇ Test testImagePruneNoImages() started.
✔ Test testImagePruneNoImages() passed after 0.184 seconds.
◇ Test testImagePruneUnusedImages() started.
✘ Test testImagePruneUnusedImages() recorded an issue at TestCLINoParallelCases.swift:81:9: Expectation failed: (output → "untagged registry.local/stdin-file:10E1258F-6DC1-40EB-80F1-F18471AEA98E
untagged ghcr.io/apple/containerization/vminit:0.20.1
untagged test-alpine-env:DC582421-DD5D-496F-BE47-C39EB2F5693B
untagged test-env-child:0CE91A3D-E1F0-4FB5-A4FB-8375E9FD7A47
untagged ghcr.io/containerd/busybox:1.36
untagged ghcr.io/containerd/busybox:testImageSaveAndLoadStdinStdout
untagged ghcr.io/linuxcontainers/alpine:testImageTag
untagged registry.local/multi-arch:326BD5F0-39E8-4681-B6EB-EC89A17E200E
untagged test-env-only:FB98ED08-8994-422B-9695-B8F22E806E05
untagged ghcr.io/containerd/busybox:testImageSaveAndLoad
untagged registry.local/add-all:A45C78C8-BCC9-4DB3-B736-BF36D37A6E28
untagged registry.local/multi-tag-test:latest
untagged ghcr.io/apple/container-builder-shim/builder:0.7.0
untagged registry.local/build-arg:8B2B8285-79D0-4D46-8281-A098B10AEAB6
untagged registry.local/build-symlinks:A8449327-D470-4794-9043-3665EFF0ADEB
untagged registry.local/multi-tag-test:EA0E05B5-867A-4DDF-A10D-85E40ED26052
untagged registry.local/build-network-access:CB58B319-C954-48B9-9A13-CB5957221C40
untagged ghcr.io/linuxcontainers/alpine:testImageSaveAndLoad
untagged test-label-only:C04AAD7A-8D05-45FE-B48B-C0648395C196
untagged from-local:7D176AF6-90F2-44D3-8624-56DF2DA194F7
untagged registry.local/scratch-add:BED25DA9-D9CD-4F92-A67F-2097B0326FB4
untagged docker.io/library/python:alpine
untagged ghcr.io/username/image-name:mytag
untagged ghcr.io/linuxcontainers/alpine:3.18
untagged registry.local/dockerfile-keywords:E77F2AF6-241A-4E61-B9C9-98BCEC65D8BB
untagged test-env-base:6CA5943D-47B0-4669-A26F-2963D3FEBE7C
untagged registry.local/dot-file:44442DC8-DC1C-468A-A3A6-5F98F98F0AC4
untagged registry.local/from-previous-layer:4FDB702C-0369-4162-997E-ABB9365BA918
untagged test-build-and-run:latest
untagged local-only:E87D38F9-F823-4F9E-BB50-50CF93725ED0
untagged test-complex-env:F26FA244-7D12-4C64-A8E5-A4323254C645
untagged ghcr.io/linuxcontainers/alpine:testImageSaveAndLoadStdinStdout
untagged registry.local/scratch-add-special-dir:1A1B8E39-3746-4563-9F11-C1926C7A84E3
untagged registry.local/multi-tag-test:v1.0.0
untagged registry.local/build-diff-context:24D7C51D-4A52-4B51-A660-9129E0824C5B
deleted 193d51b116e20bdd28a9b292a008ec7a446758e6b4bea1a09801848ce32aa68c
deleted 86852de7f69d89c037ced2f78afa323976a44a10f8ac96626aa97b85ea160c34
deleted dae9190ee1dfeaa618a111d20058289d5cab7cb78105045fc9c887296f4db76d
deleted 96c8bb09dc1a2e998a574217f921911029d197c1f40bf81eb983286d484f74b0
deleted fd65fd9f19f58489ad910135803d1d89928927820d73110adefa161932cd335a
deleted b49eda688ce8c1226b6d7e02969f22361a8874cfee14c603e98ad855f1267a94
deleted 3a065aab44645209c4c3d3746f31b17cd6048a4148f890ed0fe9128baab9f553
deleted 9f9c4097a5eeb3e1b0f4fecaea5bbbe7da91f1d5e5ebb798b49047eca8e3e053
deleted be7d6d554a4bcc2b43d042f800f8f75055063ba668b9c7d60c831b16c0f26d3c
deleted ad499d8d07ad9998ee30577b376b76036eec716352318f550f5cec2cdfe5bfb1
deleted 46758452d3eef8cacb188405495d52d265f0c3a7580dfec51cb627c04c7bafc4
deleted c1d35649879861aec54f6ee4b049d573fd0e876178c558664af8da0eb0313b3d
deleted b333a6ba512596007c2683825dd364570303624164926019bbe674d90c28d5fc
deleted 29e4011ec5ddd973132dc62a298532cf7e74ed52accb51dcabdde661c4b35e88
deleted 69a77b9e82a72c35ec6ef0440fc5e3d0d32cc3235dcf9953f938d0c00bc2592f
deleted 469f7b67563d268cf25bb109da2d34e54c8b6ecf46f217c153260ab19bb016b6
deleted 430c16482b7d918525165f02610d7d24692dbdb96c02662a4be1b11cfe9144e6
deleted 77ed5ebc3d9d48581e8afcb75b4974978321bd74f018613483570fcd61a15de8
deleted bfa33b545f308b89bfcdc2f1494a8b33eb4942225428283684bf724802af9feb
deleted c21043749f3985bf7b16d9f5dcb64761f4571f2f50995486f0303fbfa63af1a2
deleted f62ebdf5041307d70c3b258918b2b7fe65f9470020c100b2369288e69a46602f
deleted b8867b6470fa5a2ad4993cdfa8407c089792c9ca28a99246628bc1b093afaf61
deleted a5ca0b27295ac877b32fed9056cd9e0685aa103880b5b4608fa018a7b2675ebe
deleted 44f35edb16d2a3aa958968b4825b37b2decb9bb1021522a02815b3ec3f9fe378
deleted 4c2e345eb1c3ec2b19a9e4c3ee422a8b01d280bcea5c4b4d3144aace2e231d82
deleted f1139c06d62421bbf77cec7852ff280a151d6d44f8964534b4a01f00bd745613
deleted f6b4fb9446345fcad2db26eac181fef6c0a919c8a4fcccd3bea5deb7f6dff67e
deleted b0c2909d1da88c295531b3acb353524ebc452d70a198d012df008a0c2f30a70a
deleted 6495489e65b7e1f05fff4e6828ece2ce1b0d5cf5b0bd740bb0d0b1185803c8a3
deleted 74b67d9de7c0a62fd14e11a737e0f6ed8fa9d0803c0ecbde23ff302e7523495f
deleted f78e6840ded1aafb6c9f265f52c2fc7c0a990813ccf96702df84a7dcdbe48bea
deleted 8a6eaca30cf8f88d713fd5040661cefa076b0e809dc27a52e38863c567531379
deleted 8ceaa5e44e0777ada21c9afb0afbc0b2ff35f3836d185d019982004e0ba04fc7
deleted 2bc9dea49d1a226db134bce761bfa89dd456109555c3ee4c490db84ad48d53b0
deleted 7fd44050a834a9d06057d8d20b5d7c11e37682ad42d2b64bdc9112118262a3d2
deleted e954aa43bc3d58a30a967d36b0b0ebf408eea4b1283106d2ca553b0243858d6b
deleted 5a6960d24672eeb3ab99648411781c92a07e762305fd81152a600d3fadb68b33
deleted 4ff685e2bcafdab0d2a9b15cbfd9d28f5dfe69af97e3bb1987ed483b0abf5a99
deleted b07db1bde08dc5ef78326cace055da8387ab54dc352f0e786acfb2efa43b6f45
deleted 9e240dbce563eba2b4cfb6f86247dc75047c1b2a6a54dba00129f113737f4880
deleted c3505dfdb7a6ef524d17d0ee391749f94de950c43642e3286e06172577e184a3
deleted c7dc643c3cfd3d741403be633468db3858d7ec09034ccb10b86836165f600607
deleted 8a49fdb3b6a5ff2bd8ec6a86c05b2922a0f7454579ecc07637e94dfd1d0639b6
deleted 16184b59f4c7ede13940875705528ce315e96c08c4fcbab3c69676a9cef17159
deleted d7ce2729f5f4d1716be99bc2376a7ea2906d293543c4bcd31693e569e6c04fee
deleted 65c9c10b984f059d0a8b8a054ae2d7ee817ce2caf06ade436074dc89dfbf0717
Reclaimed 3.35 GB in disk space
").contains(alpine → "ghcr.io/linuxcontainers/alpine:3.20")
↳ should prune alpine image
✘ Test testImagePruneUnusedImages() recorded an issue at TestCLINoParallelCases.swift:86:9: Expectation failed: alpineRemoved
↳ expected image ghcr.io/linuxcontainers/alpine:3.20 to be removed
✘ Test testImagePruneUnusedImages() failed after 21.787 seconds with 2 issues.
◇ Test testImagePruneDanglingImages() started.
✔ Test testImagePruneDanglingImages() passed after 69.015 seconds.
➜ Test testNetworkPruneNoNetworks() skipped: "Requires macOS 26"
➜ Test testNetworkPruneUnusedNetworks() skipped: "Requires macOS 26"
➜ Test testNetworkPruneSkipsNetworksInUse() skipped: "https://github.com/apple/container/issues/953"
➜ Test testNetworkPruneSkipsNetworkAttachedToStoppedContainer() skipped: "https://github.com/apple/container/issues/953"
✘ Suite TestCLINoParallelCases failed after 92.555 seconds with 2 issues.
↳ /// Tests that need total control over environment to avoid conflicts.
✘ Test run with 9 tests in 1 suite failed after 92.555 seconds with 2 issues.

@JaewonHur

JaewonHur commented Jan 15, 2026

Copy link
Copy Markdown
ContributorAuthor

Previous failures may have affect the following ones.
Not sure what's the first test case causing the issue... no test seems touching the code I updated.

Below is the failing test cases in git action. Could we try testing again to check it reproduces the same?

2026-01-14T23:29:22.6911480Z ✘ Test testRunCommandPlatform() failed after 77.334 seconds with 1 issue.
2026-01-14T23:29:22.6911960Z ✘ Test testRunDefaultHostsEntries() failed after 77.334 seconds with 1 issue.
2026-01-14T23:47:36.1332820Z ✘ Test testImagePruneUnusedImages() failed after 21.787 seconds with 2 issues.

@JaewonHur
JaewonHurforce-pushed the check-virtiofs-deleted branch from b7f738d to e840b77CompareJanuary 15, 2026 01:53
@JaewonHur

Copy link
Copy Markdown
ContributorAuthor

Integration test succeeded on my Mac.

✔ Suite TestCLINetwork passed after 16.947 seconds.
✔ Suite TestCLIRunLifecycle passed after 3.351 seconds.
✔ Suite TestCLIExecCommand passed after 3.131 seconds.
✔ Suite TestCLICreateCommand passed after 5.006 seconds.
✔ Suite TestCLIRunCommand passed after 56.832 seconds.
✔ Suite TestCLIStatsCommand passed after 6.962 seconds.
✔ Suite TestCLIImagesCommand passed after 36.785 seconds.
✔ Suite TestCLITermIO passed after 1.346 seconds.
✔ Suite TestCLIRunBase passed after 1.346 seconds.
✔ Suite CLIBuilderEnvOnlyTest passed after 24.335 seconds.
✔ Suite CLIBuilderLifecycleTest passed after 4.038 seconds.
✔ Suite CLIBuilderLocalOutputTest passed after 4.220 seconds.
✔ Suite CLIBuilderTarExportTest passed after 5.943 seconds.
✔ Suite CLIBuilderTest passed after 38.796 seconds.
✔ Suite TestCLIBuildBase passed after 77.334 seconds.
✔ Suite TestCLIVolumes passed after 19.690 seconds.
✔ Suite TestCLIKernelSet passed after 108.282 seconds.
✔ Suite TestCLIAnonymousVolumes passed after 26.928 seconds.
✔ Suite TestCLINoParallelCases passed after 40.251 seconds.

Comment on lines +73 to +77
for mount in container.configuration.mounts where mount.isVirtiofs {
if !FileManager.default.fileExists(atPath: mount.source) {
throw ContainerizationError(.invalidState, message: "path '\(mount.source)' is not a directory")
}
}

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Is it possible for us to do this in bootstrap in the API server instead?

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

It could be, but it might be duplicated as ClientCreate and ClientRun checks the mount source also.

Current bootstrap implicitly does it as making VM throws an error due to the wrong mount source path.
The thing is then, the container is just removed forever due to the cleanup logic.

@JaewonHur

Copy link
Copy Markdown
ContributorAuthor

It seems RunCommand fails randomly due to the XPC timeout when creating the container, but API server actually created the container internally.

✘ Test testRunCommandOSArch() recorded an issue at TestCLIRunCommand.swift:298:25: Issue recorded
↳ failed to run container .executionFailed("command failed: \u{1B}[33mWarning!\u{1B}[0m Running debug build. Performance may be degraded.\nError: internalError: \"failed to create container\" (cause: \"internalError: \"XPC timeout for request to com.apple.container.apiserver/containerCreate\"\")\n")
2
✘ Test testRunCommandOSArch() failed after 84.430 seconds with 1 issue.

Since the container is not cleaned up in the earlier test, image prune fails as alpine image is not dangling.

✘ Test testImagePruneUnusedImages() recorded an issue at TestCLINoParallelCases.swift:86:9: Expectation failed: alpineRemoved
↳ expected image ghcr.io/linuxcontainers/alpine:3.20 to be removed
✘ Test testImagePruneUnusedImages() failed after 20.391 seconds with 2 issues.

@JaewonHur
JaewonHurforce-pushed the check-virtiofs-deleted branch from e840b77 to 2a0ef3dCompareJanuary 16, 2026 22:18
Run = Create + Start
1) Mount source points to a valid directory
- Run and Create + Start both correctly create the container with
mount.
2) Mount source points to a file
- Run fails bootstrapping the container, thus container not created.
- Create creates the container, but Start fails bootstrapping,
removing the container.
(Thus, both are the same.)
3) Mount source deleted or replaced to file after container created
- Start throw errors but do not delete the container.
@JaewonHur
JaewonHurforce-pushed the check-virtiofs-deleted branch from 20d55c9 to 39cce7bCompareJanuary 19, 2026 07:27
@jglogan
jglogan merged commit 69445b9 into apple:mainJan 19, 2026
3 of 4 checks passed
Mcrich23 added a commit to Mcrich23/container that referenced this pull request Jan 20, 2026
commit 69445b9
Author: jwhur <57657645+JaewonHur@users.noreply.github.com>
Date: Mon Jan 19 13:09:34 2026 -0800
Throw error when starting a container with invalid virtiofs source (apple#1051)
Run = Create + Start
1) Mount source points to a valid directory
- Run and Create + Start both correctly create the container with mount.
2) Mount source points to a file
- Run fails bootstrapping the container, thus container not created.
- Create creates the container, but Start fails bootstrapping, removing
the container. (Thus, both are the same.)
3) Mount source deleted or replaced to file after container created
- Start throw errors but do not delete the container.
commit 08f48d9
Author: Danny Canter <danny_canter@apple.com>
Date: Fri Jan 16 21:48:58 2026 -0800
ContainerSvc: Handle unexpected sandbox svc exits (apple#1065)
Closesapple#1050
If the sandbox svc exits out of band of the usual stop (or regular exit)
case the container svc's state is not properly updated for the
container. This was due to the cleanup steps involving trying to send
the shutdown rpc which cannot succeed as the sandbox svc does not exist
to service it.
To handle this, let's treat shutdown not returning successfully as
non-fatal (as this is mostly best effort), log an error and continue the
state cleanup.
commit b928e3f
Author: Amir Alperin <me@remotecpp.dev>
Date: Sat Jan 17 07:43:48 2026 +0200
fix: performance warning should not output ANSI codes if stderr redirected (apple#1059)
commit 744e7f7
Author: J Logan <john_logan@apple.com>
Date: Fri Jan 16 16:26:13 2026 -0800
Update for containerization 0.21.0. (apple#1056)
- Update image load and build to handle rejected paths during tar
extraction. For the image load command there is now a `--force` function
that fails extractions with rejected paths when false, and just warns
about the rejected paths when true.
- Update `container stats` for statistics API properties now all being
optional.
## Type of Change
- [x] Bug fix
- [ ] New feature
- [ ] Breaking change
- [x] Documentation update
## Motivation and Context
See above
## Testing
- [x] Tested locally
- [x] Added/updated tests
- [x] Added/updated docs
commit b1577d8
Author: J Logan <john_logan@apple.com>
Date: Fri Jan 16 15:50:47 2026 -0800
Adds opt-in pre-commit hook for format and header checks. (apple#1062)
- Closesapple#639.
- Adds swift format configuration that removes lint checks so we can use
`swift lint` to perform format-only tests.
- Adds `check` target that invokes format and header checks.
- Adds pre-commit script that runs `make check`.
- Adds `pre-commit` target that installs the check script as a
pre-commit hook.
## Type of Change
- [ ] Bug fix
- [x] New feature
- [ ] Breaking change
- [x] Documentation update
## Motivation and Context
Avoids wasting time and commit rewrites.
## Testing
- [x] Tested locally
- [ ] Added/updated tests
- [x] Added/updated docs
commit 3cf2c6a
Author: J Logan <john_logan@apple.com>
Date: Fri Jan 16 13:41:32 2026 -0800
Fix unstable integration tests. (apple#1060)
- TestCLIRunCommand now run so many tests concurrently that the API
server gets swamped and tests randomly time out.
- The parallelism options on `swift test` only work for XCTest, not
swift-testing.
- Work around this while retaining some parallelism (good for stress
testing) by breaking the tests into two suites.
commit 8897fcc
Author: Manu Schiller <56154253+manuschillerdev@users.noreply.github.com>
Date: Wed Jan 14 04:39:08 2026 +0100
fix: use pax instead of tar for pkg payload extraction (apple#1038)
- It is common to have `gnu-tar` alongside other GNU tools
installed and aliased for compatibility reasons. However, this
breaks the current make build.
- Use BSD-only binaries (no GNU equivalents that are
commonly aliased), making the Makefile more portable.
commit dbec1db
Author: Ronit Sabhaya <ronitsabhaya75@gmail.com>
Date: Mon Jan 12 20:34:25 2026 -0600
Add support for aarch64 architecture alias (apple#1040)
- Adds `aarch64` as an alias for `arm64` in the `Arch` enum. This
addresses the maintainer's request to support this common architecture
name, ensuring consistency with `x86_64` normalization and preventing
failures for users expecting `aarch64` support.
commit 837aa5e
Author: jwhur <57657645+JaewonHur@users.noreply.github.com>
Date: Mon Jan 12 14:36:10 2026 -0800
Fix the FS error when using Virtualization (apple#1041)
- Fixesapple#614.
- Use VZ cached mode instead of auto.
Signed-off-by: jwhur <jaewon_hur@apple.com>
commit e465b10
Author: 박성근 <117553364+ParkSeongGeun@users.noreply.github.com>
Date: Tue Jan 13 03:30:51 2026 +0900
Fix relative path resolution in entrypoint (apple#987)
- Fixesapple#962.
- Adds test to exercise apple/containerization#473.
- Updates containerization to 0.20.1.
Signed-off-by: ParkSeongGeun <phd0801@naver.com>
commit aa77928
Author: Ronit Sabhaya <ronitsabhaya75@gmail.com>
Date: Mon Jan 12 12:04:46 2026 -0600
Fix: Support x86_64 architecture alias to prevent silent pull failure… (apple#1036)
- Adds architecture name normalization to accept
`x86_64` and `x86-64` as aliases for `amd64`.
commit dc4682b
Author: Amir Alperin <me@remotecpp.dev>
Date: Fri Jan 9 21:10:53 2026 +0200
fix: extract hostname from FQDN (apple#1011) (apple#1017)
- Set the container hostname to the first DNS
label derived from the container id, strip everything
after the first dot.
- Fixesapple#1011.
commit 4af1cc0
Author: Ronit Sabhaya <ronitsabhaya75@gmail.com>
Date: Thu Jan 8 21:27:43 2026 -0600
fix: improve error message when binding to privileged ports (fixesapple#978) (apple#1031)
- The container fails to start with a generic "permission denied"
error when attempting to publish privileged ports (ports below
1024) without root privileges. This provides a confusing user
experience as the error doesn't explain why permission was
denied.
commit 21facf0
Author: J Logan <john_logan@apple.com>
Date: Thu Jan 8 17:02:22 2026 -0800
Add instructions for using locally built init filesystem. (apple#1032)
- Closesapple#1030.
commit b671690
Author: Danny Canter <danny_canter@apple.com>
Date: Wed Jan 7 21:01:10 2026 -0800
ProgressBar: Various fixes (apple#1025)
There's a couple things I don't think are intuitive about this.
1. Because of the internal task, render() can still be called even after
finish() completes. Ideally async defers are supported and we could just
await the final render completing after cancelling the task and setting
.finished, but alas. To fix this we can just lock across the methods for
now.
2. We always clear the screen in the destructor, even if we don't use
the
progress bar. I don't think we should honestly do anything in the
destructor.
Feels a programmer error not to defer { bar.finish() } or call it
somewhere.
3. Our spaces based line clearing. Use the ansi escape sequence for
clearing line;
I think our calculations were slightly off and it would leave trailing
output ( "s]" )
in some cases.
4. Shrinking the window until the output is smaller than the terminal
window (and vice
versa) is wonky on various term emulators. Truthfully, this is just a
hard problem,
but we can truncate our output and still provide some useful info.
This fixes some single line output (cat /etc/hostname etc.) getting
cleared in our atexit handler, as well as the need for the usleep.
commit 98410fd
Author: J Logan <john_logan@apple.com>
Date: Wed Jan 7 18:23:31 2026 -0800
Adds IPv6 port forwarding. (apple#1029)
- Closesapple#1006.
commit 9d06475
Author: Saehej Kang <saehej.kang@gmail.com>
Date: Wed Jan 7 16:53:33 2026 -0800
[container]: add startedDate field (apple#1018)
- Closesapple#302.
- Closesapple#336 (obsoletes this PR).
commit db8932a
Author: J Logan <john_logan@apple.com>
Date: Wed Jan 7 15:35:35 2026 -0800
Resolve IPv6 address queries for container names. (apple#1016)
- Closesapple#1005.
- Adapt everything to use MACAddress type from containerization 0.20.0.
- Allocate MAC addresses for every container so that we have
deterministic IPv6 link local addresses.
- Add AAAA handling to ContainerDNSHandler.
- NOTE: Only works on Tahoe. On Sequoia, we don't have a good way to set
or determine the IPv6 network prefix when networks are created, so we
can't infer the IPv6 link local addresses for AAAA responses and we
instead return `NODATA`.
commit 5d6c750
Author: Danny Canter <danny_canter@apple.com>
Date: Wed Jan 7 14:48:58 2026 -0800
CLI: Add read-only flag to run/create (apple#999)
Closesapple#990
Sets the rootfs for a container to read-only.
commit aac2457
Author: Danny Canter <danny_canter@apple.com>
Date: Wed Jan 7 13:46:26 2026 -0800
Tests: Fix relative path mount tests (apple#1028)
The tests are run in parallel on CI, and were split into three tests.
They change the cwd, so it's kind of a gamble whether some of them pass.
This just moves all the logic into one test mostly.
commit 9cd5397
Author: J Logan <john_logan@apple.com>
Date: Wed Jan 7 10:35:19 2026 -0800
Update to containerization 0.20.0. (apple#1027)
- Use MACAddress for Attachment and CZ interfaces.
- Move data validation closer to API surface.
commit 356c8d2
Author: J Logan <john_logan@apple.com>
Date: Tue Jan 6 08:27:14 2026 -0800
Reorganize client libraries. (apple#1020)
- Closesapple#461.
- Extract core types into ContainerResources target.
- Extract ContainerNetworkServiceClient from ContainerNetworkService.
- Relocate sandbox client from ContainerClient to
ContainerSandboxServiceClient.
- Relocate ContainerClient to ContainerAPIServiceClient.
- Common structure from services and clients under Source/Services.
Updated project hierarchy:
```
Sources/CAuditToken - audit token access wrapper
Sources/CLI - CLI executable
Sources/ContainerBuild - builder
Sources/ContainerCommands - CLI command implementations
Sources/ContainerLog - logging helpers
Sources/ContainerPersistence - persistent data and system property helpers
Sources/ContainerPlugin - plugin system
Sources/ContainerResource - resource (container, image, volume, network) types
Sources/ContainerVersion - version helpers
Sources/ContainerXPC - XPC helpers
Sources/CVersion - injected project version
Sources/DNSServer - container DNS resolver
Sources/Helpers - service executables
Sources/Services/*/Client - service clients
Sources/Services/*/Server - service implementations
Sources/SocketForwarder - port forwarding
Sources/TerminalProgress - progress bar
```
## Type of Change
- [ ] Bug fix
- [ ] New feature
- [x] Breaking change
- [ ] Documentation update
## Motivation and Context
The ContainerClient library was a bit of a grab bag. This refactor
applies a more sensible project and library structure for resource data
types, services, and clients.
## Testing
- [x] Tested locally
- [x] Added/updated tests
- [ ] Added/updated docs
commit 8c439cd
Author: Danny Canter <danny_canter@apple.com>
Date: Mon Jan 5 13:50:57 2026 -0800
makefile: Add cli target (apple#1022)
Often times I'll be making a change that only touches the cli and I
don't feel like sitting through the potential song and dance of the
other components building/installing.
commit d6f052d
Author: Kathryn Baldauf <k_baldauf@apple.com>
Date: Mon Jan 5 13:09:34 2026 -0800
Update license header on all files to include the current year (apple#1024)
## Motivation and Context
Now that we're in 2026, we need to update the license headers on all the
files. Unfortunately, Hawkeye doesn't have an attribute for the current
year to help us avoid this in the future. Instead, I had to work around
this by doing the following:
1. Update licenserc.toml with:
```
[properties]
... (other properties)
currentYear = "2026"
```
2. Update scripts/license-header.txt with
```
Copyright ©{{ " " }}{%- set created = attrs.git_file_created_year or
attrs.disk_file_created_year -%}{%- set modified = props["currentYear"]
-%}{%- if created != modified -%} {{created}}-{{modified}}{%- else
-%}{{created}}{%- endif -%}{{ " " }}{{ props["copyrightOwner"] }}.
```
Then I removed these two changes before committing. After this PR is
merged, all files will have recently had git updates, so the existing
code for setting the modified year should work as intended.
Signed-off-by: Kathryn Baldauf <k_baldauf@apple.com>
commit 20dc0bc
Author: Danny Canter <danny_canter@apple.com>
Date: Sun Jan 4 11:11:09 2026 -0800
Parser: Support relative paths for --volume (apple#1013)
commit 028e7e1
Author: Danny Canter <danny_canter@apple.com>
Date: Sun Jan 4 10:52:46 2026 -0800
Deps: Bump Containerization to 0.19.0 (apple#1015)
Has read-only rootfs support.
commit 020949e
Author: Danny Canter <danny_canter@apple.com>
Date: Sun Jan 4 10:51:20 2026 -0800
CLI: Small fixups for implicit envvars (apple#1014)
We should only inherit from the host if there's no =. Additionally
document the flag a little more to show that we can inherit from the
host.
commit df368b7
Author: Amir Alperin <alperin.amir@gmail.com>
Date: Sun Jan 4 20:49:22 2026 +0200
Fix port validation to allow same port for different protocols (apple#992) (apple#1000)
- Fixes: apple#992
- Port validation previously rejected valid configurations
when the same port number was used for different
protocols (TCP and UDP). For example:
`-p 1024:1024/udp -p 1024:1024/tcp`
Although this is a valid and common use case, the
validation logic treated it as a conflict.
To fix this, I updated the validation key to include the protocol name.
The validation now checks for overlapping port numbers only within the
same protocol, rather than across all protocols.
This change enables binding the same port number for both TCP and UDP,
aligning the validation behavior with real-world networking
requirements.
## Testing
- [x] Tested locally
- [x] Added/updated tests
- [ ] Added/updated docs
commit cf64614
Author: J Logan <john_logan@apple.com>
Date: Fri Jan 2 14:10:48 2026 -0800
Update OSS header in Package.swift. (apple#1010)
commit 375ce16
Author: J Logan <john_logan@apple.com>
Date: Fri Jan 2 12:09:12 2026 -0800
Fix OSS header dates that break CI checks. (apple#1009)
commit 580d853
Author: c <claudeaceae@icloud.com>
Date: Fri Jan 2 00:19:57 2026 -0500
Use full path for uninstall script in upgrade instructions (apple#983)
- Makes the upgrade section consistent with the
uninstall section by using the full path to the
uninstall script.
commit 4cadc40
Author: c <claudeaceae@icloud.com>
Date: Thu Jan 1 22:53:56 2026 -0500
Clarify uninstall script location in README (apple#982)
- Clarifies where the `uninstall-container.sh` script is located after
installation
- Updates example commands to use the full path
commit 4e78e30
Author: c <claudeaceae@icloud.com>
Date: Thu Jan 1 20:57:47 2026 -0500
Fix grammar in tutorial.md (apple#985)
## Summary
- Fixes a grammar error in the tutorial's publish section
## Details
Line 287 of `docs/tutorial.md` had "you need push images" which should
be "you need to push images".
This is a simple grammar fix to improve readability.
## Test plan
- [x] Verified the sentence now reads correctly
commit 22dfd6e
Author: Danny Canter <danny_canter@apple.com>
Date: Thu Jan 1 17:57:00 2026 -0800
CLI: Fix stop not signalling waiters (apple#972)
commit 4958cf2
Author: c <claudeaceae@icloud.com>
Date: Thu Jan 1 20:51:10 2026 -0500
Fix bash completion source path in documentation (apple#981)
- Corrects the source path for bash completion script
when not using bash-completion package.
commit 25ac79a
Author: c <claudeaceae@icloud.com>
Date: Thu Jan 1 20:50:19 2026 -0500
Fix MAC address option typo in how-to documentation (apple#980)
- Corrects the MAC address example command in the
how-to guide to use the correct `--network` flag syntax
instead of the incorrect `--mac-address` flag.
commit edadf15
Author: Raj <realrajaryan@gmail.com>
Date: Thu Jan 1 15:10:39 2026 +0530
Fix container auto-delete on rapid stop/start (apple#841)
Fixesapple#833.
Currently, when stopping and immediately restarting a container, it would fail with the error:
`“container expected to be in created state, got: shuttingDown”` and then be automatically deleted.
The `SandboxService` process waits five seconds before exiting after shutdown. During this interval, a rapid restart could reconnect to the still-terminating process in the `shuttingDown` state, triggering a state validation error.
This fix forcefully terminates the `SandboxService` process with `SIGKILL` upon container exit, instead of waiting five seconds. The bootstrap now defensively checks for and cleans up any stale services before registering new ones, preventing reconnections to processes in the `shuttingDown` state.
commit 5064b0f
Author: J Logan <john_logan@apple.com>
Date: Mon Dec 22 10:16:14 2025 -0800
Adds network IPv6 configuration. (apple#975)
- Part of work for apple#460.
- Enable set/get of IPv6 network prefix in ReservedVmnetNetwork.
- Show IPv6 prefix in `network list` full output.
- Option for setting IPv6 prefix when creating a network.
- System property for default IPv6 prefix.
## Type of Change
- [ ] Bug fix
- [x] New feature
- [ ] Breaking change
- [x] Documentation update
## Motivation and Context
See apple#460.
## Testing
- [x] Tested locally
- [ ] Added/updated tests
- [x] Added/updated docs
commit 9c239aa
Author: Volodymyr Bortniak <25820601+Bortnyak@users.noreply.github.com>
Date: Sat Dec 20 00:36:02 2025 +0100
Add support for reading env from named pipes (apple#974)
This is a fix for
[issue#956](apple#956)
`FileManager.default.contents(atPath:)` returns `nil` for named pipes
(FIFOs)
and process substitutions like `/dev/fd/XX` because:
1. It expects regular files with a known size
2. Named pipes are stream-based and block until data arrives
## Solution
Use `FileHandle(forReadingFrom:)` instead, which:
- Properly handles blocking I/O
- Works with named pipes, process substitutions, and regular files
(mentioned in the
[doc](https://developer.apple.com/documentation/foundation/filehandle))
Co-authored-by: Bortniak Volodymyr <Bortnyak@users.noreply.github.com>
commit 3c3a83c
Author: Danny Canter <danny_canter@apple.com>
Date: Thu Dec 18 16:28:44 2025 -0800
Turn on oops=panic kernel cmdline (apple#971)
commit b1b9980
Author: Michael Gathara <mikegtrm@gmail.com>
Date: Wed Dec 17 20:58:50 2025 -0600
Fix: Kubes Cluster in Container Crashing Container (IS#923) (apple#930)
- Fixes issue apple#923
- I fixed a race condition in `ConnectHandler.swift` where
an asynchronous network connection could complete
after the handler had already been removed from the
pipeline.
- This prevents the EXC_BREAKPOINT crash in
container-runtime-linux that occurred when kinc
(Kubernetes in Container) created rapid connections.
- The actual fix was inadvertently applied in apple#957, so this
PR contains only the test code.
commit 9f4efe0
Author: Saehej Kang <saehej.kang@gmail.com>
Date: Wed Dec 17 00:30:33 2025 -0800
[networks]: add prune command (apple#914)
- Closesapple#893
commit 4f88725
Author: J Logan <john_logan@apple.com>
Date: Tue Dec 16 16:34:13 2025 -0800
Use new IP/CIDR types from Containerization. (apple#957)
- Part of work for apple#460.
- With CZ release 0.17.0, the IP and CIDR address
types changed from String to IPv4Address and
CIDRv4, respectively. This PR applies the corresponding
adaptations to container.
commit 8e16bb2
Author: Salman Chishti <salmanmkc@GitHub.com>
Date: Tue Dec 16 20:14:45 2025 +0000
Upgrade GitHub Actions to latest versions (apple#959)
- Upgrade GitHub Actions to their latest versions for
improved features, bug fixes, and security updates.
Signed-off-by: Salman Muin Kayser Chishti <13schishti@gmail.com>
commit 0c7dca4
Author: Salman Chishti <salmanmkc@GitHub.com>
Date: Tue Dec 16 19:23:31 2025 +0000
Add Dependabot for GitHub Actions updates (apple#960)
## Summary
Add Dependabot configuration to automatically keep GitHub Actions up to
date.
## Changes
Adds `.github/dependabot.yml` configured to:
- Check for GitHub Actions updates weekly
- Group all action updates together for easier review
- Use `ci` prefix for commit messages
## Why
As discussed in apple#958, this helps:
- Keep actions up to date with security patches automatically
- Handle Node runtime deprecations proactively (e.g., Node 20 → Node 24)
- Reduce manual maintenance burden
## Reference
Based on the pattern used in
[swift-nio](https://github.com/apple/swift-nio/blob/main/.github/dependabot.yml).
commit 637c8f1
Author: Salman Chishti <salmanmkc@GitHub.com>
Date: Tue Dec 16 18:15:42 2025 +0000
Upgrade GitHub Actions for Node 24 compatibility (apple#958)
## Summary
Upgrade GitHub Actions to their latest versions to ensure compatibility
with Node 24, as Node 20 will reach end-of-life in April 2026.
## Changes
| Action | Old Version(s) | New Version | SHA |
|--------|---------------|-------------|-----|
| `actions/checkout` | v4 | v6 | `8e8c483` |
| `actions/download-artifact` | v4 | v7 | `37930b1` |
| `actions/upload-artifact` | v4 | v6 | `b7c566a` |
| `actions/labeler` | v5 | v6 | `634933e` |
| `actions/configure-pages` | v5 | v5 | `983d773` |
| `actions/upload-pages-artifact` | v3 | v3 | `56afc60` |
| `softprops/action-gh-release` | v2 | v2 | `a06a81a` |
## Context
Per [GitHub's
announcement](https://github.blog/changelog/2025-09-19-deprecation-of-node-20-on-github-actions-runners/),
Node 20 is being deprecated and runners will begin using Node 24 by
default starting March 4th, 2026.
### Why this matters
- **Node 20 EOL**: April 2026
- **Node 24 default**: March 4th, 2026
- **Action**: Update to latest action versions that support Node 24
### Security
All actions are now **pinned to commit SHAs** instead of mutable version
tags. This provides:
- Protection against tag hijacking attacks
- Immutable, reproducible builds
- Version comments for readability
### Automated Updates
A follow-up PR (apple#960) adds Dependabot configuration to automatically
keep these actions updated with new SHA-pinned versions.
### Testing
These changes only affect CI/CD workflow configurations and should not
impact application functionality. The workflows should be tested by
running them on a branch before merging.
Signed-off-by: Salman Muin Kayser Chishti <13schishti@gmail.com>
commit c22f128
Author: karen heckel <karen.heckel@utexas.edu>
Date: Mon Dec 15 21:16:55 2025 -0800
Feat: customize console output with env variable (apple#952)
Fixesapple#915
Added a new feature to support the passing of buildkit colors for
customizing console output.
commit 9b7cfd8
Author: Saehej Kang <saehej.kang@gmail.com>
Date: Mon Dec 15 17:52:00 2025 -0800
[images]: refactor prune command (apple#941)
- Updates to `image prune` for consistency with how
other `prune` commands are done. Added missing
test cases as well for the command
- Relates to the discussion from apple#914
commit 7d30720
Author: Danny Canter <danny_canter@apple.com>
Date: Thu Dec 11 05:36:15 2025 -0800
CLI: Fix -it not being able to pipe stdout (apple#951)
Fixesapple#949
Typically if one fd is a tty, it's common for all 3 of stdio to be the
same, but that is not always the case. In our case we were using our
Terminal type from Containerization to comb through err/out/in and give
us a type backed by one of the 3 if -t was supplied. It happens that
stderr is the first we check, so our Terminal() is backed by fd 2. This
change modifies things so that we always initialize our Terminal if
asked for with fd 0, and out/err are backed by their corresponding
correct fd number.
## Type of Change
- [x] Bug fix
- [ ] New feature
- [ ] Breaking change
- [ ] Documentation update
## Testing
- [x] Tested locally
- [ ] Added/updated tests
- [ ] Added/updated docs
commit a2901e0
Author: wangxiaolei <fatelei@gmail.com>
Date: Wed Dec 10 10:04:40 2025 +0800
feat: implement version sub command (apple#911)
- closesapple#383
- implement version sub command, give more info
---------
Co-authored-by: fatelei <fatelei@fateleis-MacBook-Pro.local>
commit 0cde1ef
Author: Danny Canter <danny_canter@apple.com>
Date: Tue Dec 9 13:24:45 2025 -0800
Deps: Bump Containerization to 0.16.2 (apple#947)
Closesapple#928
Has a cgroup fix when stopping certain containers
commit 3896055
Author: Dmitry Kovba <dkovba@apple.com>
Date: Tue Dec 9 12:32:28 2025 -0800
Lowercase error messages (apple#945)
## Type of Change
- [x] Bug fix
- [ ] New feature
- [ ] Breaking change
- [ ] Documentation update
## Motivation and Context
For consistency, all error messages are lowercased.
## Testing
- [ ] Tested locally
- [ ] Added/updated tests
- [ ] Added/updated docs
---------
Co-authored-by: J Logan <sgtbakerrahulnet@yahoo.com>
commit 0733a81
Author: Saehej Kang <saehej.kang@gmail.com>
Date: Tue Dec 9 10:54:37 2025 -0800
[volumes]: refactor prune command (apple#940)
- Refactor the `volume prune` command to follow a client-side approach.
The `volumeDiskUsage` is calculated in the service file, so it made
sense to leave that there.
- Relates to the discussion from apple#914
commit 42528e6
Author: Kathryn Baldauf <k_baldauf@apple.com>
Date: Tue Dec 9 10:42:27 2025 -0800
Update CONTRIBUTORS to MAINTAINERS and point at containerization (apple#942)
## Type of Change
- [x] Documentation update
## Motivation and Context
See apple/containerization#435 for more
information on this change.
commit a64bd77
Author: J Logan <john_logan@apple.com>
Date: Tue Dec 9 14:35:34 2025 -0300
Fix broken image integration tests. (apple#944)
- Fixesapple#943.
- Use images other than alpine:3.20 for image concurrency test so as not
to interfere with tests using that image.
- Rename test files to match suite names.
commit ab92f39
Author: TTtie <me@tttie.cz>
Date: Mon Dec 8 18:17:10 2025 +0100
fix(TerminalProgress): make the progress bar respect locale-specific decimal separator (apple#936)
- The `ProgressBar#adjustFormattedSize` function currently expects a
decimal dot when adding the additional ".0" to the size. This, however,
breaks when a region with a non-dot decimal separator is used.
commit 420be74
Author: J Logan <john_logan@apple.com>
Date: Mon Dec 8 03:00:02 2025 -0300
Data integrity: bump to cz 0.16.1, adjust sync mode. (apple#939)
- 0.16.1 changes an ext4 superblock setting that might have been causing
problems.
- apple#877 fixed an issue where the cache and sync settings for block
filesystems weren't being passed down to the VZ virtual machine
configuration. The default sync value getting passed down is `full`,
which reduces I/O performance. Relax this to use `fsync` for now.
## Type of Change
- [*] Bug fix
- [ ] New feature
- [ ] Breaking change
- [ ] Documentation update
## Motivation and Context
May address problems reported in apple#877.
## Testing
- [x] Tested locally
- [ ] Added/updated tests
- [ ] Added/updated docs
commit f7bcb68
Author: Santosh Bhavani <santosh.bhavani@live.com>
Date: Sun Dec 7 10:56:50 2025 -0800
Add --max-concurrent-downloads flag for parallel layer downloads (apple#716)
Adds `--max-concurrent-downloads` flag to `container image pull` for
configurable concurrent layer downloads.
Fixesapple#715
Depends on apple/containerization#311
**Usage**:
```bash
container image pull nginx:latest --max-concurrent-downloads 6
```
**Changes**:
- Add CLI flag (default: 3)
- Thread parameter through XPC stack
- Update to use forked containerization with configurable concurrency
**Performance**: ~1.2-1.3x faster pulls for multi-layer images with
higher concurrency
**Tests**: Included standalone tests verify concurrency behavior and
parameter flow
---------
Co-authored-by: Claude <noreply@anthropic.com>
Mcrich23 added a commit to Mcrich23/container that referenced this pull request Jan 22, 2026
commit 69445b9
Author: jwhur <57657645+JaewonHur@users.noreply.github.com>
Date: Mon Jan 19 13:09:34 2026 -0800
Throw error when starting a container with invalid virtiofs source (apple#1051)
Run = Create + Start
1) Mount source points to a valid directory
- Run and Create + Start both correctly create the container with mount.
2) Mount source points to a file
- Run fails bootstrapping the container, thus container not created.
- Create creates the container, but Start fails bootstrapping, removing
the container. (Thus, both are the same.)
3) Mount source deleted or replaced to file after container created
- Start throw errors but do not delete the container.
commit 08f48d9
Author: Danny Canter <danny_canter@apple.com>
Date: Fri Jan 16 21:48:58 2026 -0800
ContainerSvc: Handle unexpected sandbox svc exits (apple#1065)
Closesapple#1050
If the sandbox svc exits out of band of the usual stop (or regular exit)
case the container svc's state is not properly updated for the
container. This was due to the cleanup steps involving trying to send
the shutdown rpc which cannot succeed as the sandbox svc does not exist
to service it.
To handle this, let's treat shutdown not returning successfully as
non-fatal (as this is mostly best effort), log an error and continue the
state cleanup.
commit b928e3f
Author: Amir Alperin <me@remotecpp.dev>
Date: Sat Jan 17 07:43:48 2026 +0200
fix: performance warning should not output ANSI codes if stderr redirected (apple#1059)
commit 744e7f7
Author: J Logan <john_logan@apple.com>
Date: Fri Jan 16 16:26:13 2026 -0800
Update for containerization 0.21.0. (apple#1056)
- Update image load and build to handle rejected paths during tar
extraction. For the image load command there is now a `--force` function
that fails extractions with rejected paths when false, and just warns
about the rejected paths when true.
- Update `container stats` for statistics API properties now all being
optional.
## Type of Change
- [x] Bug fix
- [ ] New feature
- [ ] Breaking change
- [x] Documentation update
## Motivation and Context
See above
## Testing
- [x] Tested locally
- [x] Added/updated tests
- [x] Added/updated docs
commit b1577d8
Author: J Logan <john_logan@apple.com>
Date: Fri Jan 16 15:50:47 2026 -0800
Adds opt-in pre-commit hook for format and header checks. (apple#1062)
- Closesapple#639.
- Adds swift format configuration that removes lint checks so we can use
`swift lint` to perform format-only tests.
- Adds `check` target that invokes format and header checks.
- Adds pre-commit script that runs `make check`.
- Adds `pre-commit` target that installs the check script as a
pre-commit hook.
## Type of Change
- [ ] Bug fix
- [x] New feature
- [ ] Breaking change
- [x] Documentation update
## Motivation and Context
Avoids wasting time and commit rewrites.
## Testing
- [x] Tested locally
- [ ] Added/updated tests
- [x] Added/updated docs
commit 3cf2c6a
Author: J Logan <john_logan@apple.com>
Date: Fri Jan 16 13:41:32 2026 -0800
Fix unstable integration tests. (apple#1060)
- TestCLIRunCommand now run so many tests concurrently that the API
server gets swamped and tests randomly time out.
- The parallelism options on `swift test` only work for XCTest, not
swift-testing.
- Work around this while retaining some parallelism (good for stress
testing) by breaking the tests into two suites.
commit 8897fcc
Author: Manu Schiller <56154253+manuschillerdev@users.noreply.github.com>
Date: Wed Jan 14 04:39:08 2026 +0100
fix: use pax instead of tar for pkg payload extraction (apple#1038)
- It is common to have `gnu-tar` alongside other GNU tools
installed and aliased for compatibility reasons. However, this
breaks the current make build.
- Use BSD-only binaries (no GNU equivalents that are
commonly aliased), making the Makefile more portable.
commit dbec1db
Author: Ronit Sabhaya <ronitsabhaya75@gmail.com>
Date: Mon Jan 12 20:34:25 2026 -0600
Add support for aarch64 architecture alias (apple#1040)
- Adds `aarch64` as an alias for `arm64` in the `Arch` enum. This
addresses the maintainer's request to support this common architecture
name, ensuring consistency with `x86_64` normalization and preventing
failures for users expecting `aarch64` support.
commit 837aa5e
Author: jwhur <57657645+JaewonHur@users.noreply.github.com>
Date: Mon Jan 12 14:36:10 2026 -0800
Fix the FS error when using Virtualization (apple#1041)
- Fixesapple#614.
- Use VZ cached mode instead of auto.
Signed-off-by: jwhur <jaewon_hur@apple.com>
commit e465b10
Author: 박성근 <117553364+ParkSeongGeun@users.noreply.github.com>
Date: Tue Jan 13 03:30:51 2026 +0900
Fix relative path resolution in entrypoint (apple#987)
- Fixesapple#962.
- Adds test to exercise apple/containerization#473.
- Updates containerization to 0.20.1.
Signed-off-by: ParkSeongGeun <phd0801@naver.com>
commit aa77928
Author: Ronit Sabhaya <ronitsabhaya75@gmail.com>
Date: Mon Jan 12 12:04:46 2026 -0600
Fix: Support x86_64 architecture alias to prevent silent pull failure… (apple#1036)
- Adds architecture name normalization to accept
`x86_64` and `x86-64` as aliases for `amd64`.
commit dc4682b
Author: Amir Alperin <me@remotecpp.dev>
Date: Fri Jan 9 21:10:53 2026 +0200
fix: extract hostname from FQDN (apple#1011) (apple#1017)
- Set the container hostname to the first DNS
label derived from the container id, strip everything
after the first dot.
- Fixesapple#1011.
commit 4af1cc0
Author: Ronit Sabhaya <ronitsabhaya75@gmail.com>
Date: Thu Jan 8 21:27:43 2026 -0600
fix: improve error message when binding to privileged ports (fixesapple#978) (apple#1031)
- The container fails to start with a generic "permission denied"
error when attempting to publish privileged ports (ports below
1024) without root privileges. This provides a confusing user
experience as the error doesn't explain why permission was
denied.
commit 21facf0
Author: J Logan <john_logan@apple.com>
Date: Thu Jan 8 17:02:22 2026 -0800
Add instructions for using locally built init filesystem. (apple#1032)
- Closesapple#1030.
commit b671690
Author: Danny Canter <danny_canter@apple.com>
Date: Wed Jan 7 21:01:10 2026 -0800
ProgressBar: Various fixes (apple#1025)
There's a couple things I don't think are intuitive about this.
1. Because of the internal task, render() can still be called even after
finish() completes. Ideally async defers are supported and we could just
await the final render completing after cancelling the task and setting
.finished, but alas. To fix this we can just lock across the methods for
now.
2. We always clear the screen in the destructor, even if we don't use
the
progress bar. I don't think we should honestly do anything in the
destructor.
Feels a programmer error not to defer { bar.finish() } or call it
somewhere.
3. Our spaces based line clearing. Use the ansi escape sequence for
clearing line;
I think our calculations were slightly off and it would leave trailing
output ( "s]" )
in some cases.
4. Shrinking the window until the output is smaller than the terminal
window (and vice
versa) is wonky on various term emulators. Truthfully, this is just a
hard problem,
but we can truncate our output and still provide some useful info.
This fixes some single line output (cat /etc/hostname etc.) getting
cleared in our atexit handler, as well as the need for the usleep.
commit 98410fd
Author: J Logan <john_logan@apple.com>
Date: Wed Jan 7 18:23:31 2026 -0800
Adds IPv6 port forwarding. (apple#1029)
- Closesapple#1006.
commit 9d06475
Author: Saehej Kang <saehej.kang@gmail.com>
Date: Wed Jan 7 16:53:33 2026 -0800
[container]: add startedDate field (apple#1018)
- Closesapple#302.
- Closesapple#336 (obsoletes this PR).
commit db8932a
Author: J Logan <john_logan@apple.com>
Date: Wed Jan 7 15:35:35 2026 -0800
Resolve IPv6 address queries for container names. (apple#1016)
- Closesapple#1005.
- Adapt everything to use MACAddress type from containerization 0.20.0.
- Allocate MAC addresses for every container so that we have
deterministic IPv6 link local addresses.
- Add AAAA handling to ContainerDNSHandler.
- NOTE: Only works on Tahoe. On Sequoia, we don't have a good way to set
or determine the IPv6 network prefix when networks are created, so we
can't infer the IPv6 link local addresses for AAAA responses and we
instead return `NODATA`.
commit 5d6c750
Author: Danny Canter <danny_canter@apple.com>
Date: Wed Jan 7 14:48:58 2026 -0800
CLI: Add read-only flag to run/create (apple#999)
Closesapple#990
Sets the rootfs for a container to read-only.
commit aac2457
Author: Danny Canter <danny_canter@apple.com>
Date: Wed Jan 7 13:46:26 2026 -0800
Tests: Fix relative path mount tests (apple#1028)
The tests are run in parallel on CI, and were split into three tests.
They change the cwd, so it's kind of a gamble whether some of them pass.
This just moves all the logic into one test mostly.
commit 9cd5397
Author: J Logan <john_logan@apple.com>
Date: Wed Jan 7 10:35:19 2026 -0800
Update to containerization 0.20.0. (apple#1027)
- Use MACAddress for Attachment and CZ interfaces.
- Move data validation closer to API surface.
commit 356c8d2
Author: J Logan <john_logan@apple.com>
Date: Tue Jan 6 08:27:14 2026 -0800
Reorganize client libraries. (apple#1020)
- Closesapple#461.
- Extract core types into ContainerResources target.
- Extract ContainerNetworkServiceClient from ContainerNetworkService.
- Relocate sandbox client from ContainerClient to
ContainerSandboxServiceClient.
- Relocate ContainerClient to ContainerAPIServiceClient.
- Common structure from services and clients under Source/Services.
Updated project hierarchy:
```
Sources/CAuditToken - audit token access wrapper
Sources/CLI - CLI executable
Sources/ContainerBuild - builder
Sources/ContainerCommands - CLI command implementations
Sources/ContainerLog - logging helpers
Sources/ContainerPersistence - persistent data and system property helpers
Sources/ContainerPlugin - plugin system
Sources/ContainerResource - resource (container, image, volume, network) types
Sources/ContainerVersion - version helpers
Sources/ContainerXPC - XPC helpers
Sources/CVersion - injected project version
Sources/DNSServer - container DNS resolver
Sources/Helpers - service executables
Sources/Services/*/Client - service clients
Sources/Services/*/Server - service implementations
Sources/SocketForwarder - port forwarding
Sources/TerminalProgress - progress bar
```
## Type of Change
- [ ] Bug fix
- [ ] New feature
- [x] Breaking change
- [ ] Documentation update
## Motivation and Context
The ContainerClient library was a bit of a grab bag. This refactor
applies a more sensible project and library structure for resource data
types, services, and clients.
## Testing
- [x] Tested locally
- [x] Added/updated tests
- [ ] Added/updated docs
commit 8c439cd
Author: Danny Canter <danny_canter@apple.com>
Date: Mon Jan 5 13:50:57 2026 -0800
makefile: Add cli target (apple#1022)
Often times I'll be making a change that only touches the cli and I
don't feel like sitting through the potential song and dance of the
other components building/installing.
commit d6f052d
Author: Kathryn Baldauf <k_baldauf@apple.com>
Date: Mon Jan 5 13:09:34 2026 -0800
Update license header on all files to include the current year (apple#1024)
## Motivation and Context
Now that we're in 2026, we need to update the license headers on all the
files. Unfortunately, Hawkeye doesn't have an attribute for the current
year to help us avoid this in the future. Instead, I had to work around
this by doing the following:
1. Update licenserc.toml with:
```
[properties]
... (other properties)
currentYear = "2026"
```
2. Update scripts/license-header.txt with
```
Copyright ©{{ " " }}{%- set created = attrs.git_file_created_year or
attrs.disk_file_created_year -%}{%- set modified = props["currentYear"]
-%}{%- if created != modified -%} {{created}}-{{modified}}{%- else
-%}{{created}}{%- endif -%}{{ " " }}{{ props["copyrightOwner"] }}.
```
Then I removed these two changes before committing. After this PR is
merged, all files will have recently had git updates, so the existing
code for setting the modified year should work as intended.
Signed-off-by: Kathryn Baldauf <k_baldauf@apple.com>
commit 20dc0bc
Author: Danny Canter <danny_canter@apple.com>
Date: Sun Jan 4 11:11:09 2026 -0800
Parser: Support relative paths for --volume (apple#1013)
commit 028e7e1
Author: Danny Canter <danny_canter@apple.com>
Date: Sun Jan 4 10:52:46 2026 -0800
Deps: Bump Containerization to 0.19.0 (apple#1015)
Has read-only rootfs support.
commit 020949e
Author: Danny Canter <danny_canter@apple.com>
Date: Sun Jan 4 10:51:20 2026 -0800
CLI: Small fixups for implicit envvars (apple#1014)
We should only inherit from the host if there's no =. Additionally
document the flag a little more to show that we can inherit from the
host.
commit df368b7
Author: Amir Alperin <alperin.amir@gmail.com>
Date: Sun Jan 4 20:49:22 2026 +0200
Fix port validation to allow same port for different protocols (apple#992) (apple#1000)
- Fixes: apple#992
- Port validation previously rejected valid configurations
when the same port number was used for different
protocols (TCP and UDP). For example:
`-p 1024:1024/udp -p 1024:1024/tcp`
Although this is a valid and common use case, the
validation logic treated it as a conflict.
To fix this, I updated the validation key to include the protocol name.
The validation now checks for overlapping port numbers only within the
same protocol, rather than across all protocols.
This change enables binding the same port number for both TCP and UDP,
aligning the validation behavior with real-world networking
requirements.
## Testing
- [x] Tested locally
- [x] Added/updated tests
- [ ] Added/updated docs
commit cf64614
Author: J Logan <john_logan@apple.com>
Date: Fri Jan 2 14:10:48 2026 -0800
Update OSS header in Package.swift. (apple#1010)
commit 375ce16
Author: J Logan <john_logan@apple.com>
Date: Fri Jan 2 12:09:12 2026 -0800
Fix OSS header dates that break CI checks. (apple#1009)
commit 580d853
Author: c <claudeaceae@icloud.com>
Date: Fri Jan 2 00:19:57 2026 -0500
Use full path for uninstall script in upgrade instructions (apple#983)
- Makes the upgrade section consistent with the
uninstall section by using the full path to the
uninstall script.
commit 4cadc40
Author: c <claudeaceae@icloud.com>
Date: Thu Jan 1 22:53:56 2026 -0500
Clarify uninstall script location in README (apple#982)
- Clarifies where the `uninstall-container.sh` script is located after
installation
- Updates example commands to use the full path
commit 4e78e30
Author: c <claudeaceae@icloud.com>
Date: Thu Jan 1 20:57:47 2026 -0500
Fix grammar in tutorial.md (apple#985)
## Summary
- Fixes a grammar error in the tutorial's publish section
## Details
Line 287 of `docs/tutorial.md` had "you need push images" which should
be "you need to push images".
This is a simple grammar fix to improve readability.
## Test plan
- [x] Verified the sentence now reads correctly
commit 22dfd6e
Author: Danny Canter <danny_canter@apple.com>
Date: Thu Jan 1 17:57:00 2026 -0800
CLI: Fix stop not signalling waiters (apple#972)
commit 4958cf2
Author: c <claudeaceae@icloud.com>
Date: Thu Jan 1 20:51:10 2026 -0500
Fix bash completion source path in documentation (apple#981)
- Corrects the source path for bash completion script
when not using bash-completion package.
commit 25ac79a
Author: c <claudeaceae@icloud.com>
Date: Thu Jan 1 20:50:19 2026 -0500
Fix MAC address option typo in how-to documentation (apple#980)
- Corrects the MAC address example command in the
how-to guide to use the correct `--network` flag syntax
instead of the incorrect `--mac-address` flag.
commit edadf15
Author: Raj <realrajaryan@gmail.com>
Date: Thu Jan 1 15:10:39 2026 +0530
Fix container auto-delete on rapid stop/start (apple#841)
Fixesapple#833.
Currently, when stopping and immediately restarting a container, it would fail with the error:
`“container expected to be in created state, got: shuttingDown”` and then be automatically deleted.
The `SandboxService` process waits five seconds before exiting after shutdown. During this interval, a rapid restart could reconnect to the still-terminating process in the `shuttingDown` state, triggering a state validation error.
This fix forcefully terminates the `SandboxService` process with `SIGKILL` upon container exit, instead of waiting five seconds. The bootstrap now defensively checks for and cleans up any stale services before registering new ones, preventing reconnections to processes in the `shuttingDown` state.
commit 5064b0f
Author: J Logan <john_logan@apple.com>
Date: Mon Dec 22 10:16:14 2025 -0800
Adds network IPv6 configuration. (apple#975)
- Part of work for apple#460.
- Enable set/get of IPv6 network prefix in ReservedVmnetNetwork.
- Show IPv6 prefix in `network list` full output.
- Option for setting IPv6 prefix when creating a network.
- System property for default IPv6 prefix.
## Type of Change
- [ ] Bug fix
- [x] New feature
- [ ] Breaking change
- [x] Documentation update
## Motivation and Context
See apple#460.
## Testing
- [x] Tested locally
- [ ] Added/updated tests
- [x] Added/updated docs
commit 9c239aa
Author: Volodymyr Bortniak <25820601+Bortnyak@users.noreply.github.com>
Date: Sat Dec 20 00:36:02 2025 +0100
Add support for reading env from named pipes (apple#974)
This is a fix for
[issue#956](apple#956)
`FileManager.default.contents(atPath:)` returns `nil` for named pipes
(FIFOs)
and process substitutions like `/dev/fd/XX` because:
1. It expects regular files with a known size
2. Named pipes are stream-based and block until data arrives
## Solution
Use `FileHandle(forReadingFrom:)` instead, which:
- Properly handles blocking I/O
- Works with named pipes, process substitutions, and regular files
(mentioned in the
[doc](https://developer.apple.com/documentation/foundation/filehandle))
Co-authored-by: Bortniak Volodymyr <Bortnyak@users.noreply.github.com>
commit 3c3a83c
Author: Danny Canter <danny_canter@apple.com>
Date: Thu Dec 18 16:28:44 2025 -0800
Turn on oops=panic kernel cmdline (apple#971)
commit b1b9980
Author: Michael Gathara <mikegtrm@gmail.com>
Date: Wed Dec 17 20:58:50 2025 -0600
Fix: Kubes Cluster in Container Crashing Container (IS#923) (apple#930)
- Fixes issue apple#923
- I fixed a race condition in `ConnectHandler.swift` where
an asynchronous network connection could complete
after the handler had already been removed from the
pipeline.
- This prevents the EXC_BREAKPOINT crash in
container-runtime-linux that occurred when kinc
(Kubernetes in Container) created rapid connections.
- The actual fix was inadvertently applied in apple#957, so this
PR contains only the test code.
commit 9f4efe0
Author: Saehej Kang <saehej.kang@gmail.com>
Date: Wed Dec 17 00:30:33 2025 -0800
[networks]: add prune command (apple#914)
- Closesapple#893
commit 4f88725
Author: J Logan <john_logan@apple.com>
Date: Tue Dec 16 16:34:13 2025 -0800
Use new IP/CIDR types from Containerization. (apple#957)
- Part of work for apple#460.
- With CZ release 0.17.0, the IP and CIDR address
types changed from String to IPv4Address and
CIDRv4, respectively. This PR applies the corresponding
adaptations to container.
commit 8e16bb2
Author: Salman Chishti <salmanmkc@GitHub.com>
Date: Tue Dec 16 20:14:45 2025 +0000
Upgrade GitHub Actions to latest versions (apple#959)
- Upgrade GitHub Actions to their latest versions for
improved features, bug fixes, and security updates.
Signed-off-by: Salman Muin Kayser Chishti <13schishti@gmail.com>
commit 0c7dca4
Author: Salman Chishti <salmanmkc@GitHub.com>
Date: Tue Dec 16 19:23:31 2025 +0000
Add Dependabot for GitHub Actions updates (apple#960)
## Summary
Add Dependabot configuration to automatically keep GitHub Actions up to
date.
## Changes
Adds `.github/dependabot.yml` configured to:
- Check for GitHub Actions updates weekly
- Group all action updates together for easier review
- Use `ci` prefix for commit messages
## Why
As discussed in apple#958, this helps:
- Keep actions up to date with security patches automatically
- Handle Node runtime deprecations proactively (e.g., Node 20 → Node 24)
- Reduce manual maintenance burden
## Reference
Based on the pattern used in
[swift-nio](https://github.com/apple/swift-nio/blob/main/.github/dependabot.yml).
commit 637c8f1
Author: Salman Chishti <salmanmkc@GitHub.com>
Date: Tue Dec 16 18:15:42 2025 +0000
Upgrade GitHub Actions for Node 24 compatibility (apple#958)
## Summary
Upgrade GitHub Actions to their latest versions to ensure compatibility
with Node 24, as Node 20 will reach end-of-life in April 2026.
## Changes
| Action | Old Version(s) | New Version | SHA |
|--------|---------------|-------------|-----|
| `actions/checkout` | v4 | v6 | `8e8c483` |
| `actions/download-artifact` | v4 | v7 | `37930b1` |
| `actions/upload-artifact` | v4 | v6 | `b7c566a` |
| `actions/labeler` | v5 | v6 | `634933e` |
| `actions/configure-pages` | v5 | v5 | `983d773` |
| `actions/upload-pages-artifact` | v3 | v3 | `56afc60` |
| `softprops/action-gh-release` | v2 | v2 | `a06a81a` |
## Context
Per [GitHub's
announcement](https://github.blog/changelog/2025-09-19-deprecation-of-node-20-on-github-actions-runners/),
Node 20 is being deprecated and runners will begin using Node 24 by
default starting March 4th, 2026.
### Why this matters
- **Node 20 EOL**: April 2026
- **Node 24 default**: March 4th, 2026
- **Action**: Update to latest action versions that support Node 24
### Security
All actions are now **pinned to commit SHAs** instead of mutable version
tags. This provides:
- Protection against tag hijacking attacks
- Immutable, reproducible builds
- Version comments for readability
### Automated Updates
A follow-up PR (apple#960) adds Dependabot configuration to automatically
keep these actions updated with new SHA-pinned versions.
### Testing
These changes only affect CI/CD workflow configurations and should not
impact application functionality. The workflows should be tested by
running them on a branch before merging.
Signed-off-by: Salman Muin Kayser Chishti <13schishti@gmail.com>
commit c22f128
Author: karen heckel <karen.heckel@utexas.edu>
Date: Mon Dec 15 21:16:55 2025 -0800
Feat: customize console output with env variable (apple#952)
Fixesapple#915
Added a new feature to support the passing of buildkit colors for
customizing console output.
commit 9b7cfd8
Author: Saehej Kang <saehej.kang@gmail.com>
Date: Mon Dec 15 17:52:00 2025 -0800
[images]: refactor prune command (apple#941)
- Updates to `image prune` for consistency with how
other `prune` commands are done. Added missing
test cases as well for the command
- Relates to the discussion from apple#914
commit 7d30720
Author: Danny Canter <danny_canter@apple.com>
Date: Thu Dec 11 05:36:15 2025 -0800
CLI: Fix -it not being able to pipe stdout (apple#951)
Fixesapple#949
Typically if one fd is a tty, it's common for all 3 of stdio to be the
same, but that is not always the case. In our case we were using our
Terminal type from Containerization to comb through err/out/in and give
us a type backed by one of the 3 if -t was supplied. It happens that
stderr is the first we check, so our Terminal() is backed by fd 2. This
change modifies things so that we always initialize our Terminal if
asked for with fd 0, and out/err are backed by their corresponding
correct fd number.
## Type of Change
- [x] Bug fix
- [ ] New feature
- [ ] Breaking change
- [ ] Documentation update
## Testing
- [x] Tested locally
- [ ] Added/updated tests
- [ ] Added/updated docs
commit a2901e0
Author: wangxiaolei <fatelei@gmail.com>
Date: Wed Dec 10 10:04:40 2025 +0800
feat: implement version sub command (apple#911)
- closesapple#383
- implement version sub command, give more info
---------
Co-authored-by: fatelei <fatelei@fateleis-MacBook-Pro.local>
commit 0cde1ef
Author: Danny Canter <danny_canter@apple.com>
Date: Tue Dec 9 13:24:45 2025 -0800
Deps: Bump Containerization to 0.16.2 (apple#947)
Closesapple#928
Has a cgroup fix when stopping certain containers
commit 3896055
Author: Dmitry Kovba <dkovba@apple.com>
Date: Tue Dec 9 12:32:28 2025 -0800
Lowercase error messages (apple#945)
## Type of Change
- [x] Bug fix
- [ ] New feature
- [ ] Breaking change
- [ ] Documentation update
## Motivation and Context
For consistency, all error messages are lowercased.
## Testing
- [ ] Tested locally
- [ ] Added/updated tests
- [ ] Added/updated docs
---------
Co-authored-by: J Logan <sgtbakerrahulnet@yahoo.com>
commit 0733a81
Author: Saehej Kang <saehej.kang@gmail.com>
Date: Tue Dec 9 10:54:37 2025 -0800
[volumes]: refactor prune command (apple#940)
- Refactor the `volume prune` command to follow a client-side approach.
The `volumeDiskUsage` is calculated in the service file, so it made
sense to leave that there.
- Relates to the discussion from apple#914
commit 42528e6
Author: Kathryn Baldauf <k_baldauf@apple.com>
Date: Tue Dec 9 10:42:27 2025 -0800
Update CONTRIBUTORS to MAINTAINERS and point at containerization (apple#942)
## Type of Change
- [x] Documentation update
## Motivation and Context
See apple/containerization#435 for more
information on this change.
commit a64bd77
Author: J Logan <john_logan@apple.com>
Date: Tue Dec 9 14:35:34 2025 -0300
Fix broken image integration tests. (apple#944)
- Fixesapple#943.
- Use images other than alpine:3.20 for image concurrency test so as not
to interfere with tests using that image.
- Rename test files to match suite names.
commit ab92f39
Author: TTtie <me@tttie.cz>
Date: Mon Dec 8 18:17:10 2025 +0100
fix(TerminalProgress): make the progress bar respect locale-specific decimal separator (apple#936)
- The `ProgressBar#adjustFormattedSize` function currently expects a
decimal dot when adding the additional ".0" to the size. This, however,
breaks when a region with a non-dot decimal separator is used.
commit 420be74
Author: J Logan <john_logan@apple.com>
Date: Mon Dec 8 03:00:02 2025 -0300
Data integrity: bump to cz 0.16.1, adjust sync mode. (apple#939)
- 0.16.1 changes an ext4 superblock setting that might have been causing
problems.
- apple#877 fixed an issue where the cache and sync settings for block
filesystems weren't being passed down to the VZ virtual machine
configuration. The default sync value getting passed down is `full`,
which reduces I/O performance. Relax this to use `fsync` for now.
## Type of Change
- [*] Bug fix
- [ ] New feature
- [ ] Breaking change
- [ ] Documentation update
## Motivation and Context
May address problems reported in apple#877.
## Testing
- [x] Tested locally
- [ ] Added/updated tests
- [ ] Added/updated docs
commit f7bcb68
Author: Santosh Bhavani <santosh.bhavani@live.com>
Date: Sun Dec 7 10:56:50 2025 -0800
Add --max-concurrent-downloads flag for parallel layer downloads (apple#716)
Adds `--max-concurrent-downloads` flag to `container image pull` for
configurable concurrent layer downloads.
Fixesapple#715
Depends on apple/containerization#311
**Usage**:
```bash
container image pull nginx:latest --max-concurrent-downloads 6
```
**Changes**:
- Add CLI flag (default: 3)
- Thread parameter through XPC stack
- Update to use forked containerization with configurable concurrency
**Performance**: ~1.2-1.3x faster pulls for multi-layer images with
higher concurrency
**Tests**: Included standalone tests verify concurrency behavior and
parameter flow
---------
Co-authored-by: Claude <noreply@anthropic.com>
Mcrich23 added a commit to Mcrich23/container that referenced this pull request Jan 22, 2026
commit 69445b9
Author: jwhur <57657645+JaewonHur@users.noreply.github.com>
Date: Mon Jan 19 13:09:34 2026 -0800
Throw error when starting a container with invalid virtiofs source (apple#1051)
Run = Create + Start
1) Mount source points to a valid directory
- Run and Create + Start both correctly create the container with mount.
2) Mount source points to a file
- Run fails bootstrapping the container, thus container not created.
- Create creates the container, but Start fails bootstrapping, removing
the container. (Thus, both are the same.)
3) Mount source deleted or replaced to file after container created
- Start throw errors but do not delete the container.
commit 08f48d9
Author: Danny Canter <danny_canter@apple.com>
Date: Fri Jan 16 21:48:58 2026 -0800
ContainerSvc: Handle unexpected sandbox svc exits (apple#1065)
Closesapple#1050
If the sandbox svc exits out of band of the usual stop (or regular exit)
case the container svc's state is not properly updated for the
container. This was due to the cleanup steps involving trying to send
the shutdown rpc which cannot succeed as the sandbox svc does not exist
to service it.
To handle this, let's treat shutdown not returning successfully as
non-fatal (as this is mostly best effort), log an error and continue the
state cleanup.
commit b928e3f
Author: Amir Alperin <me@remotecpp.dev>
Date: Sat Jan 17 07:43:48 2026 +0200
fix: performance warning should not output ANSI codes if stderr redirected (apple#1059)
commit 744e7f7
Author: J Logan <john_logan@apple.com>
Date: Fri Jan 16 16:26:13 2026 -0800
Update for containerization 0.21.0. (apple#1056)
- Update image load and build to handle rejected paths during tar
extraction. For the image load command there is now a `--force` function
that fails extractions with rejected paths when false, and just warns
about the rejected paths when true.
- Update `container stats` for statistics API properties now all being
optional.
## Type of Change
- [x] Bug fix
- [ ] New feature
- [ ] Breaking change
- [x] Documentation update
## Motivation and Context
See above
## Testing
- [x] Tested locally
- [x] Added/updated tests
- [x] Added/updated docs
commit b1577d8
Author: J Logan <john_logan@apple.com>
Date: Fri Jan 16 15:50:47 2026 -0800
Adds opt-in pre-commit hook for format and header checks. (apple#1062)
- Closesapple#639.
- Adds swift format configuration that removes lint checks so we can use
`swift lint` to perform format-only tests.
- Adds `check` target that invokes format and header checks.
- Adds pre-commit script that runs `make check`.
- Adds `pre-commit` target that installs the check script as a
pre-commit hook.
## Type of Change
- [ ] Bug fix
- [x] New feature
- [ ] Breaking change
- [x] Documentation update
## Motivation and Context
Avoids wasting time and commit rewrites.
## Testing
- [x] Tested locally
- [ ] Added/updated tests
- [x] Added/updated docs
commit 3cf2c6a
Author: J Logan <john_logan@apple.com>
Date: Fri Jan 16 13:41:32 2026 -0800
Fix unstable integration tests. (apple#1060)
- TestCLIRunCommand now run so many tests concurrently that the API
server gets swamped and tests randomly time out.
- The parallelism options on `swift test` only work for XCTest, not
swift-testing.
- Work around this while retaining some parallelism (good for stress
testing) by breaking the tests into two suites.
commit 8897fcc
Author: Manu Schiller <56154253+manuschillerdev@users.noreply.github.com>
Date: Wed Jan 14 04:39:08 2026 +0100
fix: use pax instead of tar for pkg payload extraction (apple#1038)
- It is common to have `gnu-tar` alongside other GNU tools
installed and aliased for compatibility reasons. However, this
breaks the current make build.
- Use BSD-only binaries (no GNU equivalents that are
commonly aliased), making the Makefile more portable.
commit dbec1db
Author: Ronit Sabhaya <ronitsabhaya75@gmail.com>
Date: Mon Jan 12 20:34:25 2026 -0600
Add support for aarch64 architecture alias (apple#1040)
- Adds `aarch64` as an alias for `arm64` in the `Arch` enum. This
addresses the maintainer's request to support this common architecture
name, ensuring consistency with `x86_64` normalization and preventing
failures for users expecting `aarch64` support.
commit 837aa5e
Author: jwhur <57657645+JaewonHur@users.noreply.github.com>
Date: Mon Jan 12 14:36:10 2026 -0800
Fix the FS error when using Virtualization (apple#1041)
- Fixesapple#614.
- Use VZ cached mode instead of auto.
Signed-off-by: jwhur <jaewon_hur@apple.com>
commit e465b10
Author: 박성근 <117553364+ParkSeongGeun@users.noreply.github.com>
Date: Tue Jan 13 03:30:51 2026 +0900
Fix relative path resolution in entrypoint (apple#987)
- Fixesapple#962.
- Adds test to exercise apple/containerization#473.
- Updates containerization to 0.20.1.
Signed-off-by: ParkSeongGeun <phd0801@naver.com>
commit aa77928
Author: Ronit Sabhaya <ronitsabhaya75@gmail.com>
Date: Mon Jan 12 12:04:46 2026 -0600
Fix: Support x86_64 architecture alias to prevent silent pull failure… (apple#1036)
- Adds architecture name normalization to accept
`x86_64` and `x86-64` as aliases for `amd64`.
commit dc4682b
Author: Amir Alperin <me@remotecpp.dev>
Date: Fri Jan 9 21:10:53 2026 +0200
fix: extract hostname from FQDN (apple#1011) (apple#1017)
- Set the container hostname to the first DNS
label derived from the container id, strip everything
after the first dot.
- Fixesapple#1011.
commit 4af1cc0
Author: Ronit Sabhaya <ronitsabhaya75@gmail.com>
Date: Thu Jan 8 21:27:43 2026 -0600
fix: improve error message when binding to privileged ports (fixesapple#978) (apple#1031)
- The container fails to start with a generic "permission denied"
error when attempting to publish privileged ports (ports below
1024) without root privileges. This provides a confusing user
experience as the error doesn't explain why permission was
denied.
commit 21facf0
Author: J Logan <john_logan@apple.com>
Date: Thu Jan 8 17:02:22 2026 -0800
Add instructions for using locally built init filesystem. (apple#1032)
- Closesapple#1030.
commit b671690
Author: Danny Canter <danny_canter@apple.com>
Date: Wed Jan 7 21:01:10 2026 -0800
ProgressBar: Various fixes (apple#1025)
There's a couple things I don't think are intuitive about this.
1. Because of the internal task, render() can still be called even after
finish() completes. Ideally async defers are supported and we could just
await the final render completing after cancelling the task and setting
.finished, but alas. To fix this we can just lock across the methods for
now.
2. We always clear the screen in the destructor, even if we don't use
the
progress bar. I don't think we should honestly do anything in the
destructor.
Feels a programmer error not to defer { bar.finish() } or call it
somewhere.
3. Our spaces based line clearing. Use the ansi escape sequence for
clearing line;
I think our calculations were slightly off and it would leave trailing
output ( "s]" )
in some cases.
4. Shrinking the window until the output is smaller than the terminal
window (and vice
versa) is wonky on various term emulators. Truthfully, this is just a
hard problem,
but we can truncate our output and still provide some useful info.
This fixes some single line output (cat /etc/hostname etc.) getting
cleared in our atexit handler, as well as the need for the usleep.
commit 98410fd
Author: J Logan <john_logan@apple.com>
Date: Wed Jan 7 18:23:31 2026 -0800
Adds IPv6 port forwarding. (apple#1029)
- Closesapple#1006.
commit 9d06475
Author: Saehej Kang <saehej.kang@gmail.com>
Date: Wed Jan 7 16:53:33 2026 -0800
[container]: add startedDate field (apple#1018)
- Closesapple#302.
- Closesapple#336 (obsoletes this PR).
commit db8932a
Author: J Logan <john_logan@apple.com>
Date: Wed Jan 7 15:35:35 2026 -0800
Resolve IPv6 address queries for container names. (apple#1016)
- Closesapple#1005.
- Adapt everything to use MACAddress type from containerization 0.20.0.
- Allocate MAC addresses for every container so that we have
deterministic IPv6 link local addresses.
- Add AAAA handling to ContainerDNSHandler.
- NOTE: Only works on Tahoe. On Sequoia, we don't have a good way to set
or determine the IPv6 network prefix when networks are created, so we
can't infer the IPv6 link local addresses for AAAA responses and we
instead return `NODATA`.
commit 5d6c750
Author: Danny Canter <danny_canter@apple.com>
Date: Wed Jan 7 14:48:58 2026 -0800
CLI: Add read-only flag to run/create (apple#999)
Closesapple#990
Sets the rootfs for a container to read-only.
commit aac2457
Author: Danny Canter <danny_canter@apple.com>
Date: Wed Jan 7 13:46:26 2026 -0800
Tests: Fix relative path mount tests (apple#1028)
The tests are run in parallel on CI, and were split into three tests.
They change the cwd, so it's kind of a gamble whether some of them pass.
This just moves all the logic into one test mostly.
commit 9cd5397
Author: J Logan <john_logan@apple.com>
Date: Wed Jan 7 10:35:19 2026 -0800
Update to containerization 0.20.0. (apple#1027)
- Use MACAddress for Attachment and CZ interfaces.
- Move data validation closer to API surface.
commit 356c8d2
Author: J Logan <john_logan@apple.com>
Date: Tue Jan 6 08:27:14 2026 -0800
Reorganize client libraries. (apple#1020)
- Closesapple#461.
- Extract core types into ContainerResources target.
- Extract ContainerNetworkServiceClient from ContainerNetworkService.
- Relocate sandbox client from ContainerClient to
ContainerSandboxServiceClient.
- Relocate ContainerClient to ContainerAPIServiceClient.
- Common structure from services and clients under Source/Services.
Updated project hierarchy:
```
Sources/CAuditToken - audit token access wrapper
Sources/CLI - CLI executable
Sources/ContainerBuild - builder
Sources/ContainerCommands - CLI command implementations
Sources/ContainerLog - logging helpers
Sources/ContainerPersistence - persistent data and system property helpers
Sources/ContainerPlugin - plugin system
Sources/ContainerResource - resource (container, image, volume, network) types
Sources/ContainerVersion - version helpers
Sources/ContainerXPC - XPC helpers
Sources/CVersion - injected project version
Sources/DNSServer - container DNS resolver
Sources/Helpers - service executables
Sources/Services/*/Client - service clients
Sources/Services/*/Server - service implementations
Sources/SocketForwarder - port forwarding
Sources/TerminalProgress - progress bar
```
## Type of Change
- [ ] Bug fix
- [ ] New feature
- [x] Breaking change
- [ ] Documentation update
## Motivation and Context
The ContainerClient library was a bit of a grab bag. This refactor
applies a more sensible project and library structure for resource data
types, services, and clients.
## Testing
- [x] Tested locally
- [x] Added/updated tests
- [ ] Added/updated docs
commit 8c439cd
Author: Danny Canter <danny_canter@apple.com>
Date: Mon Jan 5 13:50:57 2026 -0800
makefile: Add cli target (apple#1022)
Often times I'll be making a change that only touches the cli and I
don't feel like sitting through the potential song and dance of the
other components building/installing.
commit d6f052d
Author: Kathryn Baldauf <k_baldauf@apple.com>
Date: Mon Jan 5 13:09:34 2026 -0800
Update license header on all files to include the current year (apple#1024)
## Motivation and Context
Now that we're in 2026, we need to update the license headers on all the
files. Unfortunately, Hawkeye doesn't have an attribute for the current
year to help us avoid this in the future. Instead, I had to work around
this by doing the following:
1. Update licenserc.toml with:
```
[properties]
... (other properties)
currentYear = "2026"
```
2. Update scripts/license-header.txt with
```
Copyright ©{{ " " }}{%- set created = attrs.git_file_created_year or
attrs.disk_file_created_year -%}{%- set modified = props["currentYear"]
-%}{%- if created != modified -%} {{created}}-{{modified}}{%- else
-%}{{created}}{%- endif -%}{{ " " }}{{ props["copyrightOwner"] }}.
```
Then I removed these two changes before committing. After this PR is
merged, all files will have recently had git updates, so the existing
code for setting the modified year should work as intended.
Signed-off-by: Kathryn Baldauf <k_baldauf@apple.com>
commit 20dc0bc
Author: Danny Canter <danny_canter@apple.com>
Date: Sun Jan 4 11:11:09 2026 -0800
Parser: Support relative paths for --volume (apple#1013)
commit 028e7e1
Author: Danny Canter <danny_canter@apple.com>
Date: Sun Jan 4 10:52:46 2026 -0800
Deps: Bump Containerization to 0.19.0 (apple#1015)
Has read-only rootfs support.
commit 020949e
Author: Danny Canter <danny_canter@apple.com>
Date: Sun Jan 4 10:51:20 2026 -0800
CLI: Small fixups for implicit envvars (apple#1014)
We should only inherit from the host if there's no =. Additionally
document the flag a little more to show that we can inherit from the
host.
commit df368b7
Author: Amir Alperin <alperin.amir@gmail.com>
Date: Sun Jan 4 20:49:22 2026 +0200
Fix port validation to allow same port for different protocols (apple#992) (apple#1000)
- Fixes: apple#992
- Port validation previously rejected valid configurations
when the same port number was used for different
protocols (TCP and UDP). For example:
`-p 1024:1024/udp -p 1024:1024/tcp`
Although this is a valid and common use case, the
validation logic treated it as a conflict.
To fix this, I updated the validation key to include the protocol name.
The validation now checks for overlapping port numbers only within the
same protocol, rather than across all protocols.
This change enables binding the same port number for both TCP and UDP,
aligning the validation behavior with real-world networking
requirements.
## Testing
- [x] Tested locally
- [x] Added/updated tests
- [ ] Added/updated docs
commit cf64614
Author: J Logan <john_logan@apple.com>
Date: Fri Jan 2 14:10:48 2026 -0800
Update OSS header in Package.swift. (apple#1010)
commit 375ce16
Author: J Logan <john_logan@apple.com>
Date: Fri Jan 2 12:09:12 2026 -0800
Fix OSS header dates that break CI checks. (apple#1009)
commit 580d853
Author: c <claudeaceae@icloud.com>
Date: Fri Jan 2 00:19:57 2026 -0500
Use full path for uninstall script in upgrade instructions (apple#983)
- Makes the upgrade section consistent with the
uninstall section by using the full path to the
uninstall script.
commit 4cadc40
Author: c <claudeaceae@icloud.com>
Date: Thu Jan 1 22:53:56 2026 -0500
Clarify uninstall script location in README (apple#982)
- Clarifies where the `uninstall-container.sh` script is located after
installation
- Updates example commands to use the full path
commit 4e78e30
Author: c <claudeaceae@icloud.com>
Date: Thu Jan 1 20:57:47 2026 -0500
Fix grammar in tutorial.md (apple#985)
## Summary
- Fixes a grammar error in the tutorial's publish section
## Details
Line 287 of `docs/tutorial.md` had "you need push images" which should
be "you need to push images".
This is a simple grammar fix to improve readability.
## Test plan
- [x] Verified the sentence now reads correctly
commit 22dfd6e
Author: Danny Canter <danny_canter@apple.com>
Date: Thu Jan 1 17:57:00 2026 -0800
CLI: Fix stop not signalling waiters (apple#972)
commit 4958cf2
Author: c <claudeaceae@icloud.com>
Date: Thu Jan 1 20:51:10 2026 -0500
Fix bash completion source path in documentation (apple#981)
- Corrects the source path for bash completion script
when not using bash-completion package.
commit 25ac79a
Author: c <claudeaceae@icloud.com>
Date: Thu Jan 1 20:50:19 2026 -0500
Fix MAC address option typo in how-to documentation (apple#980)
- Corrects the MAC address example command in the
how-to guide to use the correct `--network` flag syntax
instead of the incorrect `--mac-address` flag.
commit edadf15
Author: Raj <realrajaryan@gmail.com>
Date: Thu Jan 1 15:10:39 2026 +0530
Fix container auto-delete on rapid stop/start (apple#841)
Fixesapple#833.
Currently, when stopping and immediately restarting a container, it would fail with the error:
`“container expected to be in created state, got: shuttingDown”` and then be automatically deleted.
The `SandboxService` process waits five seconds before exiting after shutdown. During this interval, a rapid restart could reconnect to the still-terminating process in the `shuttingDown` state, triggering a state validation error.
This fix forcefully terminates the `SandboxService` process with `SIGKILL` upon container exit, instead of waiting five seconds. The bootstrap now defensively checks for and cleans up any stale services before registering new ones, preventing reconnections to processes in the `shuttingDown` state.
commit 5064b0f
Author: J Logan <john_logan@apple.com>
Date: Mon Dec 22 10:16:14 2025 -0800
Adds network IPv6 configuration. (apple#975)
- Part of work for apple#460.
- Enable set/get of IPv6 network prefix in ReservedVmnetNetwork.
- Show IPv6 prefix in `network list` full output.
- Option for setting IPv6 prefix when creating a network.
- System property for default IPv6 prefix.
## Type of Change
- [ ] Bug fix
- [x] New feature
- [ ] Breaking change
- [x] Documentation update
## Motivation and Context
See apple#460.
## Testing
- [x] Tested locally
- [ ] Added/updated tests
- [x] Added/updated docs
commit 9c239aa
Author: Volodymyr Bortniak <25820601+Bortnyak@users.noreply.github.com>
Date: Sat Dec 20 00:36:02 2025 +0100
Add support for reading env from named pipes (apple#974)
This is a fix for
[issue#956](apple#956)
`FileManager.default.contents(atPath:)` returns `nil` for named pipes
(FIFOs)
and process substitutions like `/dev/fd/XX` because:
1. It expects regular files with a known size
2. Named pipes are stream-based and block until data arrives
## Solution
Use `FileHandle(forReadingFrom:)` instead, which:
- Properly handles blocking I/O
- Works with named pipes, process substitutions, and regular files
(mentioned in the
[doc](https://developer.apple.com/documentation/foundation/filehandle))
Co-authored-by: Bortniak Volodymyr <Bortnyak@users.noreply.github.com>
commit 3c3a83c
Author: Danny Canter <danny_canter@apple.com>
Date: Thu Dec 18 16:28:44 2025 -0800
Turn on oops=panic kernel cmdline (apple#971)
commit b1b9980
Author: Michael Gathara <mikegtrm@gmail.com>
Date: Wed Dec 17 20:58:50 2025 -0600
Fix: Kubes Cluster in Container Crashing Container (IS#923) (apple#930)
- Fixes issue apple#923
- I fixed a race condition in `ConnectHandler.swift` where
an asynchronous network connection could complete
after the handler had already been removed from the
pipeline.
- This prevents the EXC_BREAKPOINT crash in
container-runtime-linux that occurred when kinc
(Kubernetes in Container) created rapid connections.
- The actual fix was inadvertently applied in apple#957, so this
PR contains only the test code.
commit 9f4efe0
Author: Saehej Kang <saehej.kang@gmail.com>
Date: Wed Dec 17 00:30:33 2025 -0800
[networks]: add prune command (apple#914)
- Closesapple#893
commit 4f88725
Author: J Logan <john_logan@apple.com>
Date: Tue Dec 16 16:34:13 2025 -0800
Use new IP/CIDR types from Containerization. (apple#957)
- Part of work for apple#460.
- With CZ release 0.17.0, the IP and CIDR address
types changed from String to IPv4Address and
CIDRv4, respectively. This PR applies the corresponding
adaptations to container.
commit 8e16bb2
Author: Salman Chishti <salmanmkc@GitHub.com>
Date: Tue Dec 16 20:14:45 2025 +0000
Upgrade GitHub Actions to latest versions (apple#959)
- Upgrade GitHub Actions to their latest versions for
improved features, bug fixes, and security updates.
Signed-off-by: Salman Muin Kayser Chishti <13schishti@gmail.com>
commit 0c7dca4
Author: Salman Chishti <salmanmkc@GitHub.com>
Date: Tue Dec 16 19:23:31 2025 +0000
Add Dependabot for GitHub Actions updates (apple#960)
## Summary
Add Dependabot configuration to automatically keep GitHub Actions up to
date.
## Changes
Adds `.github/dependabot.yml` configured to:
- Check for GitHub Actions updates weekly
- Group all action updates together for easier review
- Use `ci` prefix for commit messages
## Why
As discussed in apple#958, this helps:
- Keep actions up to date with security patches automatically
- Handle Node runtime deprecations proactively (e.g., Node 20 → Node 24)
- Reduce manual maintenance burden
## Reference
Based on the pattern used in
[swift-nio](https://github.com/apple/swift-nio/blob/main/.github/dependabot.yml).
commit 637c8f1
Author: Salman Chishti <salmanmkc@GitHub.com>
Date: Tue Dec 16 18:15:42 2025 +0000
Upgrade GitHub Actions for Node 24 compatibility (apple#958)
## Summary
Upgrade GitHub Actions to their latest versions to ensure compatibility
with Node 24, as Node 20 will reach end-of-life in April 2026.
## Changes
| Action | Old Version(s) | New Version | SHA |
|--------|---------------|-------------|-----|
| `actions/checkout` | v4 | v6 | `8e8c483` |
| `actions/download-artifact` | v4 | v7 | `37930b1` |
| `actions/upload-artifact` | v4 | v6 | `b7c566a` |
| `actions/labeler` | v5 | v6 | `634933e` |
| `actions/configure-pages` | v5 | v5 | `983d773` |
| `actions/upload-pages-artifact` | v3 | v3 | `56afc60` |
| `softprops/action-gh-release` | v2 | v2 | `a06a81a` |
## Context
Per [GitHub's
announcement](https://github.blog/changelog/2025-09-19-deprecation-of-node-20-on-github-actions-runners/),
Node 20 is being deprecated and runners will begin using Node 24 by
default starting March 4th, 2026.
### Why this matters
- **Node 20 EOL**: April 2026
- **Node 24 default**: March 4th, 2026
- **Action**: Update to latest action versions that support Node 24
### Security
All actions are now **pinned to commit SHAs** instead of mutable version
tags. This provides:
- Protection against tag hijacking attacks
- Immutable, reproducible builds
- Version comments for readability
### Automated Updates
A follow-up PR (apple#960) adds Dependabot configuration to automatically
keep these actions updated with new SHA-pinned versions.
### Testing
These changes only affect CI/CD workflow configurations and should not
impact application functionality. The workflows should be tested by
running them on a branch before merging.
Signed-off-by: Salman Muin Kayser Chishti <13schishti@gmail.com>
commit c22f128
Author: karen heckel <karen.heckel@utexas.edu>
Date: Mon Dec 15 21:16:55 2025 -0800
Feat: customize console output with env variable (apple#952)
Fixesapple#915
Added a new feature to support the passing of buildkit colors for
customizing console output.
commit 9b7cfd8
Author: Saehej Kang <saehej.kang@gmail.com>
Date: Mon Dec 15 17:52:00 2025 -0800
[images]: refactor prune command (apple#941)
- Updates to `image prune` for consistency with how
other `prune` commands are done. Added missing
test cases as well for the command
- Relates to the discussion from apple#914
commit 7d30720
Author: Danny Canter <danny_canter@apple.com>
Date: Thu Dec 11 05:36:15 2025 -0800
CLI: Fix -it not being able to pipe stdout (apple#951)
Fixesapple#949
Typically if one fd is a tty, it's common for all 3 of stdio to be the
same, but that is not always the case. In our case we were using our
Terminal type from Containerization to comb through err/out/in and give
us a type backed by one of the 3 if -t was supplied. It happens that
stderr is the first we check, so our Terminal() is backed by fd 2. This
change modifies things so that we always initialize our Terminal if
asked for with fd 0, and out/err are backed by their corresponding
correct fd number.
## Type of Change
- [x] Bug fix
- [ ] New feature
- [ ] Breaking change
- [ ] Documentation update
## Testing
- [x] Tested locally
- [ ] Added/updated tests
- [ ] Added/updated docs
commit a2901e0
Author: wangxiaolei <fatelei@gmail.com>
Date: Wed Dec 10 10:04:40 2025 +0800
feat: implement version sub command (apple#911)
- closesapple#383
- implement version sub command, give more info
---------
Co-authored-by: fatelei <fatelei@fateleis-MacBook-Pro.local>
commit 0cde1ef
Author: Danny Canter <danny_canter@apple.com>
Date: Tue Dec 9 13:24:45 2025 -0800
Deps: Bump Containerization to 0.16.2 (apple#947)
Closesapple#928
Has a cgroup fix when stopping certain containers
commit 3896055
Author: Dmitry Kovba <dkovba@apple.com>
Date: Tue Dec 9 12:32:28 2025 -0800
Lowercase error messages (apple#945)
## Type of Change
- [x] Bug fix
- [ ] New feature
- [ ] Breaking change
- [ ] Documentation update
## Motivation and Context
For consistency, all error messages are lowercased.
## Testing
- [ ] Tested locally
- [ ] Added/updated tests
- [ ] Added/updated docs
---------
Co-authored-by: J Logan <sgtbakerrahulnet@yahoo.com>
commit 0733a81
Author: Saehej Kang <saehej.kang@gmail.com>
Date: Tue Dec 9 10:54:37 2025 -0800
[volumes]: refactor prune command (apple#940)
- Refactor the `volume prune` command to follow a client-side approach.
The `volumeDiskUsage` is calculated in the service file, so it made
sense to leave that there.
- Relates to the discussion from apple#914
commit 42528e6
Author: Kathryn Baldauf <k_baldauf@apple.com>
Date: Tue Dec 9 10:42:27 2025 -0800
Update CONTRIBUTORS to MAINTAINERS and point at containerization (apple#942)
## Type of Change
- [x] Documentation update
## Motivation and Context
See apple/containerization#435 for more
information on this change.
commit a64bd77
Author: J Logan <john_logan@apple.com>
Date: Tue Dec 9 14:35:34 2025 -0300
Fix broken image integration tests. (apple#944)
- Fixesapple#943.
- Use images other than alpine:3.20 for image concurrency test so as not
to interfere with tests using that image.
- Rename test files to match suite names.
commit ab92f39
Author: TTtie <me@tttie.cz>
Date: Mon Dec 8 18:17:10 2025 +0100
fix(TerminalProgress): make the progress bar respect locale-specific decimal separator (apple#936)
- The `ProgressBar#adjustFormattedSize` function currently expects a
decimal dot when adding the additional ".0" to the size. This, however,
breaks when a region with a non-dot decimal separator is used.
commit 420be74
Author: J Logan <john_logan@apple.com>
Date: Mon Dec 8 03:00:02 2025 -0300
Data integrity: bump to cz 0.16.1, adjust sync mode. (apple#939)
- 0.16.1 changes an ext4 superblock setting that might have been causing
problems.
- apple#877 fixed an issue where the cache and sync settings for block
filesystems weren't being passed down to the VZ virtual machine
configuration. The default sync value getting passed down is `full`,
which reduces I/O performance. Relax this to use `fsync` for now.
## Type of Change
- [*] Bug fix
- [ ] New feature
- [ ] Breaking change
- [ ] Documentation update
## Motivation and Context
May address problems reported in apple#877.
## Testing
- [x] Tested locally
- [ ] Added/updated tests
- [ ] Added/updated docs
commit f7bcb68
Author: Santosh Bhavani <santosh.bhavani@live.com>
Date: Sun Dec 7 10:56:50 2025 -0800
Add --max-concurrent-downloads flag for parallel layer downloads (apple#716)
Adds `--max-concurrent-downloads` flag to `container image pull` for
configurable concurrent layer downloads.
Fixesapple#715
Depends on apple/containerization#311
**Usage**:
```bash
container image pull nginx:latest --max-concurrent-downloads 6
```
**Changes**:
- Add CLI flag (default: 3)
- Thread parameter through XPC stack
- Update to use forked containerization with configurable concurrency
**Performance**: ~1.2-1.3x faster pulls for multi-layer images with
higher concurrency
**Tests**: Included standalone tests verify concurrency behavior and
parameter flow
---------
Co-authored-by: Claude <noreply@anthropic.com>
saehejkang pushed a commit to saehejkang/container that referenced this pull request Jan 23, 2026
…pple#1051)
Run = Create + Start
1) Mount source points to a valid directory
- Run and Create + Start both correctly create the container with mount.
2) Mount source points to a file
- Run fails bootstrapping the container, thus container not created.
- Create creates the container, but Start fails bootstrapping, removing
the container. (Thus, both are the same.)
3) Mount source deleted or replaced to file after container created
- Start throw errors but do not delete the container.
saehejkang pushed a commit to saehejkang/container that referenced this pull request Jan 27, 2026
…pple#1051)
Run = Create + Start
1) Mount source points to a valid directory
- Run and Create + Start both correctly create the container with mount.
2) Mount source points to a file
- Run fails bootstrapping the container, thus container not created.
- Create creates the container, but Start fails bootstrapping, removing
the container. (Thus, both are the same.)
3) Mount source deleted or replaced to file after container created
- Start throw errors but do not delete the container.
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants

@JaewonHur@jglogan@dcantah
, 'i'); if (__m === '*' || __re.test(location.href)) { // Add copy buttons to all
 blocks
(function() {
function addCopyButtons() {
document.querySelectorAll('pre code').forEach(function(codeBlock) {
if (codeBlock.parentElement.hasAttribute('data-copy-added')) return;
codeBlock.parentElement.setAttribute('data-copy-added', 'true');
var btn = document.createElement('button');
btn.textContent = 'Copy';
btn.style.cssText = 'position:absolute;top:4px;right:4px;padding:2px 8px;font-size:11px;background:#4ecdc4;border:none;border-radius:4px;color:#1a1a2e;cursor:pointer;opacity:0.7;transition:opacity 0.2s;';
btn.onmouseover = function() { this.style.opacity = '1'; };
btn.onmouseout = function() { this.style.opacity = '0.7'; };
btn.onclick = function() {
navigator.clipboard.writeText(codeBlock.textContent).then(function() {
btn.textContent = 'Copied!';
setTimeout(function() { btn.textContent = 'Copy'; }, 1500);
});
};
codeBlock.parentElement.style.position = 'relative';
codeBlock.parentElement.appendChild(btn);
});
}
addCopyButtons();
// Re-run on dynamic content
var observer = new MutationObserver(addCopyButtons);
observer.observe(document.body, { childList: true, subtree: true });
})();
}
} catch(__e) { console.warn('[Userscript:Add Copy Buttons to Code Blocks]', __e); }
})();
(function(){
try {
var __m = "github.com";
var __re = new RegExp('^' + "github\\.com" + '
Throw error when starting a container with invalid virtiofs source by JaewonHur · Pull Request #1051 · apple/container · GitHub
Skip to content

Throw error when starting a container with invalid virtiofs source - #1051

Merged
jglogan merged 2 commits into
apple:mainfrom
JaewonHur:check-virtiofs-deleted
Jan 19, 2026
Merged

Throw error when starting a container with invalid virtiofs source#1051
jglogan merged 2 commits into
apple:mainfrom
JaewonHur:check-virtiofs-deleted

Conversation

@JaewonHur

Copy link
Copy Markdown
Contributor

Run = Create + Start

  1. Mount source points to a valid directory

    • Run and Create + Start both correctly create the container with mount.
  2. Mount source points to a file

    • Run fails bootstrapping the container, thus container not created.
    • Create creates the container, but Start fails bootstrapping, removing the container. (Thus, both are the same.)
  3. Mount source deleted or replaced to file after container created

    • Start throw errors but do not delete the container.

Type of Change

  • Bug fix
  • New feature
  • Breaking change
  • Documentation update

Motivation and Context

User can encounter unexpected container removal when shared volume source is in wrong state.

Testing

  • Tested locally
  • Added/updated tests
  • Added/updated docs

@JaewonHur
JaewonHurforce-pushed the check-virtiofs-deleted branch from 2841247 to b7f738dCompareJanuary 14, 2026 20:10
@jglogan

Copy link
Copy Markdown
Contributor

Seeing this test failure:

◇ Suite TestCLINoParallelCases started.
◇ Test testImageSingleConcurrentDownload() started.
✔ Test testImageSingleConcurrentDownload() passed after 0.862 seconds.
◇ Test testImageManyConcurrentDownloads() started.
✔ Test testImageManyConcurrentDownloads() passed after 0.704 seconds.
◇ Test testImagePruneNoImages() started.
✔ Test testImagePruneNoImages() passed after 0.184 seconds.
◇ Test testImagePruneUnusedImages() started.
✘ Test testImagePruneUnusedImages() recorded an issue at TestCLINoParallelCases.swift:81:9: Expectation failed: (output → "untagged registry.local/stdin-file:10E1258F-6DC1-40EB-80F1-F18471AEA98E
untagged ghcr.io/apple/containerization/vminit:0.20.1
untagged test-alpine-env:DC582421-DD5D-496F-BE47-C39EB2F5693B
untagged test-env-child:0CE91A3D-E1F0-4FB5-A4FB-8375E9FD7A47
untagged ghcr.io/containerd/busybox:1.36
untagged ghcr.io/containerd/busybox:testImageSaveAndLoadStdinStdout
untagged ghcr.io/linuxcontainers/alpine:testImageTag
untagged registry.local/multi-arch:326BD5F0-39E8-4681-B6EB-EC89A17E200E
untagged test-env-only:FB98ED08-8994-422B-9695-B8F22E806E05
untagged ghcr.io/containerd/busybox:testImageSaveAndLoad
untagged registry.local/add-all:A45C78C8-BCC9-4DB3-B736-BF36D37A6E28
untagged registry.local/multi-tag-test:latest
untagged ghcr.io/apple/container-builder-shim/builder:0.7.0
untagged registry.local/build-arg:8B2B8285-79D0-4D46-8281-A098B10AEAB6
untagged registry.local/build-symlinks:A8449327-D470-4794-9043-3665EFF0ADEB
untagged registry.local/multi-tag-test:EA0E05B5-867A-4DDF-A10D-85E40ED26052
untagged registry.local/build-network-access:CB58B319-C954-48B9-9A13-CB5957221C40
untagged ghcr.io/linuxcontainers/alpine:testImageSaveAndLoad
untagged test-label-only:C04AAD7A-8D05-45FE-B48B-C0648395C196
untagged from-local:7D176AF6-90F2-44D3-8624-56DF2DA194F7
untagged registry.local/scratch-add:BED25DA9-D9CD-4F92-A67F-2097B0326FB4
untagged docker.io/library/python:alpine
untagged ghcr.io/username/image-name:mytag
untagged ghcr.io/linuxcontainers/alpine:3.18
untagged registry.local/dockerfile-keywords:E77F2AF6-241A-4E61-B9C9-98BCEC65D8BB
untagged test-env-base:6CA5943D-47B0-4669-A26F-2963D3FEBE7C
untagged registry.local/dot-file:44442DC8-DC1C-468A-A3A6-5F98F98F0AC4
untagged registry.local/from-previous-layer:4FDB702C-0369-4162-997E-ABB9365BA918
untagged test-build-and-run:latest
untagged local-only:E87D38F9-F823-4F9E-BB50-50CF93725ED0
untagged test-complex-env:F26FA244-7D12-4C64-A8E5-A4323254C645
untagged ghcr.io/linuxcontainers/alpine:testImageSaveAndLoadStdinStdout
untagged registry.local/scratch-add-special-dir:1A1B8E39-3746-4563-9F11-C1926C7A84E3
untagged registry.local/multi-tag-test:v1.0.0
untagged registry.local/build-diff-context:24D7C51D-4A52-4B51-A660-9129E0824C5B
deleted 193d51b116e20bdd28a9b292a008ec7a446758e6b4bea1a09801848ce32aa68c
deleted 86852de7f69d89c037ced2f78afa323976a44a10f8ac96626aa97b85ea160c34
deleted dae9190ee1dfeaa618a111d20058289d5cab7cb78105045fc9c887296f4db76d
deleted 96c8bb09dc1a2e998a574217f921911029d197c1f40bf81eb983286d484f74b0
deleted fd65fd9f19f58489ad910135803d1d89928927820d73110adefa161932cd335a
deleted b49eda688ce8c1226b6d7e02969f22361a8874cfee14c603e98ad855f1267a94
deleted 3a065aab44645209c4c3d3746f31b17cd6048a4148f890ed0fe9128baab9f553
deleted 9f9c4097a5eeb3e1b0f4fecaea5bbbe7da91f1d5e5ebb798b49047eca8e3e053
deleted be7d6d554a4bcc2b43d042f800f8f75055063ba668b9c7d60c831b16c0f26d3c
deleted ad499d8d07ad9998ee30577b376b76036eec716352318f550f5cec2cdfe5bfb1
deleted 46758452d3eef8cacb188405495d52d265f0c3a7580dfec51cb627c04c7bafc4
deleted c1d35649879861aec54f6ee4b049d573fd0e876178c558664af8da0eb0313b3d
deleted b333a6ba512596007c2683825dd364570303624164926019bbe674d90c28d5fc
deleted 29e4011ec5ddd973132dc62a298532cf7e74ed52accb51dcabdde661c4b35e88
deleted 69a77b9e82a72c35ec6ef0440fc5e3d0d32cc3235dcf9953f938d0c00bc2592f
deleted 469f7b67563d268cf25bb109da2d34e54c8b6ecf46f217c153260ab19bb016b6
deleted 430c16482b7d918525165f02610d7d24692dbdb96c02662a4be1b11cfe9144e6
deleted 77ed5ebc3d9d48581e8afcb75b4974978321bd74f018613483570fcd61a15de8
deleted bfa33b545f308b89bfcdc2f1494a8b33eb4942225428283684bf724802af9feb
deleted c21043749f3985bf7b16d9f5dcb64761f4571f2f50995486f0303fbfa63af1a2
deleted f62ebdf5041307d70c3b258918b2b7fe65f9470020c100b2369288e69a46602f
deleted b8867b6470fa5a2ad4993cdfa8407c089792c9ca28a99246628bc1b093afaf61
deleted a5ca0b27295ac877b32fed9056cd9e0685aa103880b5b4608fa018a7b2675ebe
deleted 44f35edb16d2a3aa958968b4825b37b2decb9bb1021522a02815b3ec3f9fe378
deleted 4c2e345eb1c3ec2b19a9e4c3ee422a8b01d280bcea5c4b4d3144aace2e231d82
deleted f1139c06d62421bbf77cec7852ff280a151d6d44f8964534b4a01f00bd745613
deleted f6b4fb9446345fcad2db26eac181fef6c0a919c8a4fcccd3bea5deb7f6dff67e
deleted b0c2909d1da88c295531b3acb353524ebc452d70a198d012df008a0c2f30a70a
deleted 6495489e65b7e1f05fff4e6828ece2ce1b0d5cf5b0bd740bb0d0b1185803c8a3
deleted 74b67d9de7c0a62fd14e11a737e0f6ed8fa9d0803c0ecbde23ff302e7523495f
deleted f78e6840ded1aafb6c9f265f52c2fc7c0a990813ccf96702df84a7dcdbe48bea
deleted 8a6eaca30cf8f88d713fd5040661cefa076b0e809dc27a52e38863c567531379
deleted 8ceaa5e44e0777ada21c9afb0afbc0b2ff35f3836d185d019982004e0ba04fc7
deleted 2bc9dea49d1a226db134bce761bfa89dd456109555c3ee4c490db84ad48d53b0
deleted 7fd44050a834a9d06057d8d20b5d7c11e37682ad42d2b64bdc9112118262a3d2
deleted e954aa43bc3d58a30a967d36b0b0ebf408eea4b1283106d2ca553b0243858d6b
deleted 5a6960d24672eeb3ab99648411781c92a07e762305fd81152a600d3fadb68b33
deleted 4ff685e2bcafdab0d2a9b15cbfd9d28f5dfe69af97e3bb1987ed483b0abf5a99
deleted b07db1bde08dc5ef78326cace055da8387ab54dc352f0e786acfb2efa43b6f45
deleted 9e240dbce563eba2b4cfb6f86247dc75047c1b2a6a54dba00129f113737f4880
deleted c3505dfdb7a6ef524d17d0ee391749f94de950c43642e3286e06172577e184a3
deleted c7dc643c3cfd3d741403be633468db3858d7ec09034ccb10b86836165f600607
deleted 8a49fdb3b6a5ff2bd8ec6a86c05b2922a0f7454579ecc07637e94dfd1d0639b6
deleted 16184b59f4c7ede13940875705528ce315e96c08c4fcbab3c69676a9cef17159
deleted d7ce2729f5f4d1716be99bc2376a7ea2906d293543c4bcd31693e569e6c04fee
deleted 65c9c10b984f059d0a8b8a054ae2d7ee817ce2caf06ade436074dc89dfbf0717
Reclaimed 3.35 GB in disk space
").contains(alpine → "ghcr.io/linuxcontainers/alpine:3.20")
↳ should prune alpine image
✘ Test testImagePruneUnusedImages() recorded an issue at TestCLINoParallelCases.swift:86:9: Expectation failed: alpineRemoved
↳ expected image ghcr.io/linuxcontainers/alpine:3.20 to be removed
✘ Test testImagePruneUnusedImages() failed after 21.787 seconds with 2 issues.
◇ Test testImagePruneDanglingImages() started.
✔ Test testImagePruneDanglingImages() passed after 69.015 seconds.
➜ Test testNetworkPruneNoNetworks() skipped: "Requires macOS 26"
➜ Test testNetworkPruneUnusedNetworks() skipped: "Requires macOS 26"
➜ Test testNetworkPruneSkipsNetworksInUse() skipped: "https://github.com/apple/container/issues/953"
➜ Test testNetworkPruneSkipsNetworkAttachedToStoppedContainer() skipped: "https://github.com/apple/container/issues/953"
✘ Suite TestCLINoParallelCases failed after 92.555 seconds with 2 issues.
↳ /// Tests that need total control over environment to avoid conflicts.
✘ Test run with 9 tests in 1 suite failed after 92.555 seconds with 2 issues.

@JaewonHur

JaewonHur commented Jan 15, 2026

Copy link
Copy Markdown
ContributorAuthor

Previous failures may have affect the following ones.
Not sure what's the first test case causing the issue... no test seems touching the code I updated.

Below is the failing test cases in git action. Could we try testing again to check it reproduces the same?

2026-01-14T23:29:22.6911480Z ✘ Test testRunCommandPlatform() failed after 77.334 seconds with 1 issue.
2026-01-14T23:29:22.6911960Z ✘ Test testRunDefaultHostsEntries() failed after 77.334 seconds with 1 issue.
2026-01-14T23:47:36.1332820Z ✘ Test testImagePruneUnusedImages() failed after 21.787 seconds with 2 issues.

@JaewonHur
JaewonHurforce-pushed the check-virtiofs-deleted branch from b7f738d to e840b77CompareJanuary 15, 2026 01:53
@JaewonHur

Copy link
Copy Markdown
ContributorAuthor

Integration test succeeded on my Mac.

✔ Suite TestCLINetwork passed after 16.947 seconds.
✔ Suite TestCLIRunLifecycle passed after 3.351 seconds.
✔ Suite TestCLIExecCommand passed after 3.131 seconds.
✔ Suite TestCLICreateCommand passed after 5.006 seconds.
✔ Suite TestCLIRunCommand passed after 56.832 seconds.
✔ Suite TestCLIStatsCommand passed after 6.962 seconds.
✔ Suite TestCLIImagesCommand passed after 36.785 seconds.
✔ Suite TestCLITermIO passed after 1.346 seconds.
✔ Suite TestCLIRunBase passed after 1.346 seconds.
✔ Suite CLIBuilderEnvOnlyTest passed after 24.335 seconds.
✔ Suite CLIBuilderLifecycleTest passed after 4.038 seconds.
✔ Suite CLIBuilderLocalOutputTest passed after 4.220 seconds.
✔ Suite CLIBuilderTarExportTest passed after 5.943 seconds.
✔ Suite CLIBuilderTest passed after 38.796 seconds.
✔ Suite TestCLIBuildBase passed after 77.334 seconds.
✔ Suite TestCLIVolumes passed after 19.690 seconds.
✔ Suite TestCLIKernelSet passed after 108.282 seconds.
✔ Suite TestCLIAnonymousVolumes passed after 26.928 seconds.
✔ Suite TestCLINoParallelCases passed after 40.251 seconds.

Comment on lines +73 to +77
for mount in container.configuration.mounts where mount.isVirtiofs {
if !FileManager.default.fileExists(atPath: mount.source) {
throw ContainerizationError(.invalidState, message: "path '\(mount.source)' is not a directory")
}
}

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Is it possible for us to do this in bootstrap in the API server instead?

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

It could be, but it might be duplicated as ClientCreate and ClientRun checks the mount source also.

Current bootstrap implicitly does it as making VM throws an error due to the wrong mount source path.
The thing is then, the container is just removed forever due to the cleanup logic.

@JaewonHur

Copy link
Copy Markdown
ContributorAuthor

It seems RunCommand fails randomly due to the XPC timeout when creating the container, but API server actually created the container internally.

✘ Test testRunCommandOSArch() recorded an issue at TestCLIRunCommand.swift:298:25: Issue recorded
↳ failed to run container .executionFailed("command failed: \u{1B}[33mWarning!\u{1B}[0m Running debug build. Performance may be degraded.\nError: internalError: \"failed to create container\" (cause: \"internalError: \"XPC timeout for request to com.apple.container.apiserver/containerCreate\"\")\n")
2
✘ Test testRunCommandOSArch() failed after 84.430 seconds with 1 issue.

Since the container is not cleaned up in the earlier test, image prune fails as alpine image is not dangling.

✘ Test testImagePruneUnusedImages() recorded an issue at TestCLINoParallelCases.swift:86:9: Expectation failed: alpineRemoved
↳ expected image ghcr.io/linuxcontainers/alpine:3.20 to be removed
✘ Test testImagePruneUnusedImages() failed after 20.391 seconds with 2 issues.

@JaewonHur
JaewonHurforce-pushed the check-virtiofs-deleted branch from e840b77 to 2a0ef3dCompareJanuary 16, 2026 22:18
Run = Create + Start
1) Mount source points to a valid directory
- Run and Create + Start both correctly create the container with
mount.
2) Mount source points to a file
- Run fails bootstrapping the container, thus container not created.
- Create creates the container, but Start fails bootstrapping,
removing the container.
(Thus, both are the same.)
3) Mount source deleted or replaced to file after container created
- Start throw errors but do not delete the container.
@JaewonHur
JaewonHurforce-pushed the check-virtiofs-deleted branch from 20d55c9 to 39cce7bCompareJanuary 19, 2026 07:27
@jglogan
jglogan merged commit 69445b9 into apple:mainJan 19, 2026
3 of 4 checks passed
Mcrich23 added a commit to Mcrich23/container that referenced this pull request Jan 20, 2026
commit 69445b9
Author: jwhur <57657645+JaewonHur@users.noreply.github.com>
Date: Mon Jan 19 13:09:34 2026 -0800
Throw error when starting a container with invalid virtiofs source (apple#1051)
Run = Create + Start
1) Mount source points to a valid directory
- Run and Create + Start both correctly create the container with mount.
2) Mount source points to a file
- Run fails bootstrapping the container, thus container not created.
- Create creates the container, but Start fails bootstrapping, removing
the container. (Thus, both are the same.)
3) Mount source deleted or replaced to file after container created
- Start throw errors but do not delete the container.
commit 08f48d9
Author: Danny Canter <danny_canter@apple.com>
Date: Fri Jan 16 21:48:58 2026 -0800
ContainerSvc: Handle unexpected sandbox svc exits (apple#1065)
Closesapple#1050
If the sandbox svc exits out of band of the usual stop (or regular exit)
case the container svc's state is not properly updated for the
container. This was due to the cleanup steps involving trying to send
the shutdown rpc which cannot succeed as the sandbox svc does not exist
to service it.
To handle this, let's treat shutdown not returning successfully as
non-fatal (as this is mostly best effort), log an error and continue the
state cleanup.
commit b928e3f
Author: Amir Alperin <me@remotecpp.dev>
Date: Sat Jan 17 07:43:48 2026 +0200
fix: performance warning should not output ANSI codes if stderr redirected (apple#1059)
commit 744e7f7
Author: J Logan <john_logan@apple.com>
Date: Fri Jan 16 16:26:13 2026 -0800
Update for containerization 0.21.0. (apple#1056)
- Update image load and build to handle rejected paths during tar
extraction. For the image load command there is now a `--force` function
that fails extractions with rejected paths when false, and just warns
about the rejected paths when true.
- Update `container stats` for statistics API properties now all being
optional.
## Type of Change
- [x] Bug fix
- [ ] New feature
- [ ] Breaking change
- [x] Documentation update
## Motivation and Context
See above
## Testing
- [x] Tested locally
- [x] Added/updated tests
- [x] Added/updated docs
commit b1577d8
Author: J Logan <john_logan@apple.com>
Date: Fri Jan 16 15:50:47 2026 -0800
Adds opt-in pre-commit hook for format and header checks. (apple#1062)
- Closesapple#639.
- Adds swift format configuration that removes lint checks so we can use
`swift lint` to perform format-only tests.
- Adds `check` target that invokes format and header checks.
- Adds pre-commit script that runs `make check`.
- Adds `pre-commit` target that installs the check script as a
pre-commit hook.
## Type of Change
- [ ] Bug fix
- [x] New feature
- [ ] Breaking change
- [x] Documentation update
## Motivation and Context
Avoids wasting time and commit rewrites.
## Testing
- [x] Tested locally
- [ ] Added/updated tests
- [x] Added/updated docs
commit 3cf2c6a
Author: J Logan <john_logan@apple.com>
Date: Fri Jan 16 13:41:32 2026 -0800
Fix unstable integration tests. (apple#1060)
- TestCLIRunCommand now run so many tests concurrently that the API
server gets swamped and tests randomly time out.
- The parallelism options on `swift test` only work for XCTest, not
swift-testing.
- Work around this while retaining some parallelism (good for stress
testing) by breaking the tests into two suites.
commit 8897fcc
Author: Manu Schiller <56154253+manuschillerdev@users.noreply.github.com>
Date: Wed Jan 14 04:39:08 2026 +0100
fix: use pax instead of tar for pkg payload extraction (apple#1038)
- It is common to have `gnu-tar` alongside other GNU tools
installed and aliased for compatibility reasons. However, this
breaks the current make build.
- Use BSD-only binaries (no GNU equivalents that are
commonly aliased), making the Makefile more portable.
commit dbec1db
Author: Ronit Sabhaya <ronitsabhaya75@gmail.com>
Date: Mon Jan 12 20:34:25 2026 -0600
Add support for aarch64 architecture alias (apple#1040)
- Adds `aarch64` as an alias for `arm64` in the `Arch` enum. This
addresses the maintainer's request to support this common architecture
name, ensuring consistency with `x86_64` normalization and preventing
failures for users expecting `aarch64` support.
commit 837aa5e
Author: jwhur <57657645+JaewonHur@users.noreply.github.com>
Date: Mon Jan 12 14:36:10 2026 -0800
Fix the FS error when using Virtualization (apple#1041)
- Fixesapple#614.
- Use VZ cached mode instead of auto.
Signed-off-by: jwhur <jaewon_hur@apple.com>
commit e465b10
Author: 박성근 <117553364+ParkSeongGeun@users.noreply.github.com>
Date: Tue Jan 13 03:30:51 2026 +0900
Fix relative path resolution in entrypoint (apple#987)
- Fixesapple#962.
- Adds test to exercise apple/containerization#473.
- Updates containerization to 0.20.1.
Signed-off-by: ParkSeongGeun <phd0801@naver.com>
commit aa77928
Author: Ronit Sabhaya <ronitsabhaya75@gmail.com>
Date: Mon Jan 12 12:04:46 2026 -0600
Fix: Support x86_64 architecture alias to prevent silent pull failure… (apple#1036)
- Adds architecture name normalization to accept
`x86_64` and `x86-64` as aliases for `amd64`.
commit dc4682b
Author: Amir Alperin <me@remotecpp.dev>
Date: Fri Jan 9 21:10:53 2026 +0200
fix: extract hostname from FQDN (apple#1011) (apple#1017)
- Set the container hostname to the first DNS
label derived from the container id, strip everything
after the first dot.
- Fixesapple#1011.
commit 4af1cc0
Author: Ronit Sabhaya <ronitsabhaya75@gmail.com>
Date: Thu Jan 8 21:27:43 2026 -0600
fix: improve error message when binding to privileged ports (fixesapple#978) (apple#1031)
- The container fails to start with a generic "permission denied"
error when attempting to publish privileged ports (ports below
1024) without root privileges. This provides a confusing user
experience as the error doesn't explain why permission was
denied.
commit 21facf0
Author: J Logan <john_logan@apple.com>
Date: Thu Jan 8 17:02:22 2026 -0800
Add instructions for using locally built init filesystem. (apple#1032)
- Closesapple#1030.
commit b671690
Author: Danny Canter <danny_canter@apple.com>
Date: Wed Jan 7 21:01:10 2026 -0800
ProgressBar: Various fixes (apple#1025)
There's a couple things I don't think are intuitive about this.
1. Because of the internal task, render() can still be called even after
finish() completes. Ideally async defers are supported and we could just
await the final render completing after cancelling the task and setting
.finished, but alas. To fix this we can just lock across the methods for
now.
2. We always clear the screen in the destructor, even if we don't use
the
progress bar. I don't think we should honestly do anything in the
destructor.
Feels a programmer error not to defer { bar.finish() } or call it
somewhere.
3. Our spaces based line clearing. Use the ansi escape sequence for
clearing line;
I think our calculations were slightly off and it would leave trailing
output ( "s]" )
in some cases.
4. Shrinking the window until the output is smaller than the terminal
window (and vice
versa) is wonky on various term emulators. Truthfully, this is just a
hard problem,
but we can truncate our output and still provide some useful info.
This fixes some single line output (cat /etc/hostname etc.) getting
cleared in our atexit handler, as well as the need for the usleep.
commit 98410fd
Author: J Logan <john_logan@apple.com>
Date: Wed Jan 7 18:23:31 2026 -0800
Adds IPv6 port forwarding. (apple#1029)
- Closesapple#1006.
commit 9d06475
Author: Saehej Kang <saehej.kang@gmail.com>
Date: Wed Jan 7 16:53:33 2026 -0800
[container]: add startedDate field (apple#1018)
- Closesapple#302.
- Closesapple#336 (obsoletes this PR).
commit db8932a
Author: J Logan <john_logan@apple.com>
Date: Wed Jan 7 15:35:35 2026 -0800
Resolve IPv6 address queries for container names. (apple#1016)
- Closesapple#1005.
- Adapt everything to use MACAddress type from containerization 0.20.0.
- Allocate MAC addresses for every container so that we have
deterministic IPv6 link local addresses.
- Add AAAA handling to ContainerDNSHandler.
- NOTE: Only works on Tahoe. On Sequoia, we don't have a good way to set
or determine the IPv6 network prefix when networks are created, so we
can't infer the IPv6 link local addresses for AAAA responses and we
instead return `NODATA`.
commit 5d6c750
Author: Danny Canter <danny_canter@apple.com>
Date: Wed Jan 7 14:48:58 2026 -0800
CLI: Add read-only flag to run/create (apple#999)
Closesapple#990
Sets the rootfs for a container to read-only.
commit aac2457
Author: Danny Canter <danny_canter@apple.com>
Date: Wed Jan 7 13:46:26 2026 -0800
Tests: Fix relative path mount tests (apple#1028)
The tests are run in parallel on CI, and were split into three tests.
They change the cwd, so it's kind of a gamble whether some of them pass.
This just moves all the logic into one test mostly.
commit 9cd5397
Author: J Logan <john_logan@apple.com>
Date: Wed Jan 7 10:35:19 2026 -0800
Update to containerization 0.20.0. (apple#1027)
- Use MACAddress for Attachment and CZ interfaces.
- Move data validation closer to API surface.
commit 356c8d2
Author: J Logan <john_logan@apple.com>
Date: Tue Jan 6 08:27:14 2026 -0800
Reorganize client libraries. (apple#1020)
- Closesapple#461.
- Extract core types into ContainerResources target.
- Extract ContainerNetworkServiceClient from ContainerNetworkService.
- Relocate sandbox client from ContainerClient to
ContainerSandboxServiceClient.
- Relocate ContainerClient to ContainerAPIServiceClient.
- Common structure from services and clients under Source/Services.
Updated project hierarchy:
```
Sources/CAuditToken - audit token access wrapper
Sources/CLI - CLI executable
Sources/ContainerBuild - builder
Sources/ContainerCommands - CLI command implementations
Sources/ContainerLog - logging helpers
Sources/ContainerPersistence - persistent data and system property helpers
Sources/ContainerPlugin - plugin system
Sources/ContainerResource - resource (container, image, volume, network) types
Sources/ContainerVersion - version helpers
Sources/ContainerXPC - XPC helpers
Sources/CVersion - injected project version
Sources/DNSServer - container DNS resolver
Sources/Helpers - service executables
Sources/Services/*/Client - service clients
Sources/Services/*/Server - service implementations
Sources/SocketForwarder - port forwarding
Sources/TerminalProgress - progress bar
```
## Type of Change
- [ ] Bug fix
- [ ] New feature
- [x] Breaking change
- [ ] Documentation update
## Motivation and Context
The ContainerClient library was a bit of a grab bag. This refactor
applies a more sensible project and library structure for resource data
types, services, and clients.
## Testing
- [x] Tested locally
- [x] Added/updated tests
- [ ] Added/updated docs
commit 8c439cd
Author: Danny Canter <danny_canter@apple.com>
Date: Mon Jan 5 13:50:57 2026 -0800
makefile: Add cli target (apple#1022)
Often times I'll be making a change that only touches the cli and I
don't feel like sitting through the potential song and dance of the
other components building/installing.
commit d6f052d
Author: Kathryn Baldauf <k_baldauf@apple.com>
Date: Mon Jan 5 13:09:34 2026 -0800
Update license header on all files to include the current year (apple#1024)
## Motivation and Context
Now that we're in 2026, we need to update the license headers on all the
files. Unfortunately, Hawkeye doesn't have an attribute for the current
year to help us avoid this in the future. Instead, I had to work around
this by doing the following:
1. Update licenserc.toml with:
```
[properties]
... (other properties)
currentYear = "2026"
```
2. Update scripts/license-header.txt with
```
Copyright ©{{ " " }}{%- set created = attrs.git_file_created_year or
attrs.disk_file_created_year -%}{%- set modified = props["currentYear"]
-%}{%- if created != modified -%} {{created}}-{{modified}}{%- else
-%}{{created}}{%- endif -%}{{ " " }}{{ props["copyrightOwner"] }}.
```
Then I removed these two changes before committing. After this PR is
merged, all files will have recently had git updates, so the existing
code for setting the modified year should work as intended.
Signed-off-by: Kathryn Baldauf <k_baldauf@apple.com>
commit 20dc0bc
Author: Danny Canter <danny_canter@apple.com>
Date: Sun Jan 4 11:11:09 2026 -0800
Parser: Support relative paths for --volume (apple#1013)
commit 028e7e1
Author: Danny Canter <danny_canter@apple.com>
Date: Sun Jan 4 10:52:46 2026 -0800
Deps: Bump Containerization to 0.19.0 (apple#1015)
Has read-only rootfs support.
commit 020949e
Author: Danny Canter <danny_canter@apple.com>
Date: Sun Jan 4 10:51:20 2026 -0800
CLI: Small fixups for implicit envvars (apple#1014)
We should only inherit from the host if there's no =. Additionally
document the flag a little more to show that we can inherit from the
host.
commit df368b7
Author: Amir Alperin <alperin.amir@gmail.com>
Date: Sun Jan 4 20:49:22 2026 +0200
Fix port validation to allow same port for different protocols (apple#992) (apple#1000)
- Fixes: apple#992
- Port validation previously rejected valid configurations
when the same port number was used for different
protocols (TCP and UDP). For example:
`-p 1024:1024/udp -p 1024:1024/tcp`
Although this is a valid and common use case, the
validation logic treated it as a conflict.
To fix this, I updated the validation key to include the protocol name.
The validation now checks for overlapping port numbers only within the
same protocol, rather than across all protocols.
This change enables binding the same port number for both TCP and UDP,
aligning the validation behavior with real-world networking
requirements.
## Testing
- [x] Tested locally
- [x] Added/updated tests
- [ ] Added/updated docs
commit cf64614
Author: J Logan <john_logan@apple.com>
Date: Fri Jan 2 14:10:48 2026 -0800
Update OSS header in Package.swift. (apple#1010)
commit 375ce16
Author: J Logan <john_logan@apple.com>
Date: Fri Jan 2 12:09:12 2026 -0800
Fix OSS header dates that break CI checks. (apple#1009)
commit 580d853
Author: c <claudeaceae@icloud.com>
Date: Fri Jan 2 00:19:57 2026 -0500
Use full path for uninstall script in upgrade instructions (apple#983)
- Makes the upgrade section consistent with the
uninstall section by using the full path to the
uninstall script.
commit 4cadc40
Author: c <claudeaceae@icloud.com>
Date: Thu Jan 1 22:53:56 2026 -0500
Clarify uninstall script location in README (apple#982)
- Clarifies where the `uninstall-container.sh` script is located after
installation
- Updates example commands to use the full path
commit 4e78e30
Author: c <claudeaceae@icloud.com>
Date: Thu Jan 1 20:57:47 2026 -0500
Fix grammar in tutorial.md (apple#985)
## Summary
- Fixes a grammar error in the tutorial's publish section
## Details
Line 287 of `docs/tutorial.md` had "you need push images" which should
be "you need to push images".
This is a simple grammar fix to improve readability.
## Test plan
- [x] Verified the sentence now reads correctly
commit 22dfd6e
Author: Danny Canter <danny_canter@apple.com>
Date: Thu Jan 1 17:57:00 2026 -0800
CLI: Fix stop not signalling waiters (apple#972)
commit 4958cf2
Author: c <claudeaceae@icloud.com>
Date: Thu Jan 1 20:51:10 2026 -0500
Fix bash completion source path in documentation (apple#981)
- Corrects the source path for bash completion script
when not using bash-completion package.
commit 25ac79a
Author: c <claudeaceae@icloud.com>
Date: Thu Jan 1 20:50:19 2026 -0500
Fix MAC address option typo in how-to documentation (apple#980)
- Corrects the MAC address example command in the
how-to guide to use the correct `--network` flag syntax
instead of the incorrect `--mac-address` flag.
commit edadf15
Author: Raj <realrajaryan@gmail.com>
Date: Thu Jan 1 15:10:39 2026 +0530
Fix container auto-delete on rapid stop/start (apple#841)
Fixesapple#833.
Currently, when stopping and immediately restarting a container, it would fail with the error:
`“container expected to be in created state, got: shuttingDown”` and then be automatically deleted.
The `SandboxService` process waits five seconds before exiting after shutdown. During this interval, a rapid restart could reconnect to the still-terminating process in the `shuttingDown` state, triggering a state validation error.
This fix forcefully terminates the `SandboxService` process with `SIGKILL` upon container exit, instead of waiting five seconds. The bootstrap now defensively checks for and cleans up any stale services before registering new ones, preventing reconnections to processes in the `shuttingDown` state.
commit 5064b0f
Author: J Logan <john_logan@apple.com>
Date: Mon Dec 22 10:16:14 2025 -0800
Adds network IPv6 configuration. (apple#975)
- Part of work for apple#460.
- Enable set/get of IPv6 network prefix in ReservedVmnetNetwork.
- Show IPv6 prefix in `network list` full output.
- Option for setting IPv6 prefix when creating a network.
- System property for default IPv6 prefix.
## Type of Change
- [ ] Bug fix
- [x] New feature
- [ ] Breaking change
- [x] Documentation update
## Motivation and Context
See apple#460.
## Testing
- [x] Tested locally
- [ ] Added/updated tests
- [x] Added/updated docs
commit 9c239aa
Author: Volodymyr Bortniak <25820601+Bortnyak@users.noreply.github.com>
Date: Sat Dec 20 00:36:02 2025 +0100
Add support for reading env from named pipes (apple#974)
This is a fix for
[issue#956](apple#956)
`FileManager.default.contents(atPath:)` returns `nil` for named pipes
(FIFOs)
and process substitutions like `/dev/fd/XX` because:
1. It expects regular files with a known size
2. Named pipes are stream-based and block until data arrives
## Solution
Use `FileHandle(forReadingFrom:)` instead, which:
- Properly handles blocking I/O
- Works with named pipes, process substitutions, and regular files
(mentioned in the
[doc](https://developer.apple.com/documentation/foundation/filehandle))
Co-authored-by: Bortniak Volodymyr <Bortnyak@users.noreply.github.com>
commit 3c3a83c
Author: Danny Canter <danny_canter@apple.com>
Date: Thu Dec 18 16:28:44 2025 -0800
Turn on oops=panic kernel cmdline (apple#971)
commit b1b9980
Author: Michael Gathara <mikegtrm@gmail.com>
Date: Wed Dec 17 20:58:50 2025 -0600
Fix: Kubes Cluster in Container Crashing Container (IS#923) (apple#930)
- Fixes issue apple#923
- I fixed a race condition in `ConnectHandler.swift` where
an asynchronous network connection could complete
after the handler had already been removed from the
pipeline.
- This prevents the EXC_BREAKPOINT crash in
container-runtime-linux that occurred when kinc
(Kubernetes in Container) created rapid connections.
- The actual fix was inadvertently applied in apple#957, so this
PR contains only the test code.
commit 9f4efe0
Author: Saehej Kang <saehej.kang@gmail.com>
Date: Wed Dec 17 00:30:33 2025 -0800
[networks]: add prune command (apple#914)
- Closesapple#893
commit 4f88725
Author: J Logan <john_logan@apple.com>
Date: Tue Dec 16 16:34:13 2025 -0800
Use new IP/CIDR types from Containerization. (apple#957)
- Part of work for apple#460.
- With CZ release 0.17.0, the IP and CIDR address
types changed from String to IPv4Address and
CIDRv4, respectively. This PR applies the corresponding
adaptations to container.
commit 8e16bb2
Author: Salman Chishti <salmanmkc@GitHub.com>
Date: Tue Dec 16 20:14:45 2025 +0000
Upgrade GitHub Actions to latest versions (apple#959)
- Upgrade GitHub Actions to their latest versions for
improved features, bug fixes, and security updates.
Signed-off-by: Salman Muin Kayser Chishti <13schishti@gmail.com>
commit 0c7dca4
Author: Salman Chishti <salmanmkc@GitHub.com>
Date: Tue Dec 16 19:23:31 2025 +0000
Add Dependabot for GitHub Actions updates (apple#960)
## Summary
Add Dependabot configuration to automatically keep GitHub Actions up to
date.
## Changes
Adds `.github/dependabot.yml` configured to:
- Check for GitHub Actions updates weekly
- Group all action updates together for easier review
- Use `ci` prefix for commit messages
## Why
As discussed in apple#958, this helps:
- Keep actions up to date with security patches automatically
- Handle Node runtime deprecations proactively (e.g., Node 20 → Node 24)
- Reduce manual maintenance burden
## Reference
Based on the pattern used in
[swift-nio](https://github.com/apple/swift-nio/blob/main/.github/dependabot.yml).
commit 637c8f1
Author: Salman Chishti <salmanmkc@GitHub.com>
Date: Tue Dec 16 18:15:42 2025 +0000
Upgrade GitHub Actions for Node 24 compatibility (apple#958)
## Summary
Upgrade GitHub Actions to their latest versions to ensure compatibility
with Node 24, as Node 20 will reach end-of-life in April 2026.
## Changes
| Action | Old Version(s) | New Version | SHA |
|--------|---------------|-------------|-----|
| `actions/checkout` | v4 | v6 | `8e8c483` |
| `actions/download-artifact` | v4 | v7 | `37930b1` |
| `actions/upload-artifact` | v4 | v6 | `b7c566a` |
| `actions/labeler` | v5 | v6 | `634933e` |
| `actions/configure-pages` | v5 | v5 | `983d773` |
| `actions/upload-pages-artifact` | v3 | v3 | `56afc60` |
| `softprops/action-gh-release` | v2 | v2 | `a06a81a` |
## Context
Per [GitHub's
announcement](https://github.blog/changelog/2025-09-19-deprecation-of-node-20-on-github-actions-runners/),
Node 20 is being deprecated and runners will begin using Node 24 by
default starting March 4th, 2026.
### Why this matters
- **Node 20 EOL**: April 2026
- **Node 24 default**: March 4th, 2026
- **Action**: Update to latest action versions that support Node 24
### Security
All actions are now **pinned to commit SHAs** instead of mutable version
tags. This provides:
- Protection against tag hijacking attacks
- Immutable, reproducible builds
- Version comments for readability
### Automated Updates
A follow-up PR (apple#960) adds Dependabot configuration to automatically
keep these actions updated with new SHA-pinned versions.
### Testing
These changes only affect CI/CD workflow configurations and should not
impact application functionality. The workflows should be tested by
running them on a branch before merging.
Signed-off-by: Salman Muin Kayser Chishti <13schishti@gmail.com>
commit c22f128
Author: karen heckel <karen.heckel@utexas.edu>
Date: Mon Dec 15 21:16:55 2025 -0800
Feat: customize console output with env variable (apple#952)
Fixesapple#915
Added a new feature to support the passing of buildkit colors for
customizing console output.
commit 9b7cfd8
Author: Saehej Kang <saehej.kang@gmail.com>
Date: Mon Dec 15 17:52:00 2025 -0800
[images]: refactor prune command (apple#941)
- Updates to `image prune` for consistency with how
other `prune` commands are done. Added missing
test cases as well for the command
- Relates to the discussion from apple#914
commit 7d30720
Author: Danny Canter <danny_canter@apple.com>
Date: Thu Dec 11 05:36:15 2025 -0800
CLI: Fix -it not being able to pipe stdout (apple#951)
Fixesapple#949
Typically if one fd is a tty, it's common for all 3 of stdio to be the
same, but that is not always the case. In our case we were using our
Terminal type from Containerization to comb through err/out/in and give
us a type backed by one of the 3 if -t was supplied. It happens that
stderr is the first we check, so our Terminal() is backed by fd 2. This
change modifies things so that we always initialize our Terminal if
asked for with fd 0, and out/err are backed by their corresponding
correct fd number.
## Type of Change
- [x] Bug fix
- [ ] New feature
- [ ] Breaking change
- [ ] Documentation update
## Testing
- [x] Tested locally
- [ ] Added/updated tests
- [ ] Added/updated docs
commit a2901e0
Author: wangxiaolei <fatelei@gmail.com>
Date: Wed Dec 10 10:04:40 2025 +0800
feat: implement version sub command (apple#911)
- closesapple#383
- implement version sub command, give more info
---------
Co-authored-by: fatelei <fatelei@fateleis-MacBook-Pro.local>
commit 0cde1ef
Author: Danny Canter <danny_canter@apple.com>
Date: Tue Dec 9 13:24:45 2025 -0800
Deps: Bump Containerization to 0.16.2 (apple#947)
Closesapple#928
Has a cgroup fix when stopping certain containers
commit 3896055
Author: Dmitry Kovba <dkovba@apple.com>
Date: Tue Dec 9 12:32:28 2025 -0800
Lowercase error messages (apple#945)
## Type of Change
- [x] Bug fix
- [ ] New feature
- [ ] Breaking change
- [ ] Documentation update
## Motivation and Context
For consistency, all error messages are lowercased.
## Testing
- [ ] Tested locally
- [ ] Added/updated tests
- [ ] Added/updated docs
---------
Co-authored-by: J Logan <sgtbakerrahulnet@yahoo.com>
commit 0733a81
Author: Saehej Kang <saehej.kang@gmail.com>
Date: Tue Dec 9 10:54:37 2025 -0800
[volumes]: refactor prune command (apple#940)
- Refactor the `volume prune` command to follow a client-side approach.
The `volumeDiskUsage` is calculated in the service file, so it made
sense to leave that there.
- Relates to the discussion from apple#914
commit 42528e6
Author: Kathryn Baldauf <k_baldauf@apple.com>
Date: Tue Dec 9 10:42:27 2025 -0800
Update CONTRIBUTORS to MAINTAINERS and point at containerization (apple#942)
## Type of Change
- [x] Documentation update
## Motivation and Context
See apple/containerization#435 for more
information on this change.
commit a64bd77
Author: J Logan <john_logan@apple.com>
Date: Tue Dec 9 14:35:34 2025 -0300
Fix broken image integration tests. (apple#944)
- Fixesapple#943.
- Use images other than alpine:3.20 for image concurrency test so as not
to interfere with tests using that image.
- Rename test files to match suite names.
commit ab92f39
Author: TTtie <me@tttie.cz>
Date: Mon Dec 8 18:17:10 2025 +0100
fix(TerminalProgress): make the progress bar respect locale-specific decimal separator (apple#936)
- The `ProgressBar#adjustFormattedSize` function currently expects a
decimal dot when adding the additional ".0" to the size. This, however,
breaks when a region with a non-dot decimal separator is used.
commit 420be74
Author: J Logan <john_logan@apple.com>
Date: Mon Dec 8 03:00:02 2025 -0300
Data integrity: bump to cz 0.16.1, adjust sync mode. (apple#939)
- 0.16.1 changes an ext4 superblock setting that might have been causing
problems.
- apple#877 fixed an issue where the cache and sync settings for block
filesystems weren't being passed down to the VZ virtual machine
configuration. The default sync value getting passed down is `full`,
which reduces I/O performance. Relax this to use `fsync` for now.
## Type of Change
- [*] Bug fix
- [ ] New feature
- [ ] Breaking change
- [ ] Documentation update
## Motivation and Context
May address problems reported in apple#877.
## Testing
- [x] Tested locally
- [ ] Added/updated tests
- [ ] Added/updated docs
commit f7bcb68
Author: Santosh Bhavani <santosh.bhavani@live.com>
Date: Sun Dec 7 10:56:50 2025 -0800
Add --max-concurrent-downloads flag for parallel layer downloads (apple#716)
Adds `--max-concurrent-downloads` flag to `container image pull` for
configurable concurrent layer downloads.
Fixesapple#715
Depends on apple/containerization#311
**Usage**:
```bash
container image pull nginx:latest --max-concurrent-downloads 6
```
**Changes**:
- Add CLI flag (default: 3)
- Thread parameter through XPC stack
- Update to use forked containerization with configurable concurrency
**Performance**: ~1.2-1.3x faster pulls for multi-layer images with
higher concurrency
**Tests**: Included standalone tests verify concurrency behavior and
parameter flow
---------
Co-authored-by: Claude <noreply@anthropic.com>
Mcrich23 added a commit to Mcrich23/container that referenced this pull request Jan 22, 2026
commit 69445b9
Author: jwhur <57657645+JaewonHur@users.noreply.github.com>
Date: Mon Jan 19 13:09:34 2026 -0800
Throw error when starting a container with invalid virtiofs source (apple#1051)
Run = Create + Start
1) Mount source points to a valid directory
- Run and Create + Start both correctly create the container with mount.
2) Mount source points to a file
- Run fails bootstrapping the container, thus container not created.
- Create creates the container, but Start fails bootstrapping, removing
the container. (Thus, both are the same.)
3) Mount source deleted or replaced to file after container created
- Start throw errors but do not delete the container.
commit 08f48d9
Author: Danny Canter <danny_canter@apple.com>
Date: Fri Jan 16 21:48:58 2026 -0800
ContainerSvc: Handle unexpected sandbox svc exits (apple#1065)
Closesapple#1050
If the sandbox svc exits out of band of the usual stop (or regular exit)
case the container svc's state is not properly updated for the
container. This was due to the cleanup steps involving trying to send
the shutdown rpc which cannot succeed as the sandbox svc does not exist
to service it.
To handle this, let's treat shutdown not returning successfully as
non-fatal (as this is mostly best effort), log an error and continue the
state cleanup.
commit b928e3f
Author: Amir Alperin <me@remotecpp.dev>
Date: Sat Jan 17 07:43:48 2026 +0200
fix: performance warning should not output ANSI codes if stderr redirected (apple#1059)
commit 744e7f7
Author: J Logan <john_logan@apple.com>
Date: Fri Jan 16 16:26:13 2026 -0800
Update for containerization 0.21.0. (apple#1056)
- Update image load and build to handle rejected paths during tar
extraction. For the image load command there is now a `--force` function
that fails extractions with rejected paths when false, and just warns
about the rejected paths when true.
- Update `container stats` for statistics API properties now all being
optional.
## Type of Change
- [x] Bug fix
- [ ] New feature
- [ ] Breaking change
- [x] Documentation update
## Motivation and Context
See above
## Testing
- [x] Tested locally
- [x] Added/updated tests
- [x] Added/updated docs
commit b1577d8
Author: J Logan <john_logan@apple.com>
Date: Fri Jan 16 15:50:47 2026 -0800
Adds opt-in pre-commit hook for format and header checks. (apple#1062)
- Closesapple#639.
- Adds swift format configuration that removes lint checks so we can use
`swift lint` to perform format-only tests.
- Adds `check` target that invokes format and header checks.
- Adds pre-commit script that runs `make check`.
- Adds `pre-commit` target that installs the check script as a
pre-commit hook.
## Type of Change
- [ ] Bug fix
- [x] New feature
- [ ] Breaking change
- [x] Documentation update
## Motivation and Context
Avoids wasting time and commit rewrites.
## Testing
- [x] Tested locally
- [ ] Added/updated tests
- [x] Added/updated docs
commit 3cf2c6a
Author: J Logan <john_logan@apple.com>
Date: Fri Jan 16 13:41:32 2026 -0800
Fix unstable integration tests. (apple#1060)
- TestCLIRunCommand now run so many tests concurrently that the API
server gets swamped and tests randomly time out.
- The parallelism options on `swift test` only work for XCTest, not
swift-testing.
- Work around this while retaining some parallelism (good for stress
testing) by breaking the tests into two suites.
commit 8897fcc
Author: Manu Schiller <56154253+manuschillerdev@users.noreply.github.com>
Date: Wed Jan 14 04:39:08 2026 +0100
fix: use pax instead of tar for pkg payload extraction (apple#1038)
- It is common to have `gnu-tar` alongside other GNU tools
installed and aliased for compatibility reasons. However, this
breaks the current make build.
- Use BSD-only binaries (no GNU equivalents that are
commonly aliased), making the Makefile more portable.
commit dbec1db
Author: Ronit Sabhaya <ronitsabhaya75@gmail.com>
Date: Mon Jan 12 20:34:25 2026 -0600
Add support for aarch64 architecture alias (apple#1040)
- Adds `aarch64` as an alias for `arm64` in the `Arch` enum. This
addresses the maintainer's request to support this common architecture
name, ensuring consistency with `x86_64` normalization and preventing
failures for users expecting `aarch64` support.
commit 837aa5e
Author: jwhur <57657645+JaewonHur@users.noreply.github.com>
Date: Mon Jan 12 14:36:10 2026 -0800
Fix the FS error when using Virtualization (apple#1041)
- Fixesapple#614.
- Use VZ cached mode instead of auto.
Signed-off-by: jwhur <jaewon_hur@apple.com>
commit e465b10
Author: 박성근 <117553364+ParkSeongGeun@users.noreply.github.com>
Date: Tue Jan 13 03:30:51 2026 +0900
Fix relative path resolution in entrypoint (apple#987)
- Fixesapple#962.
- Adds test to exercise apple/containerization#473.
- Updates containerization to 0.20.1.
Signed-off-by: ParkSeongGeun <phd0801@naver.com>
commit aa77928
Author: Ronit Sabhaya <ronitsabhaya75@gmail.com>
Date: Mon Jan 12 12:04:46 2026 -0600
Fix: Support x86_64 architecture alias to prevent silent pull failure… (apple#1036)
- Adds architecture name normalization to accept
`x86_64` and `x86-64` as aliases for `amd64`.
commit dc4682b
Author: Amir Alperin <me@remotecpp.dev>
Date: Fri Jan 9 21:10:53 2026 +0200
fix: extract hostname from FQDN (apple#1011) (apple#1017)
- Set the container hostname to the first DNS
label derived from the container id, strip everything
after the first dot.
- Fixesapple#1011.
commit 4af1cc0
Author: Ronit Sabhaya <ronitsabhaya75@gmail.com>
Date: Thu Jan 8 21:27:43 2026 -0600
fix: improve error message when binding to privileged ports (fixesapple#978) (apple#1031)
- The container fails to start with a generic "permission denied"
error when attempting to publish privileged ports (ports below
1024) without root privileges. This provides a confusing user
experience as the error doesn't explain why permission was
denied.
commit 21facf0
Author: J Logan <john_logan@apple.com>
Date: Thu Jan 8 17:02:22 2026 -0800
Add instructions for using locally built init filesystem. (apple#1032)
- Closesapple#1030.
commit b671690
Author: Danny Canter <danny_canter@apple.com>
Date: Wed Jan 7 21:01:10 2026 -0800
ProgressBar: Various fixes (apple#1025)
There's a couple things I don't think are intuitive about this.
1. Because of the internal task, render() can still be called even after
finish() completes. Ideally async defers are supported and we could just
await the final render completing after cancelling the task and setting
.finished, but alas. To fix this we can just lock across the methods for
now.
2. We always clear the screen in the destructor, even if we don't use
the
progress bar. I don't think we should honestly do anything in the
destructor.
Feels a programmer error not to defer { bar.finish() } or call it
somewhere.
3. Our spaces based line clearing. Use the ansi escape sequence for
clearing line;
I think our calculations were slightly off and it would leave trailing
output ( "s]" )
in some cases.
4. Shrinking the window until the output is smaller than the terminal
window (and vice
versa) is wonky on various term emulators. Truthfully, this is just a
hard problem,
but we can truncate our output and still provide some useful info.
This fixes some single line output (cat /etc/hostname etc.) getting
cleared in our atexit handler, as well as the need for the usleep.
commit 98410fd
Author: J Logan <john_logan@apple.com>
Date: Wed Jan 7 18:23:31 2026 -0800
Adds IPv6 port forwarding. (apple#1029)
- Closesapple#1006.
commit 9d06475
Author: Saehej Kang <saehej.kang@gmail.com>
Date: Wed Jan 7 16:53:33 2026 -0800
[container]: add startedDate field (apple#1018)
- Closesapple#302.
- Closesapple#336 (obsoletes this PR).
commit db8932a
Author: J Logan <john_logan@apple.com>
Date: Wed Jan 7 15:35:35 2026 -0800
Resolve IPv6 address queries for container names. (apple#1016)
- Closesapple#1005.
- Adapt everything to use MACAddress type from containerization 0.20.0.
- Allocate MAC addresses for every container so that we have
deterministic IPv6 link local addresses.
- Add AAAA handling to ContainerDNSHandler.
- NOTE: Only works on Tahoe. On Sequoia, we don't have a good way to set
or determine the IPv6 network prefix when networks are created, so we
can't infer the IPv6 link local addresses for AAAA responses and we
instead return `NODATA`.
commit 5d6c750
Author: Danny Canter <danny_canter@apple.com>
Date: Wed Jan 7 14:48:58 2026 -0800
CLI: Add read-only flag to run/create (apple#999)
Closesapple#990
Sets the rootfs for a container to read-only.
commit aac2457
Author: Danny Canter <danny_canter@apple.com>
Date: Wed Jan 7 13:46:26 2026 -0800
Tests: Fix relative path mount tests (apple#1028)
The tests are run in parallel on CI, and were split into three tests.
They change the cwd, so it's kind of a gamble whether some of them pass.
This just moves all the logic into one test mostly.
commit 9cd5397
Author: J Logan <john_logan@apple.com>
Date: Wed Jan 7 10:35:19 2026 -0800
Update to containerization 0.20.0. (apple#1027)
- Use MACAddress for Attachment and CZ interfaces.
- Move data validation closer to API surface.
commit 356c8d2
Author: J Logan <john_logan@apple.com>
Date: Tue Jan 6 08:27:14 2026 -0800
Reorganize client libraries. (apple#1020)
- Closesapple#461.
- Extract core types into ContainerResources target.
- Extract ContainerNetworkServiceClient from ContainerNetworkService.
- Relocate sandbox client from ContainerClient to
ContainerSandboxServiceClient.
- Relocate ContainerClient to ContainerAPIServiceClient.
- Common structure from services and clients under Source/Services.
Updated project hierarchy:
```
Sources/CAuditToken - audit token access wrapper
Sources/CLI - CLI executable
Sources/ContainerBuild - builder
Sources/ContainerCommands - CLI command implementations
Sources/ContainerLog - logging helpers
Sources/ContainerPersistence - persistent data and system property helpers
Sources/ContainerPlugin - plugin system
Sources/ContainerResource - resource (container, image, volume, network) types
Sources/ContainerVersion - version helpers
Sources/ContainerXPC - XPC helpers
Sources/CVersion - injected project version
Sources/DNSServer - container DNS resolver
Sources/Helpers - service executables
Sources/Services/*/Client - service clients
Sources/Services/*/Server - service implementations
Sources/SocketForwarder - port forwarding
Sources/TerminalProgress - progress bar
```
## Type of Change
- [ ] Bug fix
- [ ] New feature
- [x] Breaking change
- [ ] Documentation update
## Motivation and Context
The ContainerClient library was a bit of a grab bag. This refactor
applies a more sensible project and library structure for resource data
types, services, and clients.
## Testing
- [x] Tested locally
- [x] Added/updated tests
- [ ] Added/updated docs
commit 8c439cd
Author: Danny Canter <danny_canter@apple.com>
Date: Mon Jan 5 13:50:57 2026 -0800
makefile: Add cli target (apple#1022)
Often times I'll be making a change that only touches the cli and I
don't feel like sitting through the potential song and dance of the
other components building/installing.
commit d6f052d
Author: Kathryn Baldauf <k_baldauf@apple.com>
Date: Mon Jan 5 13:09:34 2026 -0800
Update license header on all files to include the current year (apple#1024)
## Motivation and Context
Now that we're in 2026, we need to update the license headers on all the
files. Unfortunately, Hawkeye doesn't have an attribute for the current
year to help us avoid this in the future. Instead, I had to work around
this by doing the following:
1. Update licenserc.toml with:
```
[properties]
... (other properties)
currentYear = "2026"
```
2. Update scripts/license-header.txt with
```
Copyright ©{{ " " }}{%- set created = attrs.git_file_created_year or
attrs.disk_file_created_year -%}{%- set modified = props["currentYear"]
-%}{%- if created != modified -%} {{created}}-{{modified}}{%- else
-%}{{created}}{%- endif -%}{{ " " }}{{ props["copyrightOwner"] }}.
```
Then I removed these two changes before committing. After this PR is
merged, all files will have recently had git updates, so the existing
code for setting the modified year should work as intended.
Signed-off-by: Kathryn Baldauf <k_baldauf@apple.com>
commit 20dc0bc
Author: Danny Canter <danny_canter@apple.com>
Date: Sun Jan 4 11:11:09 2026 -0800
Parser: Support relative paths for --volume (apple#1013)
commit 028e7e1
Author: Danny Canter <danny_canter@apple.com>
Date: Sun Jan 4 10:52:46 2026 -0800
Deps: Bump Containerization to 0.19.0 (apple#1015)
Has read-only rootfs support.
commit 020949e
Author: Danny Canter <danny_canter@apple.com>
Date: Sun Jan 4 10:51:20 2026 -0800
CLI: Small fixups for implicit envvars (apple#1014)
We should only inherit from the host if there's no =. Additionally
document the flag a little more to show that we can inherit from the
host.
commit df368b7
Author: Amir Alperin <alperin.amir@gmail.com>
Date: Sun Jan 4 20:49:22 2026 +0200
Fix port validation to allow same port for different protocols (apple#992) (apple#1000)
- Fixes: apple#992
- Port validation previously rejected valid configurations
when the same port number was used for different
protocols (TCP and UDP). For example:
`-p 1024:1024/udp -p 1024:1024/tcp`
Although this is a valid and common use case, the
validation logic treated it as a conflict.
To fix this, I updated the validation key to include the protocol name.
The validation now checks for overlapping port numbers only within the
same protocol, rather than across all protocols.
This change enables binding the same port number for both TCP and UDP,
aligning the validation behavior with real-world networking
requirements.
## Testing
- [x] Tested locally
- [x] Added/updated tests
- [ ] Added/updated docs
commit cf64614
Author: J Logan <john_logan@apple.com>
Date: Fri Jan 2 14:10:48 2026 -0800
Update OSS header in Package.swift. (apple#1010)
commit 375ce16
Author: J Logan <john_logan@apple.com>
Date: Fri Jan 2 12:09:12 2026 -0800
Fix OSS header dates that break CI checks. (apple#1009)
commit 580d853
Author: c <claudeaceae@icloud.com>
Date: Fri Jan 2 00:19:57 2026 -0500
Use full path for uninstall script in upgrade instructions (apple#983)
- Makes the upgrade section consistent with the
uninstall section by using the full path to the
uninstall script.
commit 4cadc40
Author: c <claudeaceae@icloud.com>
Date: Thu Jan 1 22:53:56 2026 -0500
Clarify uninstall script location in README (apple#982)
- Clarifies where the `uninstall-container.sh` script is located after
installation
- Updates example commands to use the full path
commit 4e78e30
Author: c <claudeaceae@icloud.com>
Date: Thu Jan 1 20:57:47 2026 -0500
Fix grammar in tutorial.md (apple#985)
## Summary
- Fixes a grammar error in the tutorial's publish section
## Details
Line 287 of `docs/tutorial.md` had "you need push images" which should
be "you need to push images".
This is a simple grammar fix to improve readability.
## Test plan
- [x] Verified the sentence now reads correctly
commit 22dfd6e
Author: Danny Canter <danny_canter@apple.com>
Date: Thu Jan 1 17:57:00 2026 -0800
CLI: Fix stop not signalling waiters (apple#972)
commit 4958cf2
Author: c <claudeaceae@icloud.com>
Date: Thu Jan 1 20:51:10 2026 -0500
Fix bash completion source path in documentation (apple#981)
- Corrects the source path for bash completion script
when not using bash-completion package.
commit 25ac79a
Author: c <claudeaceae@icloud.com>
Date: Thu Jan 1 20:50:19 2026 -0500
Fix MAC address option typo in how-to documentation (apple#980)
- Corrects the MAC address example command in the
how-to guide to use the correct `--network` flag syntax
instead of the incorrect `--mac-address` flag.
commit edadf15
Author: Raj <realrajaryan@gmail.com>
Date: Thu Jan 1 15:10:39 2026 +0530
Fix container auto-delete on rapid stop/start (apple#841)
Fixesapple#833.
Currently, when stopping and immediately restarting a container, it would fail with the error:
`“container expected to be in created state, got: shuttingDown”` and then be automatically deleted.
The `SandboxService` process waits five seconds before exiting after shutdown. During this interval, a rapid restart could reconnect to the still-terminating process in the `shuttingDown` state, triggering a state validation error.
This fix forcefully terminates the `SandboxService` process with `SIGKILL` upon container exit, instead of waiting five seconds. The bootstrap now defensively checks for and cleans up any stale services before registering new ones, preventing reconnections to processes in the `shuttingDown` state.
commit 5064b0f
Author: J Logan <john_logan@apple.com>
Date: Mon Dec 22 10:16:14 2025 -0800
Adds network IPv6 configuration. (apple#975)
- Part of work for apple#460.
- Enable set/get of IPv6 network prefix in ReservedVmnetNetwork.
- Show IPv6 prefix in `network list` full output.
- Option for setting IPv6 prefix when creating a network.
- System property for default IPv6 prefix.
## Type of Change
- [ ] Bug fix
- [x] New feature
- [ ] Breaking change
- [x] Documentation update
## Motivation and Context
See apple#460.
## Testing
- [x] Tested locally
- [ ] Added/updated tests
- [x] Added/updated docs
commit 9c239aa
Author: Volodymyr Bortniak <25820601+Bortnyak@users.noreply.github.com>
Date: Sat Dec 20 00:36:02 2025 +0100
Add support for reading env from named pipes (apple#974)
This is a fix for
[issue#956](apple#956)
`FileManager.default.contents(atPath:)` returns `nil` for named pipes
(FIFOs)
and process substitutions like `/dev/fd/XX` because:
1. It expects regular files with a known size
2. Named pipes are stream-based and block until data arrives
## Solution
Use `FileHandle(forReadingFrom:)` instead, which:
- Properly handles blocking I/O
- Works with named pipes, process substitutions, and regular files
(mentioned in the
[doc](https://developer.apple.com/documentation/foundation/filehandle))
Co-authored-by: Bortniak Volodymyr <Bortnyak@users.noreply.github.com>
commit 3c3a83c
Author: Danny Canter <danny_canter@apple.com>
Date: Thu Dec 18 16:28:44 2025 -0800
Turn on oops=panic kernel cmdline (apple#971)
commit b1b9980
Author: Michael Gathara <mikegtrm@gmail.com>
Date: Wed Dec 17 20:58:50 2025 -0600
Fix: Kubes Cluster in Container Crashing Container (IS#923) (apple#930)
- Fixes issue apple#923
- I fixed a race condition in `ConnectHandler.swift` where
an asynchronous network connection could complete
after the handler had already been removed from the
pipeline.
- This prevents the EXC_BREAKPOINT crash in
container-runtime-linux that occurred when kinc
(Kubernetes in Container) created rapid connections.
- The actual fix was inadvertently applied in apple#957, so this
PR contains only the test code.
commit 9f4efe0
Author: Saehej Kang <saehej.kang@gmail.com>
Date: Wed Dec 17 00:30:33 2025 -0800
[networks]: add prune command (apple#914)
- Closesapple#893
commit 4f88725
Author: J Logan <john_logan@apple.com>
Date: Tue Dec 16 16:34:13 2025 -0800
Use new IP/CIDR types from Containerization. (apple#957)
- Part of work for apple#460.
- With CZ release 0.17.0, the IP and CIDR address
types changed from String to IPv4Address and
CIDRv4, respectively. This PR applies the corresponding
adaptations to container.
commit 8e16bb2
Author: Salman Chishti <salmanmkc@GitHub.com>
Date: Tue Dec 16 20:14:45 2025 +0000
Upgrade GitHub Actions to latest versions (apple#959)
- Upgrade GitHub Actions to their latest versions for
improved features, bug fixes, and security updates.
Signed-off-by: Salman Muin Kayser Chishti <13schishti@gmail.com>
commit 0c7dca4
Author: Salman Chishti <salmanmkc@GitHub.com>
Date: Tue Dec 16 19:23:31 2025 +0000
Add Dependabot for GitHub Actions updates (apple#960)
## Summary
Add Dependabot configuration to automatically keep GitHub Actions up to
date.
## Changes
Adds `.github/dependabot.yml` configured to:
- Check for GitHub Actions updates weekly
- Group all action updates together for easier review
- Use `ci` prefix for commit messages
## Why
As discussed in apple#958, this helps:
- Keep actions up to date with security patches automatically
- Handle Node runtime deprecations proactively (e.g., Node 20 → Node 24)
- Reduce manual maintenance burden
## Reference
Based on the pattern used in
[swift-nio](https://github.com/apple/swift-nio/blob/main/.github/dependabot.yml).
commit 637c8f1
Author: Salman Chishti <salmanmkc@GitHub.com>
Date: Tue Dec 16 18:15:42 2025 +0000
Upgrade GitHub Actions for Node 24 compatibility (apple#958)
## Summary
Upgrade GitHub Actions to their latest versions to ensure compatibility
with Node 24, as Node 20 will reach end-of-life in April 2026.
## Changes
| Action | Old Version(s) | New Version | SHA |
|--------|---------------|-------------|-----|
| `actions/checkout` | v4 | v6 | `8e8c483` |
| `actions/download-artifact` | v4 | v7 | `37930b1` |
| `actions/upload-artifact` | v4 | v6 | `b7c566a` |
| `actions/labeler` | v5 | v6 | `634933e` |
| `actions/configure-pages` | v5 | v5 | `983d773` |
| `actions/upload-pages-artifact` | v3 | v3 | `56afc60` |
| `softprops/action-gh-release` | v2 | v2 | `a06a81a` |
## Context
Per [GitHub's
announcement](https://github.blog/changelog/2025-09-19-deprecation-of-node-20-on-github-actions-runners/),
Node 20 is being deprecated and runners will begin using Node 24 by
default starting March 4th, 2026.
### Why this matters
- **Node 20 EOL**: April 2026
- **Node 24 default**: March 4th, 2026
- **Action**: Update to latest action versions that support Node 24
### Security
All actions are now **pinned to commit SHAs** instead of mutable version
tags. This provides:
- Protection against tag hijacking attacks
- Immutable, reproducible builds
- Version comments for readability
### Automated Updates
A follow-up PR (apple#960) adds Dependabot configuration to automatically
keep these actions updated with new SHA-pinned versions.
### Testing
These changes only affect CI/CD workflow configurations and should not
impact application functionality. The workflows should be tested by
running them on a branch before merging.
Signed-off-by: Salman Muin Kayser Chishti <13schishti@gmail.com>
commit c22f128
Author: karen heckel <karen.heckel@utexas.edu>
Date: Mon Dec 15 21:16:55 2025 -0800
Feat: customize console output with env variable (apple#952)
Fixesapple#915
Added a new feature to support the passing of buildkit colors for
customizing console output.
commit 9b7cfd8
Author: Saehej Kang <saehej.kang@gmail.com>
Date: Mon Dec 15 17:52:00 2025 -0800
[images]: refactor prune command (apple#941)
- Updates to `image prune` for consistency with how
other `prune` commands are done. Added missing
test cases as well for the command
- Relates to the discussion from apple#914
commit 7d30720
Author: Danny Canter <danny_canter@apple.com>
Date: Thu Dec 11 05:36:15 2025 -0800
CLI: Fix -it not being able to pipe stdout (apple#951)
Fixesapple#949
Typically if one fd is a tty, it's common for all 3 of stdio to be the
same, but that is not always the case. In our case we were using our
Terminal type from Containerization to comb through err/out/in and give
us a type backed by one of the 3 if -t was supplied. It happens that
stderr is the first we check, so our Terminal() is backed by fd 2. This
change modifies things so that we always initialize our Terminal if
asked for with fd 0, and out/err are backed by their corresponding
correct fd number.
## Type of Change
- [x] Bug fix
- [ ] New feature
- [ ] Breaking change
- [ ] Documentation update
## Testing
- [x] Tested locally
- [ ] Added/updated tests
- [ ] Added/updated docs
commit a2901e0
Author: wangxiaolei <fatelei@gmail.com>
Date: Wed Dec 10 10:04:40 2025 +0800
feat: implement version sub command (apple#911)
- closesapple#383
- implement version sub command, give more info
---------
Co-authored-by: fatelei <fatelei@fateleis-MacBook-Pro.local>
commit 0cde1ef
Author: Danny Canter <danny_canter@apple.com>
Date: Tue Dec 9 13:24:45 2025 -0800
Deps: Bump Containerization to 0.16.2 (apple#947)
Closesapple#928
Has a cgroup fix when stopping certain containers
commit 3896055
Author: Dmitry Kovba <dkovba@apple.com>
Date: Tue Dec 9 12:32:28 2025 -0800
Lowercase error messages (apple#945)
## Type of Change
- [x] Bug fix
- [ ] New feature
- [ ] Breaking change
- [ ] Documentation update
## Motivation and Context
For consistency, all error messages are lowercased.
## Testing
- [ ] Tested locally
- [ ] Added/updated tests
- [ ] Added/updated docs
---------
Co-authored-by: J Logan <sgtbakerrahulnet@yahoo.com>
commit 0733a81
Author: Saehej Kang <saehej.kang@gmail.com>
Date: Tue Dec 9 10:54:37 2025 -0800
[volumes]: refactor prune command (apple#940)
- Refactor the `volume prune` command to follow a client-side approach.
The `volumeDiskUsage` is calculated in the service file, so it made
sense to leave that there.
- Relates to the discussion from apple#914
commit 42528e6
Author: Kathryn Baldauf <k_baldauf@apple.com>
Date: Tue Dec 9 10:42:27 2025 -0800
Update CONTRIBUTORS to MAINTAINERS and point at containerization (apple#942)
## Type of Change
- [x] Documentation update
## Motivation and Context
See apple/containerization#435 for more
information on this change.
commit a64bd77
Author: J Logan <john_logan@apple.com>
Date: Tue Dec 9 14:35:34 2025 -0300
Fix broken image integration tests. (apple#944)
- Fixesapple#943.
- Use images other than alpine:3.20 for image concurrency test so as not
to interfere with tests using that image.
- Rename test files to match suite names.
commit ab92f39
Author: TTtie <me@tttie.cz>
Date: Mon Dec 8 18:17:10 2025 +0100
fix(TerminalProgress): make the progress bar respect locale-specific decimal separator (apple#936)
- The `ProgressBar#adjustFormattedSize` function currently expects a
decimal dot when adding the additional ".0" to the size. This, however,
breaks when a region with a non-dot decimal separator is used.
commit 420be74
Author: J Logan <john_logan@apple.com>
Date: Mon Dec 8 03:00:02 2025 -0300
Data integrity: bump to cz 0.16.1, adjust sync mode. (apple#939)
- 0.16.1 changes an ext4 superblock setting that might have been causing
problems.
- apple#877 fixed an issue where the cache and sync settings for block
filesystems weren't being passed down to the VZ virtual machine
configuration. The default sync value getting passed down is `full`,
which reduces I/O performance. Relax this to use `fsync` for now.
## Type of Change
- [*] Bug fix
- [ ] New feature
- [ ] Breaking change
- [ ] Documentation update
## Motivation and Context
May address problems reported in apple#877.
## Testing
- [x] Tested locally
- [ ] Added/updated tests
- [ ] Added/updated docs
commit f7bcb68
Author: Santosh Bhavani <santosh.bhavani@live.com>
Date: Sun Dec 7 10:56:50 2025 -0800
Add --max-concurrent-downloads flag for parallel layer downloads (apple#716)
Adds `--max-concurrent-downloads` flag to `container image pull` for
configurable concurrent layer downloads.
Fixesapple#715
Depends on apple/containerization#311
**Usage**:
```bash
container image pull nginx:latest --max-concurrent-downloads 6
```
**Changes**:
- Add CLI flag (default: 3)
- Thread parameter through XPC stack
- Update to use forked containerization with configurable concurrency
**Performance**: ~1.2-1.3x faster pulls for multi-layer images with
higher concurrency
**Tests**: Included standalone tests verify concurrency behavior and
parameter flow
---------
Co-authored-by: Claude <noreply@anthropic.com>
Mcrich23 added a commit to Mcrich23/container that referenced this pull request Jan 22, 2026
commit 69445b9
Author: jwhur <57657645+JaewonHur@users.noreply.github.com>
Date: Mon Jan 19 13:09:34 2026 -0800
Throw error when starting a container with invalid virtiofs source (apple#1051)
Run = Create + Start
1) Mount source points to a valid directory
- Run and Create + Start both correctly create the container with mount.
2) Mount source points to a file
- Run fails bootstrapping the container, thus container not created.
- Create creates the container, but Start fails bootstrapping, removing
the container. (Thus, both are the same.)
3) Mount source deleted or replaced to file after container created
- Start throw errors but do not delete the container.
commit 08f48d9
Author: Danny Canter <danny_canter@apple.com>
Date: Fri Jan 16 21:48:58 2026 -0800
ContainerSvc: Handle unexpected sandbox svc exits (apple#1065)
Closesapple#1050
If the sandbox svc exits out of band of the usual stop (or regular exit)
case the container svc's state is not properly updated for the
container. This was due to the cleanup steps involving trying to send
the shutdown rpc which cannot succeed as the sandbox svc does not exist
to service it.
To handle this, let's treat shutdown not returning successfully as
non-fatal (as this is mostly best effort), log an error and continue the
state cleanup.
commit b928e3f
Author: Amir Alperin <me@remotecpp.dev>
Date: Sat Jan 17 07:43:48 2026 +0200
fix: performance warning should not output ANSI codes if stderr redirected (apple#1059)
commit 744e7f7
Author: J Logan <john_logan@apple.com>
Date: Fri Jan 16 16:26:13 2026 -0800
Update for containerization 0.21.0. (apple#1056)
- Update image load and build to handle rejected paths during tar
extraction. For the image load command there is now a `--force` function
that fails extractions with rejected paths when false, and just warns
about the rejected paths when true.
- Update `container stats` for statistics API properties now all being
optional.
## Type of Change
- [x] Bug fix
- [ ] New feature
- [ ] Breaking change
- [x] Documentation update
## Motivation and Context
See above
## Testing
- [x] Tested locally
- [x] Added/updated tests
- [x] Added/updated docs
commit b1577d8
Author: J Logan <john_logan@apple.com>
Date: Fri Jan 16 15:50:47 2026 -0800
Adds opt-in pre-commit hook for format and header checks. (apple#1062)
- Closesapple#639.
- Adds swift format configuration that removes lint checks so we can use
`swift lint` to perform format-only tests.
- Adds `check` target that invokes format and header checks.
- Adds pre-commit script that runs `make check`.
- Adds `pre-commit` target that installs the check script as a
pre-commit hook.
## Type of Change
- [ ] Bug fix
- [x] New feature
- [ ] Breaking change
- [x] Documentation update
## Motivation and Context
Avoids wasting time and commit rewrites.
## Testing
- [x] Tested locally
- [ ] Added/updated tests
- [x] Added/updated docs
commit 3cf2c6a
Author: J Logan <john_logan@apple.com>
Date: Fri Jan 16 13:41:32 2026 -0800
Fix unstable integration tests. (apple#1060)
- TestCLIRunCommand now run so many tests concurrently that the API
server gets swamped and tests randomly time out.
- The parallelism options on `swift test` only work for XCTest, not
swift-testing.
- Work around this while retaining some parallelism (good for stress
testing) by breaking the tests into two suites.
commit 8897fcc
Author: Manu Schiller <56154253+manuschillerdev@users.noreply.github.com>
Date: Wed Jan 14 04:39:08 2026 +0100
fix: use pax instead of tar for pkg payload extraction (apple#1038)
- It is common to have `gnu-tar` alongside other GNU tools
installed and aliased for compatibility reasons. However, this
breaks the current make build.
- Use BSD-only binaries (no GNU equivalents that are
commonly aliased), making the Makefile more portable.
commit dbec1db
Author: Ronit Sabhaya <ronitsabhaya75@gmail.com>
Date: Mon Jan 12 20:34:25 2026 -0600
Add support for aarch64 architecture alias (apple#1040)
- Adds `aarch64` as an alias for `arm64` in the `Arch` enum. This
addresses the maintainer's request to support this common architecture
name, ensuring consistency with `x86_64` normalization and preventing
failures for users expecting `aarch64` support.
commit 837aa5e
Author: jwhur <57657645+JaewonHur@users.noreply.github.com>
Date: Mon Jan 12 14:36:10 2026 -0800
Fix the FS error when using Virtualization (apple#1041)
- Fixesapple#614.
- Use VZ cached mode instead of auto.
Signed-off-by: jwhur <jaewon_hur@apple.com>
commit e465b10
Author: 박성근 <117553364+ParkSeongGeun@users.noreply.github.com>
Date: Tue Jan 13 03:30:51 2026 +0900
Fix relative path resolution in entrypoint (apple#987)
- Fixesapple#962.
- Adds test to exercise apple/containerization#473.
- Updates containerization to 0.20.1.
Signed-off-by: ParkSeongGeun <phd0801@naver.com>
commit aa77928
Author: Ronit Sabhaya <ronitsabhaya75@gmail.com>
Date: Mon Jan 12 12:04:46 2026 -0600
Fix: Support x86_64 architecture alias to prevent silent pull failure… (apple#1036)
- Adds architecture name normalization to accept
`x86_64` and `x86-64` as aliases for `amd64`.
commit dc4682b
Author: Amir Alperin <me@remotecpp.dev>
Date: Fri Jan 9 21:10:53 2026 +0200
fix: extract hostname from FQDN (apple#1011) (apple#1017)
- Set the container hostname to the first DNS
label derived from the container id, strip everything
after the first dot.
- Fixesapple#1011.
commit 4af1cc0
Author: Ronit Sabhaya <ronitsabhaya75@gmail.com>
Date: Thu Jan 8 21:27:43 2026 -0600
fix: improve error message when binding to privileged ports (fixesapple#978) (apple#1031)
- The container fails to start with a generic "permission denied"
error when attempting to publish privileged ports (ports below
1024) without root privileges. This provides a confusing user
experience as the error doesn't explain why permission was
denied.
commit 21facf0
Author: J Logan <john_logan@apple.com>
Date: Thu Jan 8 17:02:22 2026 -0800
Add instructions for using locally built init filesystem. (apple#1032)
- Closesapple#1030.
commit b671690
Author: Danny Canter <danny_canter@apple.com>
Date: Wed Jan 7 21:01:10 2026 -0800
ProgressBar: Various fixes (apple#1025)
There's a couple things I don't think are intuitive about this.
1. Because of the internal task, render() can still be called even after
finish() completes. Ideally async defers are supported and we could just
await the final render completing after cancelling the task and setting
.finished, but alas. To fix this we can just lock across the methods for
now.
2. We always clear the screen in the destructor, even if we don't use
the
progress bar. I don't think we should honestly do anything in the
destructor.
Feels a programmer error not to defer { bar.finish() } or call it
somewhere.
3. Our spaces based line clearing. Use the ansi escape sequence for
clearing line;
I think our calculations were slightly off and it would leave trailing
output ( "s]" )
in some cases.
4. Shrinking the window until the output is smaller than the terminal
window (and vice
versa) is wonky on various term emulators. Truthfully, this is just a
hard problem,
but we can truncate our output and still provide some useful info.
This fixes some single line output (cat /etc/hostname etc.) getting
cleared in our atexit handler, as well as the need for the usleep.
commit 98410fd
Author: J Logan <john_logan@apple.com>
Date: Wed Jan 7 18:23:31 2026 -0800
Adds IPv6 port forwarding. (apple#1029)
- Closesapple#1006.
commit 9d06475
Author: Saehej Kang <saehej.kang@gmail.com>
Date: Wed Jan 7 16:53:33 2026 -0800
[container]: add startedDate field (apple#1018)
- Closesapple#302.
- Closesapple#336 (obsoletes this PR).
commit db8932a
Author: J Logan <john_logan@apple.com>
Date: Wed Jan 7 15:35:35 2026 -0800
Resolve IPv6 address queries for container names. (apple#1016)
- Closesapple#1005.
- Adapt everything to use MACAddress type from containerization 0.20.0.
- Allocate MAC addresses for every container so that we have
deterministic IPv6 link local addresses.
- Add AAAA handling to ContainerDNSHandler.
- NOTE: Only works on Tahoe. On Sequoia, we don't have a good way to set
or determine the IPv6 network prefix when networks are created, so we
can't infer the IPv6 link local addresses for AAAA responses and we
instead return `NODATA`.
commit 5d6c750
Author: Danny Canter <danny_canter@apple.com>
Date: Wed Jan 7 14:48:58 2026 -0800
CLI: Add read-only flag to run/create (apple#999)
Closesapple#990
Sets the rootfs for a container to read-only.
commit aac2457
Author: Danny Canter <danny_canter@apple.com>
Date: Wed Jan 7 13:46:26 2026 -0800
Tests: Fix relative path mount tests (apple#1028)
The tests are run in parallel on CI, and were split into three tests.
They change the cwd, so it's kind of a gamble whether some of them pass.
This just moves all the logic into one test mostly.
commit 9cd5397
Author: J Logan <john_logan@apple.com>
Date: Wed Jan 7 10:35:19 2026 -0800
Update to containerization 0.20.0. (apple#1027)
- Use MACAddress for Attachment and CZ interfaces.
- Move data validation closer to API surface.
commit 356c8d2
Author: J Logan <john_logan@apple.com>
Date: Tue Jan 6 08:27:14 2026 -0800
Reorganize client libraries. (apple#1020)
- Closesapple#461.
- Extract core types into ContainerResources target.
- Extract ContainerNetworkServiceClient from ContainerNetworkService.
- Relocate sandbox client from ContainerClient to
ContainerSandboxServiceClient.
- Relocate ContainerClient to ContainerAPIServiceClient.
- Common structure from services and clients under Source/Services.
Updated project hierarchy:
```
Sources/CAuditToken - audit token access wrapper
Sources/CLI - CLI executable
Sources/ContainerBuild - builder
Sources/ContainerCommands - CLI command implementations
Sources/ContainerLog - logging helpers
Sources/ContainerPersistence - persistent data and system property helpers
Sources/ContainerPlugin - plugin system
Sources/ContainerResource - resource (container, image, volume, network) types
Sources/ContainerVersion - version helpers
Sources/ContainerXPC - XPC helpers
Sources/CVersion - injected project version
Sources/DNSServer - container DNS resolver
Sources/Helpers - service executables
Sources/Services/*/Client - service clients
Sources/Services/*/Server - service implementations
Sources/SocketForwarder - port forwarding
Sources/TerminalProgress - progress bar
```
## Type of Change
- [ ] Bug fix
- [ ] New feature
- [x] Breaking change
- [ ] Documentation update
## Motivation and Context
The ContainerClient library was a bit of a grab bag. This refactor
applies a more sensible project and library structure for resource data
types, services, and clients.
## Testing
- [x] Tested locally
- [x] Added/updated tests
- [ ] Added/updated docs
commit 8c439cd
Author: Danny Canter <danny_canter@apple.com>
Date: Mon Jan 5 13:50:57 2026 -0800
makefile: Add cli target (apple#1022)
Often times I'll be making a change that only touches the cli and I
don't feel like sitting through the potential song and dance of the
other components building/installing.
commit d6f052d
Author: Kathryn Baldauf <k_baldauf@apple.com>
Date: Mon Jan 5 13:09:34 2026 -0800
Update license header on all files to include the current year (apple#1024)
## Motivation and Context
Now that we're in 2026, we need to update the license headers on all the
files. Unfortunately, Hawkeye doesn't have an attribute for the current
year to help us avoid this in the future. Instead, I had to work around
this by doing the following:
1. Update licenserc.toml with:
```
[properties]
... (other properties)
currentYear = "2026"
```
2. Update scripts/license-header.txt with
```
Copyright ©{{ " " }}{%- set created = attrs.git_file_created_year or
attrs.disk_file_created_year -%}{%- set modified = props["currentYear"]
-%}{%- if created != modified -%} {{created}}-{{modified}}{%- else
-%}{{created}}{%- endif -%}{{ " " }}{{ props["copyrightOwner"] }}.
```
Then I removed these two changes before committing. After this PR is
merged, all files will have recently had git updates, so the existing
code for setting the modified year should work as intended.
Signed-off-by: Kathryn Baldauf <k_baldauf@apple.com>
commit 20dc0bc
Author: Danny Canter <danny_canter@apple.com>
Date: Sun Jan 4 11:11:09 2026 -0800
Parser: Support relative paths for --volume (apple#1013)
commit 028e7e1
Author: Danny Canter <danny_canter@apple.com>
Date: Sun Jan 4 10:52:46 2026 -0800
Deps: Bump Containerization to 0.19.0 (apple#1015)
Has read-only rootfs support.
commit 020949e
Author: Danny Canter <danny_canter@apple.com>
Date: Sun Jan 4 10:51:20 2026 -0800
CLI: Small fixups for implicit envvars (apple#1014)
We should only inherit from the host if there's no =. Additionally
document the flag a little more to show that we can inherit from the
host.
commit df368b7
Author: Amir Alperin <alperin.amir@gmail.com>
Date: Sun Jan 4 20:49:22 2026 +0200
Fix port validation to allow same port for different protocols (apple#992) (apple#1000)
- Fixes: apple#992
- Port validation previously rejected valid configurations
when the same port number was used for different
protocols (TCP and UDP). For example:
`-p 1024:1024/udp -p 1024:1024/tcp`
Although this is a valid and common use case, the
validation logic treated it as a conflict.
To fix this, I updated the validation key to include the protocol name.
The validation now checks for overlapping port numbers only within the
same protocol, rather than across all protocols.
This change enables binding the same port number for both TCP and UDP,
aligning the validation behavior with real-world networking
requirements.
## Testing
- [x] Tested locally
- [x] Added/updated tests
- [ ] Added/updated docs
commit cf64614
Author: J Logan <john_logan@apple.com>
Date: Fri Jan 2 14:10:48 2026 -0800
Update OSS header in Package.swift. (apple#1010)
commit 375ce16
Author: J Logan <john_logan@apple.com>
Date: Fri Jan 2 12:09:12 2026 -0800
Fix OSS header dates that break CI checks. (apple#1009)
commit 580d853
Author: c <claudeaceae@icloud.com>
Date: Fri Jan 2 00:19:57 2026 -0500
Use full path for uninstall script in upgrade instructions (apple#983)
- Makes the upgrade section consistent with the
uninstall section by using the full path to the
uninstall script.
commit 4cadc40
Author: c <claudeaceae@icloud.com>
Date: Thu Jan 1 22:53:56 2026 -0500
Clarify uninstall script location in README (apple#982)
- Clarifies where the `uninstall-container.sh` script is located after
installation
- Updates example commands to use the full path
commit 4e78e30
Author: c <claudeaceae@icloud.com>
Date: Thu Jan 1 20:57:47 2026 -0500
Fix grammar in tutorial.md (apple#985)
## Summary
- Fixes a grammar error in the tutorial's publish section
## Details
Line 287 of `docs/tutorial.md` had "you need push images" which should
be "you need to push images".
This is a simple grammar fix to improve readability.
## Test plan
- [x] Verified the sentence now reads correctly
commit 22dfd6e
Author: Danny Canter <danny_canter@apple.com>
Date: Thu Jan 1 17:57:00 2026 -0800
CLI: Fix stop not signalling waiters (apple#972)
commit 4958cf2
Author: c <claudeaceae@icloud.com>
Date: Thu Jan 1 20:51:10 2026 -0500
Fix bash completion source path in documentation (apple#981)
- Corrects the source path for bash completion script
when not using bash-completion package.
commit 25ac79a
Author: c <claudeaceae@icloud.com>
Date: Thu Jan 1 20:50:19 2026 -0500
Fix MAC address option typo in how-to documentation (apple#980)
- Corrects the MAC address example command in the
how-to guide to use the correct `--network` flag syntax
instead of the incorrect `--mac-address` flag.
commit edadf15
Author: Raj <realrajaryan@gmail.com>
Date: Thu Jan 1 15:10:39 2026 +0530
Fix container auto-delete on rapid stop/start (apple#841)
Fixesapple#833.
Currently, when stopping and immediately restarting a container, it would fail with the error:
`“container expected to be in created state, got: shuttingDown”` and then be automatically deleted.
The `SandboxService` process waits five seconds before exiting after shutdown. During this interval, a rapid restart could reconnect to the still-terminating process in the `shuttingDown` state, triggering a state validation error.
This fix forcefully terminates the `SandboxService` process with `SIGKILL` upon container exit, instead of waiting five seconds. The bootstrap now defensively checks for and cleans up any stale services before registering new ones, preventing reconnections to processes in the `shuttingDown` state.
commit 5064b0f
Author: J Logan <john_logan@apple.com>
Date: Mon Dec 22 10:16:14 2025 -0800
Adds network IPv6 configuration. (apple#975)
- Part of work for apple#460.
- Enable set/get of IPv6 network prefix in ReservedVmnetNetwork.
- Show IPv6 prefix in `network list` full output.
- Option for setting IPv6 prefix when creating a network.
- System property for default IPv6 prefix.
## Type of Change
- [ ] Bug fix
- [x] New feature
- [ ] Breaking change
- [x] Documentation update
## Motivation and Context
See apple#460.
## Testing
- [x] Tested locally
- [ ] Added/updated tests
- [x] Added/updated docs
commit 9c239aa
Author: Volodymyr Bortniak <25820601+Bortnyak@users.noreply.github.com>
Date: Sat Dec 20 00:36:02 2025 +0100
Add support for reading env from named pipes (apple#974)
This is a fix for
[issue#956](apple#956)
`FileManager.default.contents(atPath:)` returns `nil` for named pipes
(FIFOs)
and process substitutions like `/dev/fd/XX` because:
1. It expects regular files with a known size
2. Named pipes are stream-based and block until data arrives
## Solution
Use `FileHandle(forReadingFrom:)` instead, which:
- Properly handles blocking I/O
- Works with named pipes, process substitutions, and regular files
(mentioned in the
[doc](https://developer.apple.com/documentation/foundation/filehandle))
Co-authored-by: Bortniak Volodymyr <Bortnyak@users.noreply.github.com>
commit 3c3a83c
Author: Danny Canter <danny_canter@apple.com>
Date: Thu Dec 18 16:28:44 2025 -0800
Turn on oops=panic kernel cmdline (apple#971)
commit b1b9980
Author: Michael Gathara <mikegtrm@gmail.com>
Date: Wed Dec 17 20:58:50 2025 -0600
Fix: Kubes Cluster in Container Crashing Container (IS#923) (apple#930)
- Fixes issue apple#923
- I fixed a race condition in `ConnectHandler.swift` where
an asynchronous network connection could complete
after the handler had already been removed from the
pipeline.
- This prevents the EXC_BREAKPOINT crash in
container-runtime-linux that occurred when kinc
(Kubernetes in Container) created rapid connections.
- The actual fix was inadvertently applied in apple#957, so this
PR contains only the test code.
commit 9f4efe0
Author: Saehej Kang <saehej.kang@gmail.com>
Date: Wed Dec 17 00:30:33 2025 -0800
[networks]: add prune command (apple#914)
- Closesapple#893
commit 4f88725
Author: J Logan <john_logan@apple.com>
Date: Tue Dec 16 16:34:13 2025 -0800
Use new IP/CIDR types from Containerization. (apple#957)
- Part of work for apple#460.
- With CZ release 0.17.0, the IP and CIDR address
types changed from String to IPv4Address and
CIDRv4, respectively. This PR applies the corresponding
adaptations to container.
commit 8e16bb2
Author: Salman Chishti <salmanmkc@GitHub.com>
Date: Tue Dec 16 20:14:45 2025 +0000
Upgrade GitHub Actions to latest versions (apple#959)
- Upgrade GitHub Actions to their latest versions for
improved features, bug fixes, and security updates.
Signed-off-by: Salman Muin Kayser Chishti <13schishti@gmail.com>
commit 0c7dca4
Author: Salman Chishti <salmanmkc@GitHub.com>
Date: Tue Dec 16 19:23:31 2025 +0000
Add Dependabot for GitHub Actions updates (apple#960)
## Summary
Add Dependabot configuration to automatically keep GitHub Actions up to
date.
## Changes
Adds `.github/dependabot.yml` configured to:
- Check for GitHub Actions updates weekly
- Group all action updates together for easier review
- Use `ci` prefix for commit messages
## Why
As discussed in apple#958, this helps:
- Keep actions up to date with security patches automatically
- Handle Node runtime deprecations proactively (e.g., Node 20 → Node 24)
- Reduce manual maintenance burden
## Reference
Based on the pattern used in
[swift-nio](https://github.com/apple/swift-nio/blob/main/.github/dependabot.yml).
commit 637c8f1
Author: Salman Chishti <salmanmkc@GitHub.com>
Date: Tue Dec 16 18:15:42 2025 +0000
Upgrade GitHub Actions for Node 24 compatibility (apple#958)
## Summary
Upgrade GitHub Actions to their latest versions to ensure compatibility
with Node 24, as Node 20 will reach end-of-life in April 2026.
## Changes
| Action | Old Version(s) | New Version | SHA |
|--------|---------------|-------------|-----|
| `actions/checkout` | v4 | v6 | `8e8c483` |
| `actions/download-artifact` | v4 | v7 | `37930b1` |
| `actions/upload-artifact` | v4 | v6 | `b7c566a` |
| `actions/labeler` | v5 | v6 | `634933e` |
| `actions/configure-pages` | v5 | v5 | `983d773` |
| `actions/upload-pages-artifact` | v3 | v3 | `56afc60` |
| `softprops/action-gh-release` | v2 | v2 | `a06a81a` |
## Context
Per [GitHub's
announcement](https://github.blog/changelog/2025-09-19-deprecation-of-node-20-on-github-actions-runners/),
Node 20 is being deprecated and runners will begin using Node 24 by
default starting March 4th, 2026.
### Why this matters
- **Node 20 EOL**: April 2026
- **Node 24 default**: March 4th, 2026
- **Action**: Update to latest action versions that support Node 24
### Security
All actions are now **pinned to commit SHAs** instead of mutable version
tags. This provides:
- Protection against tag hijacking attacks
- Immutable, reproducible builds
- Version comments for readability
### Automated Updates
A follow-up PR (apple#960) adds Dependabot configuration to automatically
keep these actions updated with new SHA-pinned versions.
### Testing
These changes only affect CI/CD workflow configurations and should not
impact application functionality. The workflows should be tested by
running them on a branch before merging.
Signed-off-by: Salman Muin Kayser Chishti <13schishti@gmail.com>
commit c22f128
Author: karen heckel <karen.heckel@utexas.edu>
Date: Mon Dec 15 21:16:55 2025 -0800
Feat: customize console output with env variable (apple#952)
Fixesapple#915
Added a new feature to support the passing of buildkit colors for
customizing console output.
commit 9b7cfd8
Author: Saehej Kang <saehej.kang@gmail.com>
Date: Mon Dec 15 17:52:00 2025 -0800
[images]: refactor prune command (apple#941)
- Updates to `image prune` for consistency with how
other `prune` commands are done. Added missing
test cases as well for the command
- Relates to the discussion from apple#914
commit 7d30720
Author: Danny Canter <danny_canter@apple.com>
Date: Thu Dec 11 05:36:15 2025 -0800
CLI: Fix -it not being able to pipe stdout (apple#951)
Fixesapple#949
Typically if one fd is a tty, it's common for all 3 of stdio to be the
same, but that is not always the case. In our case we were using our
Terminal type from Containerization to comb through err/out/in and give
us a type backed by one of the 3 if -t was supplied. It happens that
stderr is the first we check, so our Terminal() is backed by fd 2. This
change modifies things so that we always initialize our Terminal if
asked for with fd 0, and out/err are backed by their corresponding
correct fd number.
## Type of Change
- [x] Bug fix
- [ ] New feature
- [ ] Breaking change
- [ ] Documentation update
## Testing
- [x] Tested locally
- [ ] Added/updated tests
- [ ] Added/updated docs
commit a2901e0
Author: wangxiaolei <fatelei@gmail.com>
Date: Wed Dec 10 10:04:40 2025 +0800
feat: implement version sub command (apple#911)
- closesapple#383
- implement version sub command, give more info
---------
Co-authored-by: fatelei <fatelei@fateleis-MacBook-Pro.local>
commit 0cde1ef
Author: Danny Canter <danny_canter@apple.com>
Date: Tue Dec 9 13:24:45 2025 -0800
Deps: Bump Containerization to 0.16.2 (apple#947)
Closesapple#928
Has a cgroup fix when stopping certain containers
commit 3896055
Author: Dmitry Kovba <dkovba@apple.com>
Date: Tue Dec 9 12:32:28 2025 -0800
Lowercase error messages (apple#945)
## Type of Change
- [x] Bug fix
- [ ] New feature
- [ ] Breaking change
- [ ] Documentation update
## Motivation and Context
For consistency, all error messages are lowercased.
## Testing
- [ ] Tested locally
- [ ] Added/updated tests
- [ ] Added/updated docs
---------
Co-authored-by: J Logan <sgtbakerrahulnet@yahoo.com>
commit 0733a81
Author: Saehej Kang <saehej.kang@gmail.com>
Date: Tue Dec 9 10:54:37 2025 -0800
[volumes]: refactor prune command (apple#940)
- Refactor the `volume prune` command to follow a client-side approach.
The `volumeDiskUsage` is calculated in the service file, so it made
sense to leave that there.
- Relates to the discussion from apple#914
commit 42528e6
Author: Kathryn Baldauf <k_baldauf@apple.com>
Date: Tue Dec 9 10:42:27 2025 -0800
Update CONTRIBUTORS to MAINTAINERS and point at containerization (apple#942)
## Type of Change
- [x] Documentation update
## Motivation and Context
See apple/containerization#435 for more
information on this change.
commit a64bd77
Author: J Logan <john_logan@apple.com>
Date: Tue Dec 9 14:35:34 2025 -0300
Fix broken image integration tests. (apple#944)
- Fixesapple#943.
- Use images other than alpine:3.20 for image concurrency test so as not
to interfere with tests using that image.
- Rename test files to match suite names.
commit ab92f39
Author: TTtie <me@tttie.cz>
Date: Mon Dec 8 18:17:10 2025 +0100
fix(TerminalProgress): make the progress bar respect locale-specific decimal separator (apple#936)
- The `ProgressBar#adjustFormattedSize` function currently expects a
decimal dot when adding the additional ".0" to the size. This, however,
breaks when a region with a non-dot decimal separator is used.
commit 420be74
Author: J Logan <john_logan@apple.com>
Date: Mon Dec 8 03:00:02 2025 -0300
Data integrity: bump to cz 0.16.1, adjust sync mode. (apple#939)
- 0.16.1 changes an ext4 superblock setting that might have been causing
problems.
- apple#877 fixed an issue where the cache and sync settings for block
filesystems weren't being passed down to the VZ virtual machine
configuration. The default sync value getting passed down is `full`,
which reduces I/O performance. Relax this to use `fsync` for now.
## Type of Change
- [*] Bug fix
- [ ] New feature
- [ ] Breaking change
- [ ] Documentation update
## Motivation and Context
May address problems reported in apple#877.
## Testing
- [x] Tested locally
- [ ] Added/updated tests
- [ ] Added/updated docs
commit f7bcb68
Author: Santosh Bhavani <santosh.bhavani@live.com>
Date: Sun Dec 7 10:56:50 2025 -0800
Add --max-concurrent-downloads flag for parallel layer downloads (apple#716)
Adds `--max-concurrent-downloads` flag to `container image pull` for
configurable concurrent layer downloads.
Fixesapple#715
Depends on apple/containerization#311
**Usage**:
```bash
container image pull nginx:latest --max-concurrent-downloads 6
```
**Changes**:
- Add CLI flag (default: 3)
- Thread parameter through XPC stack
- Update to use forked containerization with configurable concurrency
**Performance**: ~1.2-1.3x faster pulls for multi-layer images with
higher concurrency
**Tests**: Included standalone tests verify concurrency behavior and
parameter flow
---------
Co-authored-by: Claude <noreply@anthropic.com>
saehejkang pushed a commit to saehejkang/container that referenced this pull request Jan 23, 2026
…pple#1051)
Run = Create + Start
1) Mount source points to a valid directory
- Run and Create + Start both correctly create the container with mount.
2) Mount source points to a file
- Run fails bootstrapping the container, thus container not created.
- Create creates the container, but Start fails bootstrapping, removing
the container. (Thus, both are the same.)
3) Mount source deleted or replaced to file after container created
- Start throw errors but do not delete the container.
saehejkang pushed a commit to saehejkang/container that referenced this pull request Jan 27, 2026
…pple#1051)
Run = Create + Start
1) Mount source points to a valid directory
- Run and Create + Start both correctly create the container with mount.
2) Mount source points to a file
- Run fails bootstrapping the container, thus container not created.
- Create creates the container, but Start fails bootstrapping, removing
the container. (Thus, both are the same.)
3) Mount source deleted or replaced to file after container created
- Start throw errors but do not delete the container.
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants

@JaewonHur@jglogan@dcantah
, 'i'); if (__m === '*' || __re.test(location.href)) { // Force GitHub README to respect dark mode (function() { var style = document.createElement('style'); style.textContent = ' .markdown-body { color-scheme: dark light; } .markdown-body pre { background: #161b22 !important; } .markdown-body code { background: rgba(110, 118, 129, 0.4) !important; } .markdown-body table th, .markdown-body table td { border-color: #30363d !important; } .markdown-body img { background: #0d1117; } .markdown-body blockquote { border-left-color: #8b949e; } .markdown-body hr { border-color: #30363d; } '; document.head.appendChild(style); })(); } } catch(__e) { console.warn('[Userscript:GitHub Dark Mode README Fix]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + ' Throw error when starting a container with invalid virtiofs source by JaewonHur · Pull Request #1051 · apple/container · GitHub
Skip to content

Throw error when starting a container with invalid virtiofs source - #1051

Merged
jglogan merged 2 commits into
apple:mainfrom
JaewonHur:check-virtiofs-deleted
Jan 19, 2026
Merged

Throw error when starting a container with invalid virtiofs source#1051
jglogan merged 2 commits into
apple:mainfrom
JaewonHur:check-virtiofs-deleted

Conversation

@JaewonHur

Copy link
Copy Markdown
Contributor

Run = Create + Start

  1. Mount source points to a valid directory

    • Run and Create + Start both correctly create the container with mount.
  2. Mount source points to a file

    • Run fails bootstrapping the container, thus container not created.
    • Create creates the container, but Start fails bootstrapping, removing the container. (Thus, both are the same.)
  3. Mount source deleted or replaced to file after container created

    • Start throw errors but do not delete the container.

Type of Change

  • Bug fix
  • New feature
  • Breaking change
  • Documentation update

Motivation and Context

User can encounter unexpected container removal when shared volume source is in wrong state.

Testing

  • Tested locally
  • Added/updated tests
  • Added/updated docs

@JaewonHur
JaewonHurforce-pushed the check-virtiofs-deleted branch from 2841247 to b7f738dCompareJanuary 14, 2026 20:10
@jglogan

Copy link
Copy Markdown
Contributor

Seeing this test failure:

◇ Suite TestCLINoParallelCases started.
◇ Test testImageSingleConcurrentDownload() started.
✔ Test testImageSingleConcurrentDownload() passed after 0.862 seconds.
◇ Test testImageManyConcurrentDownloads() started.
✔ Test testImageManyConcurrentDownloads() passed after 0.704 seconds.
◇ Test testImagePruneNoImages() started.
✔ Test testImagePruneNoImages() passed after 0.184 seconds.
◇ Test testImagePruneUnusedImages() started.
✘ Test testImagePruneUnusedImages() recorded an issue at TestCLINoParallelCases.swift:81:9: Expectation failed: (output → "untagged registry.local/stdin-file:10E1258F-6DC1-40EB-80F1-F18471AEA98E
untagged ghcr.io/apple/containerization/vminit:0.20.1
untagged test-alpine-env:DC582421-DD5D-496F-BE47-C39EB2F5693B
untagged test-env-child:0CE91A3D-E1F0-4FB5-A4FB-8375E9FD7A47
untagged ghcr.io/containerd/busybox:1.36
untagged ghcr.io/containerd/busybox:testImageSaveAndLoadStdinStdout
untagged ghcr.io/linuxcontainers/alpine:testImageTag
untagged registry.local/multi-arch:326BD5F0-39E8-4681-B6EB-EC89A17E200E
untagged test-env-only:FB98ED08-8994-422B-9695-B8F22E806E05
untagged ghcr.io/containerd/busybox:testImageSaveAndLoad
untagged registry.local/add-all:A45C78C8-BCC9-4DB3-B736-BF36D37A6E28
untagged registry.local/multi-tag-test:latest
untagged ghcr.io/apple/container-builder-shim/builder:0.7.0
untagged registry.local/build-arg:8B2B8285-79D0-4D46-8281-A098B10AEAB6
untagged registry.local/build-symlinks:A8449327-D470-4794-9043-3665EFF0ADEB
untagged registry.local/multi-tag-test:EA0E05B5-867A-4DDF-A10D-85E40ED26052
untagged registry.local/build-network-access:CB58B319-C954-48B9-9A13-CB5957221C40
untagged ghcr.io/linuxcontainers/alpine:testImageSaveAndLoad
untagged test-label-only:C04AAD7A-8D05-45FE-B48B-C0648395C196
untagged from-local:7D176AF6-90F2-44D3-8624-56DF2DA194F7
untagged registry.local/scratch-add:BED25DA9-D9CD-4F92-A67F-2097B0326FB4
untagged docker.io/library/python:alpine
untagged ghcr.io/username/image-name:mytag
untagged ghcr.io/linuxcontainers/alpine:3.18
untagged registry.local/dockerfile-keywords:E77F2AF6-241A-4E61-B9C9-98BCEC65D8BB
untagged test-env-base:6CA5943D-47B0-4669-A26F-2963D3FEBE7C
untagged registry.local/dot-file:44442DC8-DC1C-468A-A3A6-5F98F98F0AC4
untagged registry.local/from-previous-layer:4FDB702C-0369-4162-997E-ABB9365BA918
untagged test-build-and-run:latest
untagged local-only:E87D38F9-F823-4F9E-BB50-50CF93725ED0
untagged test-complex-env:F26FA244-7D12-4C64-A8E5-A4323254C645
untagged ghcr.io/linuxcontainers/alpine:testImageSaveAndLoadStdinStdout
untagged registry.local/scratch-add-special-dir:1A1B8E39-3746-4563-9F11-C1926C7A84E3
untagged registry.local/multi-tag-test:v1.0.0
untagged registry.local/build-diff-context:24D7C51D-4A52-4B51-A660-9129E0824C5B
deleted 193d51b116e20bdd28a9b292a008ec7a446758e6b4bea1a09801848ce32aa68c
deleted 86852de7f69d89c037ced2f78afa323976a44a10f8ac96626aa97b85ea160c34
deleted dae9190ee1dfeaa618a111d20058289d5cab7cb78105045fc9c887296f4db76d
deleted 96c8bb09dc1a2e998a574217f921911029d197c1f40bf81eb983286d484f74b0
deleted fd65fd9f19f58489ad910135803d1d89928927820d73110adefa161932cd335a
deleted b49eda688ce8c1226b6d7e02969f22361a8874cfee14c603e98ad855f1267a94
deleted 3a065aab44645209c4c3d3746f31b17cd6048a4148f890ed0fe9128baab9f553
deleted 9f9c4097a5eeb3e1b0f4fecaea5bbbe7da91f1d5e5ebb798b49047eca8e3e053
deleted be7d6d554a4bcc2b43d042f800f8f75055063ba668b9c7d60c831b16c0f26d3c
deleted ad499d8d07ad9998ee30577b376b76036eec716352318f550f5cec2cdfe5bfb1
deleted 46758452d3eef8cacb188405495d52d265f0c3a7580dfec51cb627c04c7bafc4
deleted c1d35649879861aec54f6ee4b049d573fd0e876178c558664af8da0eb0313b3d
deleted b333a6ba512596007c2683825dd364570303624164926019bbe674d90c28d5fc
deleted 29e4011ec5ddd973132dc62a298532cf7e74ed52accb51dcabdde661c4b35e88
deleted 69a77b9e82a72c35ec6ef0440fc5e3d0d32cc3235dcf9953f938d0c00bc2592f
deleted 469f7b67563d268cf25bb109da2d34e54c8b6ecf46f217c153260ab19bb016b6
deleted 430c16482b7d918525165f02610d7d24692dbdb96c02662a4be1b11cfe9144e6
deleted 77ed5ebc3d9d48581e8afcb75b4974978321bd74f018613483570fcd61a15de8
deleted bfa33b545f308b89bfcdc2f1494a8b33eb4942225428283684bf724802af9feb
deleted c21043749f3985bf7b16d9f5dcb64761f4571f2f50995486f0303fbfa63af1a2
deleted f62ebdf5041307d70c3b258918b2b7fe65f9470020c100b2369288e69a46602f
deleted b8867b6470fa5a2ad4993cdfa8407c089792c9ca28a99246628bc1b093afaf61
deleted a5ca0b27295ac877b32fed9056cd9e0685aa103880b5b4608fa018a7b2675ebe
deleted 44f35edb16d2a3aa958968b4825b37b2decb9bb1021522a02815b3ec3f9fe378
deleted 4c2e345eb1c3ec2b19a9e4c3ee422a8b01d280bcea5c4b4d3144aace2e231d82
deleted f1139c06d62421bbf77cec7852ff280a151d6d44f8964534b4a01f00bd745613
deleted f6b4fb9446345fcad2db26eac181fef6c0a919c8a4fcccd3bea5deb7f6dff67e
deleted b0c2909d1da88c295531b3acb353524ebc452d70a198d012df008a0c2f30a70a
deleted 6495489e65b7e1f05fff4e6828ece2ce1b0d5cf5b0bd740bb0d0b1185803c8a3
deleted 74b67d9de7c0a62fd14e11a737e0f6ed8fa9d0803c0ecbde23ff302e7523495f
deleted f78e6840ded1aafb6c9f265f52c2fc7c0a990813ccf96702df84a7dcdbe48bea
deleted 8a6eaca30cf8f88d713fd5040661cefa076b0e809dc27a52e38863c567531379
deleted 8ceaa5e44e0777ada21c9afb0afbc0b2ff35f3836d185d019982004e0ba04fc7
deleted 2bc9dea49d1a226db134bce761bfa89dd456109555c3ee4c490db84ad48d53b0
deleted 7fd44050a834a9d06057d8d20b5d7c11e37682ad42d2b64bdc9112118262a3d2
deleted e954aa43bc3d58a30a967d36b0b0ebf408eea4b1283106d2ca553b0243858d6b
deleted 5a6960d24672eeb3ab99648411781c92a07e762305fd81152a600d3fadb68b33
deleted 4ff685e2bcafdab0d2a9b15cbfd9d28f5dfe69af97e3bb1987ed483b0abf5a99
deleted b07db1bde08dc5ef78326cace055da8387ab54dc352f0e786acfb2efa43b6f45
deleted 9e240dbce563eba2b4cfb6f86247dc75047c1b2a6a54dba00129f113737f4880
deleted c3505dfdb7a6ef524d17d0ee391749f94de950c43642e3286e06172577e184a3
deleted c7dc643c3cfd3d741403be633468db3858d7ec09034ccb10b86836165f600607
deleted 8a49fdb3b6a5ff2bd8ec6a86c05b2922a0f7454579ecc07637e94dfd1d0639b6
deleted 16184b59f4c7ede13940875705528ce315e96c08c4fcbab3c69676a9cef17159
deleted d7ce2729f5f4d1716be99bc2376a7ea2906d293543c4bcd31693e569e6c04fee
deleted 65c9c10b984f059d0a8b8a054ae2d7ee817ce2caf06ade436074dc89dfbf0717
Reclaimed 3.35 GB in disk space
").contains(alpine → "ghcr.io/linuxcontainers/alpine:3.20")
↳ should prune alpine image
✘ Test testImagePruneUnusedImages() recorded an issue at TestCLINoParallelCases.swift:86:9: Expectation failed: alpineRemoved
↳ expected image ghcr.io/linuxcontainers/alpine:3.20 to be removed
✘ Test testImagePruneUnusedImages() failed after 21.787 seconds with 2 issues.
◇ Test testImagePruneDanglingImages() started.
✔ Test testImagePruneDanglingImages() passed after 69.015 seconds.
➜ Test testNetworkPruneNoNetworks() skipped: "Requires macOS 26"
➜ Test testNetworkPruneUnusedNetworks() skipped: "Requires macOS 26"
➜ Test testNetworkPruneSkipsNetworksInUse() skipped: "https://github.com/apple/container/issues/953"
➜ Test testNetworkPruneSkipsNetworkAttachedToStoppedContainer() skipped: "https://github.com/apple/container/issues/953"
✘ Suite TestCLINoParallelCases failed after 92.555 seconds with 2 issues.
↳ /// Tests that need total control over environment to avoid conflicts.
✘ Test run with 9 tests in 1 suite failed after 92.555 seconds with 2 issues.

@JaewonHur

JaewonHur commented Jan 15, 2026

Copy link
Copy Markdown
ContributorAuthor

Previous failures may have affect the following ones.
Not sure what's the first test case causing the issue... no test seems touching the code I updated.

Below is the failing test cases in git action. Could we try testing again to check it reproduces the same?

2026-01-14T23:29:22.6911480Z ✘ Test testRunCommandPlatform() failed after 77.334 seconds with 1 issue.
2026-01-14T23:29:22.6911960Z ✘ Test testRunDefaultHostsEntries() failed after 77.334 seconds with 1 issue.
2026-01-14T23:47:36.1332820Z ✘ Test testImagePruneUnusedImages() failed after 21.787 seconds with 2 issues.

@JaewonHur
JaewonHurforce-pushed the check-virtiofs-deleted branch from b7f738d to e840b77CompareJanuary 15, 2026 01:53
@JaewonHur

Copy link
Copy Markdown
ContributorAuthor

Integration test succeeded on my Mac.

✔ Suite TestCLINetwork passed after 16.947 seconds.
✔ Suite TestCLIRunLifecycle passed after 3.351 seconds.
✔ Suite TestCLIExecCommand passed after 3.131 seconds.
✔ Suite TestCLICreateCommand passed after 5.006 seconds.
✔ Suite TestCLIRunCommand passed after 56.832 seconds.
✔ Suite TestCLIStatsCommand passed after 6.962 seconds.
✔ Suite TestCLIImagesCommand passed after 36.785 seconds.
✔ Suite TestCLITermIO passed after 1.346 seconds.
✔ Suite TestCLIRunBase passed after 1.346 seconds.
✔ Suite CLIBuilderEnvOnlyTest passed after 24.335 seconds.
✔ Suite CLIBuilderLifecycleTest passed after 4.038 seconds.
✔ Suite CLIBuilderLocalOutputTest passed after 4.220 seconds.
✔ Suite CLIBuilderTarExportTest passed after 5.943 seconds.
✔ Suite CLIBuilderTest passed after 38.796 seconds.
✔ Suite TestCLIBuildBase passed after 77.334 seconds.
✔ Suite TestCLIVolumes passed after 19.690 seconds.
✔ Suite TestCLIKernelSet passed after 108.282 seconds.
✔ Suite TestCLIAnonymousVolumes passed after 26.928 seconds.
✔ Suite TestCLINoParallelCases passed after 40.251 seconds.

Comment on lines +73 to +77
for mount in container.configuration.mounts where mount.isVirtiofs {
if !FileManager.default.fileExists(atPath: mount.source) {
throw ContainerizationError(.invalidState, message: "path '\(mount.source)' is not a directory")
}
}

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Is it possible for us to do this in bootstrap in the API server instead?

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

It could be, but it might be duplicated as ClientCreate and ClientRun checks the mount source also.

Current bootstrap implicitly does it as making VM throws an error due to the wrong mount source path.
The thing is then, the container is just removed forever due to the cleanup logic.

@JaewonHur

Copy link
Copy Markdown
ContributorAuthor

It seems RunCommand fails randomly due to the XPC timeout when creating the container, but API server actually created the container internally.

✘ Test testRunCommandOSArch() recorded an issue at TestCLIRunCommand.swift:298:25: Issue recorded
↳ failed to run container .executionFailed("command failed: \u{1B}[33mWarning!\u{1B}[0m Running debug build. Performance may be degraded.\nError: internalError: \"failed to create container\" (cause: \"internalError: \"XPC timeout for request to com.apple.container.apiserver/containerCreate\"\")\n")
2
✘ Test testRunCommandOSArch() failed after 84.430 seconds with 1 issue.

Since the container is not cleaned up in the earlier test, image prune fails as alpine image is not dangling.

✘ Test testImagePruneUnusedImages() recorded an issue at TestCLINoParallelCases.swift:86:9: Expectation failed: alpineRemoved
↳ expected image ghcr.io/linuxcontainers/alpine:3.20 to be removed
✘ Test testImagePruneUnusedImages() failed after 20.391 seconds with 2 issues.

@JaewonHur
JaewonHurforce-pushed the check-virtiofs-deleted branch from e840b77 to 2a0ef3dCompareJanuary 16, 2026 22:18
Run = Create + Start
1) Mount source points to a valid directory
- Run and Create + Start both correctly create the container with
mount.
2) Mount source points to a file
- Run fails bootstrapping the container, thus container not created.
- Create creates the container, but Start fails bootstrapping,
removing the container.
(Thus, both are the same.)
3) Mount source deleted or replaced to file after container created
- Start throw errors but do not delete the container.
@JaewonHur
JaewonHurforce-pushed the check-virtiofs-deleted branch from 20d55c9 to 39cce7bCompareJanuary 19, 2026 07:27
@jglogan
jglogan merged commit 69445b9 into apple:mainJan 19, 2026
3 of 4 checks passed
Mcrich23 added a commit to Mcrich23/container that referenced this pull request Jan 20, 2026
commit 69445b9
Author: jwhur <57657645+JaewonHur@users.noreply.github.com>
Date: Mon Jan 19 13:09:34 2026 -0800
Throw error when starting a container with invalid virtiofs source (apple#1051)
Run = Create + Start
1) Mount source points to a valid directory
- Run and Create + Start both correctly create the container with mount.
2) Mount source points to a file
- Run fails bootstrapping the container, thus container not created.
- Create creates the container, but Start fails bootstrapping, removing
the container. (Thus, both are the same.)
3) Mount source deleted or replaced to file after container created
- Start throw errors but do not delete the container.
commit 08f48d9
Author: Danny Canter <danny_canter@apple.com>
Date: Fri Jan 16 21:48:58 2026 -0800
ContainerSvc: Handle unexpected sandbox svc exits (apple#1065)
Closesapple#1050
If the sandbox svc exits out of band of the usual stop (or regular exit)
case the container svc's state is not properly updated for the
container. This was due to the cleanup steps involving trying to send
the shutdown rpc which cannot succeed as the sandbox svc does not exist
to service it.
To handle this, let's treat shutdown not returning successfully as
non-fatal (as this is mostly best effort), log an error and continue the
state cleanup.
commit b928e3f
Author: Amir Alperin <me@remotecpp.dev>
Date: Sat Jan 17 07:43:48 2026 +0200
fix: performance warning should not output ANSI codes if stderr redirected (apple#1059)
commit 744e7f7
Author: J Logan <john_logan@apple.com>
Date: Fri Jan 16 16:26:13 2026 -0800
Update for containerization 0.21.0. (apple#1056)
- Update image load and build to handle rejected paths during tar
extraction. For the image load command there is now a `--force` function
that fails extractions with rejected paths when false, and just warns
about the rejected paths when true.
- Update `container stats` for statistics API properties now all being
optional.
## Type of Change
- [x] Bug fix
- [ ] New feature
- [ ] Breaking change
- [x] Documentation update
## Motivation and Context
See above
## Testing
- [x] Tested locally
- [x] Added/updated tests
- [x] Added/updated docs
commit b1577d8
Author: J Logan <john_logan@apple.com>
Date: Fri Jan 16 15:50:47 2026 -0800
Adds opt-in pre-commit hook for format and header checks. (apple#1062)
- Closesapple#639.
- Adds swift format configuration that removes lint checks so we can use
`swift lint` to perform format-only tests.
- Adds `check` target that invokes format and header checks.
- Adds pre-commit script that runs `make check`.
- Adds `pre-commit` target that installs the check script as a
pre-commit hook.
## Type of Change
- [ ] Bug fix
- [x] New feature
- [ ] Breaking change
- [x] Documentation update
## Motivation and Context
Avoids wasting time and commit rewrites.
## Testing
- [x] Tested locally
- [ ] Added/updated tests
- [x] Added/updated docs
commit 3cf2c6a
Author: J Logan <john_logan@apple.com>
Date: Fri Jan 16 13:41:32 2026 -0800
Fix unstable integration tests. (apple#1060)
- TestCLIRunCommand now run so many tests concurrently that the API
server gets swamped and tests randomly time out.
- The parallelism options on `swift test` only work for XCTest, not
swift-testing.
- Work around this while retaining some parallelism (good for stress
testing) by breaking the tests into two suites.
commit 8897fcc
Author: Manu Schiller <56154253+manuschillerdev@users.noreply.github.com>
Date: Wed Jan 14 04:39:08 2026 +0100
fix: use pax instead of tar for pkg payload extraction (apple#1038)
- It is common to have `gnu-tar` alongside other GNU tools
installed and aliased for compatibility reasons. However, this
breaks the current make build.
- Use BSD-only binaries (no GNU equivalents that are
commonly aliased), making the Makefile more portable.
commit dbec1db
Author: Ronit Sabhaya <ronitsabhaya75@gmail.com>
Date: Mon Jan 12 20:34:25 2026 -0600
Add support for aarch64 architecture alias (apple#1040)
- Adds `aarch64` as an alias for `arm64` in the `Arch` enum. This
addresses the maintainer's request to support this common architecture
name, ensuring consistency with `x86_64` normalization and preventing
failures for users expecting `aarch64` support.
commit 837aa5e
Author: jwhur <57657645+JaewonHur@users.noreply.github.com>
Date: Mon Jan 12 14:36:10 2026 -0800
Fix the FS error when using Virtualization (apple#1041)
- Fixesapple#614.
- Use VZ cached mode instead of auto.
Signed-off-by: jwhur <jaewon_hur@apple.com>
commit e465b10
Author: 박성근 <117553364+ParkSeongGeun@users.noreply.github.com>
Date: Tue Jan 13 03:30:51 2026 +0900
Fix relative path resolution in entrypoint (apple#987)
- Fixesapple#962.
- Adds test to exercise apple/containerization#473.
- Updates containerization to 0.20.1.
Signed-off-by: ParkSeongGeun <phd0801@naver.com>
commit aa77928
Author: Ronit Sabhaya <ronitsabhaya75@gmail.com>
Date: Mon Jan 12 12:04:46 2026 -0600
Fix: Support x86_64 architecture alias to prevent silent pull failure… (apple#1036)
- Adds architecture name normalization to accept
`x86_64` and `x86-64` as aliases for `amd64`.
commit dc4682b
Author: Amir Alperin <me@remotecpp.dev>
Date: Fri Jan 9 21:10:53 2026 +0200
fix: extract hostname from FQDN (apple#1011) (apple#1017)
- Set the container hostname to the first DNS
label derived from the container id, strip everything
after the first dot.
- Fixesapple#1011.
commit 4af1cc0
Author: Ronit Sabhaya <ronitsabhaya75@gmail.com>
Date: Thu Jan 8 21:27:43 2026 -0600
fix: improve error message when binding to privileged ports (fixesapple#978) (apple#1031)
- The container fails to start with a generic "permission denied"
error when attempting to publish privileged ports (ports below
1024) without root privileges. This provides a confusing user
experience as the error doesn't explain why permission was
denied.
commit 21facf0
Author: J Logan <john_logan@apple.com>
Date: Thu Jan 8 17:02:22 2026 -0800
Add instructions for using locally built init filesystem. (apple#1032)
- Closesapple#1030.
commit b671690
Author: Danny Canter <danny_canter@apple.com>
Date: Wed Jan 7 21:01:10 2026 -0800
ProgressBar: Various fixes (apple#1025)
There's a couple things I don't think are intuitive about this.
1. Because of the internal task, render() can still be called even after
finish() completes. Ideally async defers are supported and we could just
await the final render completing after cancelling the task and setting
.finished, but alas. To fix this we can just lock across the methods for
now.
2. We always clear the screen in the destructor, even if we don't use
the
progress bar. I don't think we should honestly do anything in the
destructor.
Feels a programmer error not to defer { bar.finish() } or call it
somewhere.
3. Our spaces based line clearing. Use the ansi escape sequence for
clearing line;
I think our calculations were slightly off and it would leave trailing
output ( "s]" )
in some cases.
4. Shrinking the window until the output is smaller than the terminal
window (and vice
versa) is wonky on various term emulators. Truthfully, this is just a
hard problem,
but we can truncate our output and still provide some useful info.
This fixes some single line output (cat /etc/hostname etc.) getting
cleared in our atexit handler, as well as the need for the usleep.
commit 98410fd
Author: J Logan <john_logan@apple.com>
Date: Wed Jan 7 18:23:31 2026 -0800
Adds IPv6 port forwarding. (apple#1029)
- Closesapple#1006.
commit 9d06475
Author: Saehej Kang <saehej.kang@gmail.com>
Date: Wed Jan 7 16:53:33 2026 -0800
[container]: add startedDate field (apple#1018)
- Closesapple#302.
- Closesapple#336 (obsoletes this PR).
commit db8932a
Author: J Logan <john_logan@apple.com>
Date: Wed Jan 7 15:35:35 2026 -0800
Resolve IPv6 address queries for container names. (apple#1016)
- Closesapple#1005.
- Adapt everything to use MACAddress type from containerization 0.20.0.
- Allocate MAC addresses for every container so that we have
deterministic IPv6 link local addresses.
- Add AAAA handling to ContainerDNSHandler.
- NOTE: Only works on Tahoe. On Sequoia, we don't have a good way to set
or determine the IPv6 network prefix when networks are created, so we
can't infer the IPv6 link local addresses for AAAA responses and we
instead return `NODATA`.
commit 5d6c750
Author: Danny Canter <danny_canter@apple.com>
Date: Wed Jan 7 14:48:58 2026 -0800
CLI: Add read-only flag to run/create (apple#999)
Closesapple#990
Sets the rootfs for a container to read-only.
commit aac2457
Author: Danny Canter <danny_canter@apple.com>
Date: Wed Jan 7 13:46:26 2026 -0800
Tests: Fix relative path mount tests (apple#1028)
The tests are run in parallel on CI, and were split into three tests.
They change the cwd, so it's kind of a gamble whether some of them pass.
This just moves all the logic into one test mostly.
commit 9cd5397
Author: J Logan <john_logan@apple.com>
Date: Wed Jan 7 10:35:19 2026 -0800
Update to containerization 0.20.0. (apple#1027)
- Use MACAddress for Attachment and CZ interfaces.
- Move data validation closer to API surface.
commit 356c8d2
Author: J Logan <john_logan@apple.com>
Date: Tue Jan 6 08:27:14 2026 -0800
Reorganize client libraries. (apple#1020)
- Closesapple#461.
- Extract core types into ContainerResources target.
- Extract ContainerNetworkServiceClient from ContainerNetworkService.
- Relocate sandbox client from ContainerClient to
ContainerSandboxServiceClient.
- Relocate ContainerClient to ContainerAPIServiceClient.
- Common structure from services and clients under Source/Services.
Updated project hierarchy:
```
Sources/CAuditToken - audit token access wrapper
Sources/CLI - CLI executable
Sources/ContainerBuild - builder
Sources/ContainerCommands - CLI command implementations
Sources/ContainerLog - logging helpers
Sources/ContainerPersistence - persistent data and system property helpers
Sources/ContainerPlugin - plugin system
Sources/ContainerResource - resource (container, image, volume, network) types
Sources/ContainerVersion - version helpers
Sources/ContainerXPC - XPC helpers
Sources/CVersion - injected project version
Sources/DNSServer - container DNS resolver
Sources/Helpers - service executables
Sources/Services/*/Client - service clients
Sources/Services/*/Server - service implementations
Sources/SocketForwarder - port forwarding
Sources/TerminalProgress - progress bar
```
## Type of Change
- [ ] Bug fix
- [ ] New feature
- [x] Breaking change
- [ ] Documentation update
## Motivation and Context
The ContainerClient library was a bit of a grab bag. This refactor
applies a more sensible project and library structure for resource data
types, services, and clients.
## Testing
- [x] Tested locally
- [x] Added/updated tests
- [ ] Added/updated docs
commit 8c439cd
Author: Danny Canter <danny_canter@apple.com>
Date: Mon Jan 5 13:50:57 2026 -0800
makefile: Add cli target (apple#1022)
Often times I'll be making a change that only touches the cli and I
don't feel like sitting through the potential song and dance of the
other components building/installing.
commit d6f052d
Author: Kathryn Baldauf <k_baldauf@apple.com>
Date: Mon Jan 5 13:09:34 2026 -0800
Update license header on all files to include the current year (apple#1024)
## Motivation and Context
Now that we're in 2026, we need to update the license headers on all the
files. Unfortunately, Hawkeye doesn't have an attribute for the current
year to help us avoid this in the future. Instead, I had to work around
this by doing the following:
1. Update licenserc.toml with:
```
[properties]
... (other properties)
currentYear = "2026"
```
2. Update scripts/license-header.txt with
```
Copyright ©{{ " " }}{%- set created = attrs.git_file_created_year or
attrs.disk_file_created_year -%}{%- set modified = props["currentYear"]
-%}{%- if created != modified -%} {{created}}-{{modified}}{%- else
-%}{{created}}{%- endif -%}{{ " " }}{{ props["copyrightOwner"] }}.
```
Then I removed these two changes before committing. After this PR is
merged, all files will have recently had git updates, so the existing
code for setting the modified year should work as intended.
Signed-off-by: Kathryn Baldauf <k_baldauf@apple.com>
commit 20dc0bc
Author: Danny Canter <danny_canter@apple.com>
Date: Sun Jan 4 11:11:09 2026 -0800
Parser: Support relative paths for --volume (apple#1013)
commit 028e7e1
Author: Danny Canter <danny_canter@apple.com>
Date: Sun Jan 4 10:52:46 2026 -0800
Deps: Bump Containerization to 0.19.0 (apple#1015)
Has read-only rootfs support.
commit 020949e
Author: Danny Canter <danny_canter@apple.com>
Date: Sun Jan 4 10:51:20 2026 -0800
CLI: Small fixups for implicit envvars (apple#1014)
We should only inherit from the host if there's no =. Additionally
document the flag a little more to show that we can inherit from the
host.
commit df368b7
Author: Amir Alperin <alperin.amir@gmail.com>
Date: Sun Jan 4 20:49:22 2026 +0200
Fix port validation to allow same port for different protocols (apple#992) (apple#1000)
- Fixes: apple#992
- Port validation previously rejected valid configurations
when the same port number was used for different
protocols (TCP and UDP). For example:
`-p 1024:1024/udp -p 1024:1024/tcp`
Although this is a valid and common use case, the
validation logic treated it as a conflict.
To fix this, I updated the validation key to include the protocol name.
The validation now checks for overlapping port numbers only within the
same protocol, rather than across all protocols.
This change enables binding the same port number for both TCP and UDP,
aligning the validation behavior with real-world networking
requirements.
## Testing
- [x] Tested locally
- [x] Added/updated tests
- [ ] Added/updated docs
commit cf64614
Author: J Logan <john_logan@apple.com>
Date: Fri Jan 2 14:10:48 2026 -0800
Update OSS header in Package.swift. (apple#1010)
commit 375ce16
Author: J Logan <john_logan@apple.com>
Date: Fri Jan 2 12:09:12 2026 -0800
Fix OSS header dates that break CI checks. (apple#1009)
commit 580d853
Author: c <claudeaceae@icloud.com>
Date: Fri Jan 2 00:19:57 2026 -0500
Use full path for uninstall script in upgrade instructions (apple#983)
- Makes the upgrade section consistent with the
uninstall section by using the full path to the
uninstall script.
commit 4cadc40
Author: c <claudeaceae@icloud.com>
Date: Thu Jan 1 22:53:56 2026 -0500
Clarify uninstall script location in README (apple#982)
- Clarifies where the `uninstall-container.sh` script is located after
installation
- Updates example commands to use the full path
commit 4e78e30
Author: c <claudeaceae@icloud.com>
Date: Thu Jan 1 20:57:47 2026 -0500
Fix grammar in tutorial.md (apple#985)
## Summary
- Fixes a grammar error in the tutorial's publish section
## Details
Line 287 of `docs/tutorial.md` had "you need push images" which should
be "you need to push images".
This is a simple grammar fix to improve readability.
## Test plan
- [x] Verified the sentence now reads correctly
commit 22dfd6e
Author: Danny Canter <danny_canter@apple.com>
Date: Thu Jan 1 17:57:00 2026 -0800
CLI: Fix stop not signalling waiters (apple#972)
commit 4958cf2
Author: c <claudeaceae@icloud.com>
Date: Thu Jan 1 20:51:10 2026 -0500
Fix bash completion source path in documentation (apple#981)
- Corrects the source path for bash completion script
when not using bash-completion package.
commit 25ac79a
Author: c <claudeaceae@icloud.com>
Date: Thu Jan 1 20:50:19 2026 -0500
Fix MAC address option typo in how-to documentation (apple#980)
- Corrects the MAC address example command in the
how-to guide to use the correct `--network` flag syntax
instead of the incorrect `--mac-address` flag.
commit edadf15
Author: Raj <realrajaryan@gmail.com>
Date: Thu Jan 1 15:10:39 2026 +0530
Fix container auto-delete on rapid stop/start (apple#841)
Fixesapple#833.
Currently, when stopping and immediately restarting a container, it would fail with the error:
`“container expected to be in created state, got: shuttingDown”` and then be automatically deleted.
The `SandboxService` process waits five seconds before exiting after shutdown. During this interval, a rapid restart could reconnect to the still-terminating process in the `shuttingDown` state, triggering a state validation error.
This fix forcefully terminates the `SandboxService` process with `SIGKILL` upon container exit, instead of waiting five seconds. The bootstrap now defensively checks for and cleans up any stale services before registering new ones, preventing reconnections to processes in the `shuttingDown` state.
commit 5064b0f
Author: J Logan <john_logan@apple.com>
Date: Mon Dec 22 10:16:14 2025 -0800
Adds network IPv6 configuration. (apple#975)
- Part of work for apple#460.
- Enable set/get of IPv6 network prefix in ReservedVmnetNetwork.
- Show IPv6 prefix in `network list` full output.
- Option for setting IPv6 prefix when creating a network.
- System property for default IPv6 prefix.
## Type of Change
- [ ] Bug fix
- [x] New feature
- [ ] Breaking change
- [x] Documentation update
## Motivation and Context
See apple#460.
## Testing
- [x] Tested locally
- [ ] Added/updated tests
- [x] Added/updated docs
commit 9c239aa
Author: Volodymyr Bortniak <25820601+Bortnyak@users.noreply.github.com>
Date: Sat Dec 20 00:36:02 2025 +0100
Add support for reading env from named pipes (apple#974)
This is a fix for
[issue#956](apple#956)
`FileManager.default.contents(atPath:)` returns `nil` for named pipes
(FIFOs)
and process substitutions like `/dev/fd/XX` because:
1. It expects regular files with a known size
2. Named pipes are stream-based and block until data arrives
## Solution
Use `FileHandle(forReadingFrom:)` instead, which:
- Properly handles blocking I/O
- Works with named pipes, process substitutions, and regular files
(mentioned in the
[doc](https://developer.apple.com/documentation/foundation/filehandle))
Co-authored-by: Bortniak Volodymyr <Bortnyak@users.noreply.github.com>
commit 3c3a83c
Author: Danny Canter <danny_canter@apple.com>
Date: Thu Dec 18 16:28:44 2025 -0800
Turn on oops=panic kernel cmdline (apple#971)
commit b1b9980
Author: Michael Gathara <mikegtrm@gmail.com>
Date: Wed Dec 17 20:58:50 2025 -0600
Fix: Kubes Cluster in Container Crashing Container (IS#923) (apple#930)
- Fixes issue apple#923
- I fixed a race condition in `ConnectHandler.swift` where
an asynchronous network connection could complete
after the handler had already been removed from the
pipeline.
- This prevents the EXC_BREAKPOINT crash in
container-runtime-linux that occurred when kinc
(Kubernetes in Container) created rapid connections.
- The actual fix was inadvertently applied in apple#957, so this
PR contains only the test code.
commit 9f4efe0
Author: Saehej Kang <saehej.kang@gmail.com>
Date: Wed Dec 17 00:30:33 2025 -0800
[networks]: add prune command (apple#914)
- Closesapple#893
commit 4f88725
Author: J Logan <john_logan@apple.com>
Date: Tue Dec 16 16:34:13 2025 -0800
Use new IP/CIDR types from Containerization. (apple#957)
- Part of work for apple#460.
- With CZ release 0.17.0, the IP and CIDR address
types changed from String to IPv4Address and
CIDRv4, respectively. This PR applies the corresponding
adaptations to container.
commit 8e16bb2
Author: Salman Chishti <salmanmkc@GitHub.com>
Date: Tue Dec 16 20:14:45 2025 +0000
Upgrade GitHub Actions to latest versions (apple#959)
- Upgrade GitHub Actions to their latest versions for
improved features, bug fixes, and security updates.
Signed-off-by: Salman Muin Kayser Chishti <13schishti@gmail.com>
commit 0c7dca4
Author: Salman Chishti <salmanmkc@GitHub.com>
Date: Tue Dec 16 19:23:31 2025 +0000
Add Dependabot for GitHub Actions updates (apple#960)
## Summary
Add Dependabot configuration to automatically keep GitHub Actions up to
date.
## Changes
Adds `.github/dependabot.yml` configured to:
- Check for GitHub Actions updates weekly
- Group all action updates together for easier review
- Use `ci` prefix for commit messages
## Why
As discussed in apple#958, this helps:
- Keep actions up to date with security patches automatically
- Handle Node runtime deprecations proactively (e.g., Node 20 → Node 24)
- Reduce manual maintenance burden
## Reference
Based on the pattern used in
[swift-nio](https://github.com/apple/swift-nio/blob/main/.github/dependabot.yml).
commit 637c8f1
Author: Salman Chishti <salmanmkc@GitHub.com>
Date: Tue Dec 16 18:15:42 2025 +0000
Upgrade GitHub Actions for Node 24 compatibility (apple#958)
## Summary
Upgrade GitHub Actions to their latest versions to ensure compatibility
with Node 24, as Node 20 will reach end-of-life in April 2026.
## Changes
| Action | Old Version(s) | New Version | SHA |
|--------|---------------|-------------|-----|
| `actions/checkout` | v4 | v6 | `8e8c483` |
| `actions/download-artifact` | v4 | v7 | `37930b1` |
| `actions/upload-artifact` | v4 | v6 | `b7c566a` |
| `actions/labeler` | v5 | v6 | `634933e` |
| `actions/configure-pages` | v5 | v5 | `983d773` |
| `actions/upload-pages-artifact` | v3 | v3 | `56afc60` |
| `softprops/action-gh-release` | v2 | v2 | `a06a81a` |
## Context
Per [GitHub's
announcement](https://github.blog/changelog/2025-09-19-deprecation-of-node-20-on-github-actions-runners/),
Node 20 is being deprecated and runners will begin using Node 24 by
default starting March 4th, 2026.
### Why this matters
- **Node 20 EOL**: April 2026
- **Node 24 default**: March 4th, 2026
- **Action**: Update to latest action versions that support Node 24
### Security
All actions are now **pinned to commit SHAs** instead of mutable version
tags. This provides:
- Protection against tag hijacking attacks
- Immutable, reproducible builds
- Version comments for readability
### Automated Updates
A follow-up PR (apple#960) adds Dependabot configuration to automatically
keep these actions updated with new SHA-pinned versions.
### Testing
These changes only affect CI/CD workflow configurations and should not
impact application functionality. The workflows should be tested by
running them on a branch before merging.
Signed-off-by: Salman Muin Kayser Chishti <13schishti@gmail.com>
commit c22f128
Author: karen heckel <karen.heckel@utexas.edu>
Date: Mon Dec 15 21:16:55 2025 -0800
Feat: customize console output with env variable (apple#952)
Fixesapple#915
Added a new feature to support the passing of buildkit colors for
customizing console output.
commit 9b7cfd8
Author: Saehej Kang <saehej.kang@gmail.com>
Date: Mon Dec 15 17:52:00 2025 -0800
[images]: refactor prune command (apple#941)
- Updates to `image prune` for consistency with how
other `prune` commands are done. Added missing
test cases as well for the command
- Relates to the discussion from apple#914
commit 7d30720
Author: Danny Canter <danny_canter@apple.com>
Date: Thu Dec 11 05:36:15 2025 -0800
CLI: Fix -it not being able to pipe stdout (apple#951)
Fixesapple#949
Typically if one fd is a tty, it's common for all 3 of stdio to be the
same, but that is not always the case. In our case we were using our
Terminal type from Containerization to comb through err/out/in and give
us a type backed by one of the 3 if -t was supplied. It happens that
stderr is the first we check, so our Terminal() is backed by fd 2. This
change modifies things so that we always initialize our Terminal if
asked for with fd 0, and out/err are backed by their corresponding
correct fd number.
## Type of Change
- [x] Bug fix
- [ ] New feature
- [ ] Breaking change
- [ ] Documentation update
## Testing
- [x] Tested locally
- [ ] Added/updated tests
- [ ] Added/updated docs
commit a2901e0
Author: wangxiaolei <fatelei@gmail.com>
Date: Wed Dec 10 10:04:40 2025 +0800
feat: implement version sub command (apple#911)
- closesapple#383
- implement version sub command, give more info
---------
Co-authored-by: fatelei <fatelei@fateleis-MacBook-Pro.local>
commit 0cde1ef
Author: Danny Canter <danny_canter@apple.com>
Date: Tue Dec 9 13:24:45 2025 -0800
Deps: Bump Containerization to 0.16.2 (apple#947)
Closesapple#928
Has a cgroup fix when stopping certain containers
commit 3896055
Author: Dmitry Kovba <dkovba@apple.com>
Date: Tue Dec 9 12:32:28 2025 -0800
Lowercase error messages (apple#945)
## Type of Change
- [x] Bug fix
- [ ] New feature
- [ ] Breaking change
- [ ] Documentation update
## Motivation and Context
For consistency, all error messages are lowercased.
## Testing
- [ ] Tested locally
- [ ] Added/updated tests
- [ ] Added/updated docs
---------
Co-authored-by: J Logan <sgtbakerrahulnet@yahoo.com>
commit 0733a81
Author: Saehej Kang <saehej.kang@gmail.com>
Date: Tue Dec 9 10:54:37 2025 -0800
[volumes]: refactor prune command (apple#940)
- Refactor the `volume prune` command to follow a client-side approach.
The `volumeDiskUsage` is calculated in the service file, so it made
sense to leave that there.
- Relates to the discussion from apple#914
commit 42528e6
Author: Kathryn Baldauf <k_baldauf@apple.com>
Date: Tue Dec 9 10:42:27 2025 -0800
Update CONTRIBUTORS to MAINTAINERS and point at containerization (apple#942)
## Type of Change
- [x] Documentation update
## Motivation and Context
See apple/containerization#435 for more
information on this change.
commit a64bd77
Author: J Logan <john_logan@apple.com>
Date: Tue Dec 9 14:35:34 2025 -0300
Fix broken image integration tests. (apple#944)
- Fixesapple#943.
- Use images other than alpine:3.20 for image concurrency test so as not
to interfere with tests using that image.
- Rename test files to match suite names.
commit ab92f39
Author: TTtie <me@tttie.cz>
Date: Mon Dec 8 18:17:10 2025 +0100
fix(TerminalProgress): make the progress bar respect locale-specific decimal separator (apple#936)
- The `ProgressBar#adjustFormattedSize` function currently expects a
decimal dot when adding the additional ".0" to the size. This, however,
breaks when a region with a non-dot decimal separator is used.
commit 420be74
Author: J Logan <john_logan@apple.com>
Date: Mon Dec 8 03:00:02 2025 -0300
Data integrity: bump to cz 0.16.1, adjust sync mode. (apple#939)
- 0.16.1 changes an ext4 superblock setting that might have been causing
problems.
- apple#877 fixed an issue where the cache and sync settings for block
filesystems weren't being passed down to the VZ virtual machine
configuration. The default sync value getting passed down is `full`,
which reduces I/O performance. Relax this to use `fsync` for now.
## Type of Change
- [*] Bug fix
- [ ] New feature
- [ ] Breaking change
- [ ] Documentation update
## Motivation and Context
May address problems reported in apple#877.
## Testing
- [x] Tested locally
- [ ] Added/updated tests
- [ ] Added/updated docs
commit f7bcb68
Author: Santosh Bhavani <santosh.bhavani@live.com>
Date: Sun Dec 7 10:56:50 2025 -0800
Add --max-concurrent-downloads flag for parallel layer downloads (apple#716)
Adds `--max-concurrent-downloads` flag to `container image pull` for
configurable concurrent layer downloads.
Fixesapple#715
Depends on apple/containerization#311
**Usage**:
```bash
container image pull nginx:latest --max-concurrent-downloads 6
```
**Changes**:
- Add CLI flag (default: 3)
- Thread parameter through XPC stack
- Update to use forked containerization with configurable concurrency
**Performance**: ~1.2-1.3x faster pulls for multi-layer images with
higher concurrency
**Tests**: Included standalone tests verify concurrency behavior and
parameter flow
---------
Co-authored-by: Claude <noreply@anthropic.com>
Mcrich23 added a commit to Mcrich23/container that referenced this pull request Jan 22, 2026
commit 69445b9
Author: jwhur <57657645+JaewonHur@users.noreply.github.com>
Date: Mon Jan 19 13:09:34 2026 -0800
Throw error when starting a container with invalid virtiofs source (apple#1051)
Run = Create + Start
1) Mount source points to a valid directory
- Run and Create + Start both correctly create the container with mount.
2) Mount source points to a file
- Run fails bootstrapping the container, thus container not created.
- Create creates the container, but Start fails bootstrapping, removing
the container. (Thus, both are the same.)
3) Mount source deleted or replaced to file after container created
- Start throw errors but do not delete the container.
commit 08f48d9
Author: Danny Canter <danny_canter@apple.com>
Date: Fri Jan 16 21:48:58 2026 -0800
ContainerSvc: Handle unexpected sandbox svc exits (apple#1065)
Closesapple#1050
If the sandbox svc exits out of band of the usual stop (or regular exit)
case the container svc's state is not properly updated for the
container. This was due to the cleanup steps involving trying to send
the shutdown rpc which cannot succeed as the sandbox svc does not exist
to service it.
To handle this, let's treat shutdown not returning successfully as
non-fatal (as this is mostly best effort), log an error and continue the
state cleanup.
commit b928e3f
Author: Amir Alperin <me@remotecpp.dev>
Date: Sat Jan 17 07:43:48 2026 +0200
fix: performance warning should not output ANSI codes if stderr redirected (apple#1059)
commit 744e7f7
Author: J Logan <john_logan@apple.com>
Date: Fri Jan 16 16:26:13 2026 -0800
Update for containerization 0.21.0. (apple#1056)
- Update image load and build to handle rejected paths during tar
extraction. For the image load command there is now a `--force` function
that fails extractions with rejected paths when false, and just warns
about the rejected paths when true.
- Update `container stats` for statistics API properties now all being
optional.
## Type of Change
- [x] Bug fix
- [ ] New feature
- [ ] Breaking change
- [x] Documentation update
## Motivation and Context
See above
## Testing
- [x] Tested locally
- [x] Added/updated tests
- [x] Added/updated docs
commit b1577d8
Author: J Logan <john_logan@apple.com>
Date: Fri Jan 16 15:50:47 2026 -0800
Adds opt-in pre-commit hook for format and header checks. (apple#1062)
- Closesapple#639.
- Adds swift format configuration that removes lint checks so we can use
`swift lint` to perform format-only tests.
- Adds `check` target that invokes format and header checks.
- Adds pre-commit script that runs `make check`.
- Adds `pre-commit` target that installs the check script as a
pre-commit hook.
## Type of Change
- [ ] Bug fix
- [x] New feature
- [ ] Breaking change
- [x] Documentation update
## Motivation and Context
Avoids wasting time and commit rewrites.
## Testing
- [x] Tested locally
- [ ] Added/updated tests
- [x] Added/updated docs
commit 3cf2c6a
Author: J Logan <john_logan@apple.com>
Date: Fri Jan 16 13:41:32 2026 -0800
Fix unstable integration tests. (apple#1060)
- TestCLIRunCommand now run so many tests concurrently that the API
server gets swamped and tests randomly time out.
- The parallelism options on `swift test` only work for XCTest, not
swift-testing.
- Work around this while retaining some parallelism (good for stress
testing) by breaking the tests into two suites.
commit 8897fcc
Author: Manu Schiller <56154253+manuschillerdev@users.noreply.github.com>
Date: Wed Jan 14 04:39:08 2026 +0100
fix: use pax instead of tar for pkg payload extraction (apple#1038)
- It is common to have `gnu-tar` alongside other GNU tools
installed and aliased for compatibility reasons. However, this
breaks the current make build.
- Use BSD-only binaries (no GNU equivalents that are
commonly aliased), making the Makefile more portable.
commit dbec1db
Author: Ronit Sabhaya <ronitsabhaya75@gmail.com>
Date: Mon Jan 12 20:34:25 2026 -0600
Add support for aarch64 architecture alias (apple#1040)
- Adds `aarch64` as an alias for `arm64` in the `Arch` enum. This
addresses the maintainer's request to support this common architecture
name, ensuring consistency with `x86_64` normalization and preventing
failures for users expecting `aarch64` support.
commit 837aa5e
Author: jwhur <57657645+JaewonHur@users.noreply.github.com>
Date: Mon Jan 12 14:36:10 2026 -0800
Fix the FS error when using Virtualization (apple#1041)
- Fixesapple#614.
- Use VZ cached mode instead of auto.
Signed-off-by: jwhur <jaewon_hur@apple.com>
commit e465b10
Author: 박성근 <117553364+ParkSeongGeun@users.noreply.github.com>
Date: Tue Jan 13 03:30:51 2026 +0900
Fix relative path resolution in entrypoint (apple#987)
- Fixesapple#962.
- Adds test to exercise apple/containerization#473.
- Updates containerization to 0.20.1.
Signed-off-by: ParkSeongGeun <phd0801@naver.com>
commit aa77928
Author: Ronit Sabhaya <ronitsabhaya75@gmail.com>
Date: Mon Jan 12 12:04:46 2026 -0600
Fix: Support x86_64 architecture alias to prevent silent pull failure… (apple#1036)
- Adds architecture name normalization to accept
`x86_64` and `x86-64` as aliases for `amd64`.
commit dc4682b
Author: Amir Alperin <me@remotecpp.dev>
Date: Fri Jan 9 21:10:53 2026 +0200
fix: extract hostname from FQDN (apple#1011) (apple#1017)
- Set the container hostname to the first DNS
label derived from the container id, strip everything
after the first dot.
- Fixesapple#1011.
commit 4af1cc0
Author: Ronit Sabhaya <ronitsabhaya75@gmail.com>
Date: Thu Jan 8 21:27:43 2026 -0600
fix: improve error message when binding to privileged ports (fixesapple#978) (apple#1031)
- The container fails to start with a generic "permission denied"
error when attempting to publish privileged ports (ports below
1024) without root privileges. This provides a confusing user
experience as the error doesn't explain why permission was
denied.
commit 21facf0
Author: J Logan <john_logan@apple.com>
Date: Thu Jan 8 17:02:22 2026 -0800
Add instructions for using locally built init filesystem. (apple#1032)
- Closesapple#1030.
commit b671690
Author: Danny Canter <danny_canter@apple.com>
Date: Wed Jan 7 21:01:10 2026 -0800
ProgressBar: Various fixes (apple#1025)
There's a couple things I don't think are intuitive about this.
1. Because of the internal task, render() can still be called even after
finish() completes. Ideally async defers are supported and we could just
await the final render completing after cancelling the task and setting
.finished, but alas. To fix this we can just lock across the methods for
now.
2. We always clear the screen in the destructor, even if we don't use
the
progress bar. I don't think we should honestly do anything in the
destructor.
Feels a programmer error not to defer { bar.finish() } or call it
somewhere.
3. Our spaces based line clearing. Use the ansi escape sequence for
clearing line;
I think our calculations were slightly off and it would leave trailing
output ( "s]" )
in some cases.
4. Shrinking the window until the output is smaller than the terminal
window (and vice
versa) is wonky on various term emulators. Truthfully, this is just a
hard problem,
but we can truncate our output and still provide some useful info.
This fixes some single line output (cat /etc/hostname etc.) getting
cleared in our atexit handler, as well as the need for the usleep.
commit 98410fd
Author: J Logan <john_logan@apple.com>
Date: Wed Jan 7 18:23:31 2026 -0800
Adds IPv6 port forwarding. (apple#1029)
- Closesapple#1006.
commit 9d06475
Author: Saehej Kang <saehej.kang@gmail.com>
Date: Wed Jan 7 16:53:33 2026 -0800
[container]: add startedDate field (apple#1018)
- Closesapple#302.
- Closesapple#336 (obsoletes this PR).
commit db8932a
Author: J Logan <john_logan@apple.com>
Date: Wed Jan 7 15:35:35 2026 -0800
Resolve IPv6 address queries for container names. (apple#1016)
- Closesapple#1005.
- Adapt everything to use MACAddress type from containerization 0.20.0.
- Allocate MAC addresses for every container so that we have
deterministic IPv6 link local addresses.
- Add AAAA handling to ContainerDNSHandler.
- NOTE: Only works on Tahoe. On Sequoia, we don't have a good way to set
or determine the IPv6 network prefix when networks are created, so we
can't infer the IPv6 link local addresses for AAAA responses and we
instead return `NODATA`.
commit 5d6c750
Author: Danny Canter <danny_canter@apple.com>
Date: Wed Jan 7 14:48:58 2026 -0800
CLI: Add read-only flag to run/create (apple#999)
Closesapple#990
Sets the rootfs for a container to read-only.
commit aac2457
Author: Danny Canter <danny_canter@apple.com>
Date: Wed Jan 7 13:46:26 2026 -0800
Tests: Fix relative path mount tests (apple#1028)
The tests are run in parallel on CI, and were split into three tests.
They change the cwd, so it's kind of a gamble whether some of them pass.
This just moves all the logic into one test mostly.
commit 9cd5397
Author: J Logan <john_logan@apple.com>
Date: Wed Jan 7 10:35:19 2026 -0800
Update to containerization 0.20.0. (apple#1027)
- Use MACAddress for Attachment and CZ interfaces.
- Move data validation closer to API surface.
commit 356c8d2
Author: J Logan <john_logan@apple.com>
Date: Tue Jan 6 08:27:14 2026 -0800
Reorganize client libraries. (apple#1020)
- Closesapple#461.
- Extract core types into ContainerResources target.
- Extract ContainerNetworkServiceClient from ContainerNetworkService.
- Relocate sandbox client from ContainerClient to
ContainerSandboxServiceClient.
- Relocate ContainerClient to ContainerAPIServiceClient.
- Common structure from services and clients under Source/Services.
Updated project hierarchy:
```
Sources/CAuditToken - audit token access wrapper
Sources/CLI - CLI executable
Sources/ContainerBuild - builder
Sources/ContainerCommands - CLI command implementations
Sources/ContainerLog - logging helpers
Sources/ContainerPersistence - persistent data and system property helpers
Sources/ContainerPlugin - plugin system
Sources/ContainerResource - resource (container, image, volume, network) types
Sources/ContainerVersion - version helpers
Sources/ContainerXPC - XPC helpers
Sources/CVersion - injected project version
Sources/DNSServer - container DNS resolver
Sources/Helpers - service executables
Sources/Services/*/Client - service clients
Sources/Services/*/Server - service implementations
Sources/SocketForwarder - port forwarding
Sources/TerminalProgress - progress bar
```
## Type of Change
- [ ] Bug fix
- [ ] New feature
- [x] Breaking change
- [ ] Documentation update
## Motivation and Context
The ContainerClient library was a bit of a grab bag. This refactor
applies a more sensible project and library structure for resource data
types, services, and clients.
## Testing
- [x] Tested locally
- [x] Added/updated tests
- [ ] Added/updated docs
commit 8c439cd
Author: Danny Canter <danny_canter@apple.com>
Date: Mon Jan 5 13:50:57 2026 -0800
makefile: Add cli target (apple#1022)
Often times I'll be making a change that only touches the cli and I
don't feel like sitting through the potential song and dance of the
other components building/installing.
commit d6f052d
Author: Kathryn Baldauf <k_baldauf@apple.com>
Date: Mon Jan 5 13:09:34 2026 -0800
Update license header on all files to include the current year (apple#1024)
## Motivation and Context
Now that we're in 2026, we need to update the license headers on all the
files. Unfortunately, Hawkeye doesn't have an attribute for the current
year to help us avoid this in the future. Instead, I had to work around
this by doing the following:
1. Update licenserc.toml with:
```
[properties]
... (other properties)
currentYear = "2026"
```
2. Update scripts/license-header.txt with
```
Copyright ©{{ " " }}{%- set created = attrs.git_file_created_year or
attrs.disk_file_created_year -%}{%- set modified = props["currentYear"]
-%}{%- if created != modified -%} {{created}}-{{modified}}{%- else
-%}{{created}}{%- endif -%}{{ " " }}{{ props["copyrightOwner"] }}.
```
Then I removed these two changes before committing. After this PR is
merged, all files will have recently had git updates, so the existing
code for setting the modified year should work as intended.
Signed-off-by: Kathryn Baldauf <k_baldauf@apple.com>
commit 20dc0bc
Author: Danny Canter <danny_canter@apple.com>
Date: Sun Jan 4 11:11:09 2026 -0800
Parser: Support relative paths for --volume (apple#1013)
commit 028e7e1
Author: Danny Canter <danny_canter@apple.com>
Date: Sun Jan 4 10:52:46 2026 -0800
Deps: Bump Containerization to 0.19.0 (apple#1015)
Has read-only rootfs support.
commit 020949e
Author: Danny Canter <danny_canter@apple.com>
Date: Sun Jan 4 10:51:20 2026 -0800
CLI: Small fixups for implicit envvars (apple#1014)
We should only inherit from the host if there's no =. Additionally
document the flag a little more to show that we can inherit from the
host.
commit df368b7
Author: Amir Alperin <alperin.amir@gmail.com>
Date: Sun Jan 4 20:49:22 2026 +0200
Fix port validation to allow same port for different protocols (apple#992) (apple#1000)
- Fixes: apple#992
- Port validation previously rejected valid configurations
when the same port number was used for different
protocols (TCP and UDP). For example:
`-p 1024:1024/udp -p 1024:1024/tcp`
Although this is a valid and common use case, the
validation logic treated it as a conflict.
To fix this, I updated the validation key to include the protocol name.
The validation now checks for overlapping port numbers only within the
same protocol, rather than across all protocols.
This change enables binding the same port number for both TCP and UDP,
aligning the validation behavior with real-world networking
requirements.
## Testing
- [x] Tested locally
- [x] Added/updated tests
- [ ] Added/updated docs
commit cf64614
Author: J Logan <john_logan@apple.com>
Date: Fri Jan 2 14:10:48 2026 -0800
Update OSS header in Package.swift. (apple#1010)
commit 375ce16
Author: J Logan <john_logan@apple.com>
Date: Fri Jan 2 12:09:12 2026 -0800
Fix OSS header dates that break CI checks. (apple#1009)
commit 580d853
Author: c <claudeaceae@icloud.com>
Date: Fri Jan 2 00:19:57 2026 -0500
Use full path for uninstall script in upgrade instructions (apple#983)
- Makes the upgrade section consistent with the
uninstall section by using the full path to the
uninstall script.
commit 4cadc40
Author: c <claudeaceae@icloud.com>
Date: Thu Jan 1 22:53:56 2026 -0500
Clarify uninstall script location in README (apple#982)
- Clarifies where the `uninstall-container.sh` script is located after
installation
- Updates example commands to use the full path
commit 4e78e30
Author: c <claudeaceae@icloud.com>
Date: Thu Jan 1 20:57:47 2026 -0500
Fix grammar in tutorial.md (apple#985)
## Summary
- Fixes a grammar error in the tutorial's publish section
## Details
Line 287 of `docs/tutorial.md` had "you need push images" which should
be "you need to push images".
This is a simple grammar fix to improve readability.
## Test plan
- [x] Verified the sentence now reads correctly
commit 22dfd6e
Author: Danny Canter <danny_canter@apple.com>
Date: Thu Jan 1 17:57:00 2026 -0800
CLI: Fix stop not signalling waiters (apple#972)
commit 4958cf2
Author: c <claudeaceae@icloud.com>
Date: Thu Jan 1 20:51:10 2026 -0500
Fix bash completion source path in documentation (apple#981)
- Corrects the source path for bash completion script
when not using bash-completion package.
commit 25ac79a
Author: c <claudeaceae@icloud.com>
Date: Thu Jan 1 20:50:19 2026 -0500
Fix MAC address option typo in how-to documentation (apple#980)
- Corrects the MAC address example command in the
how-to guide to use the correct `--network` flag syntax
instead of the incorrect `--mac-address` flag.
commit edadf15
Author: Raj <realrajaryan@gmail.com>
Date: Thu Jan 1 15:10:39 2026 +0530
Fix container auto-delete on rapid stop/start (apple#841)
Fixesapple#833.
Currently, when stopping and immediately restarting a container, it would fail with the error:
`“container expected to be in created state, got: shuttingDown”` and then be automatically deleted.
The `SandboxService` process waits five seconds before exiting after shutdown. During this interval, a rapid restart could reconnect to the still-terminating process in the `shuttingDown` state, triggering a state validation error.
This fix forcefully terminates the `SandboxService` process with `SIGKILL` upon container exit, instead of waiting five seconds. The bootstrap now defensively checks for and cleans up any stale services before registering new ones, preventing reconnections to processes in the `shuttingDown` state.
commit 5064b0f
Author: J Logan <john_logan@apple.com>
Date: Mon Dec 22 10:16:14 2025 -0800
Adds network IPv6 configuration. (apple#975)
- Part of work for apple#460.
- Enable set/get of IPv6 network prefix in ReservedVmnetNetwork.
- Show IPv6 prefix in `network list` full output.
- Option for setting IPv6 prefix when creating a network.
- System property for default IPv6 prefix.
## Type of Change
- [ ] Bug fix
- [x] New feature
- [ ] Breaking change
- [x] Documentation update
## Motivation and Context
See apple#460.
## Testing
- [x] Tested locally
- [ ] Added/updated tests
- [x] Added/updated docs
commit 9c239aa
Author: Volodymyr Bortniak <25820601+Bortnyak@users.noreply.github.com>
Date: Sat Dec 20 00:36:02 2025 +0100
Add support for reading env from named pipes (apple#974)
This is a fix for
[issue#956](apple#956)
`FileManager.default.contents(atPath:)` returns `nil` for named pipes
(FIFOs)
and process substitutions like `/dev/fd/XX` because:
1. It expects regular files with a known size
2. Named pipes are stream-based and block until data arrives
## Solution
Use `FileHandle(forReadingFrom:)` instead, which:
- Properly handles blocking I/O
- Works with named pipes, process substitutions, and regular files
(mentioned in the
[doc](https://developer.apple.com/documentation/foundation/filehandle))
Co-authored-by: Bortniak Volodymyr <Bortnyak@users.noreply.github.com>
commit 3c3a83c
Author: Danny Canter <danny_canter@apple.com>
Date: Thu Dec 18 16:28:44 2025 -0800
Turn on oops=panic kernel cmdline (apple#971)
commit b1b9980
Author: Michael Gathara <mikegtrm@gmail.com>
Date: Wed Dec 17 20:58:50 2025 -0600
Fix: Kubes Cluster in Container Crashing Container (IS#923) (apple#930)
- Fixes issue apple#923
- I fixed a race condition in `ConnectHandler.swift` where
an asynchronous network connection could complete
after the handler had already been removed from the
pipeline.
- This prevents the EXC_BREAKPOINT crash in
container-runtime-linux that occurred when kinc
(Kubernetes in Container) created rapid connections.
- The actual fix was inadvertently applied in apple#957, so this
PR contains only the test code.
commit 9f4efe0
Author: Saehej Kang <saehej.kang@gmail.com>
Date: Wed Dec 17 00:30:33 2025 -0800
[networks]: add prune command (apple#914)
- Closesapple#893
commit 4f88725
Author: J Logan <john_logan@apple.com>
Date: Tue Dec 16 16:34:13 2025 -0800
Use new IP/CIDR types from Containerization. (apple#957)
- Part of work for apple#460.
- With CZ release 0.17.0, the IP and CIDR address
types changed from String to IPv4Address and
CIDRv4, respectively. This PR applies the corresponding
adaptations to container.
commit 8e16bb2
Author: Salman Chishti <salmanmkc@GitHub.com>
Date: Tue Dec 16 20:14:45 2025 +0000
Upgrade GitHub Actions to latest versions (apple#959)
- Upgrade GitHub Actions to their latest versions for
improved features, bug fixes, and security updates.
Signed-off-by: Salman Muin Kayser Chishti <13schishti@gmail.com>
commit 0c7dca4
Author: Salman Chishti <salmanmkc@GitHub.com>
Date: Tue Dec 16 19:23:31 2025 +0000
Add Dependabot for GitHub Actions updates (apple#960)
## Summary
Add Dependabot configuration to automatically keep GitHub Actions up to
date.
## Changes
Adds `.github/dependabot.yml` configured to:
- Check for GitHub Actions updates weekly
- Group all action updates together for easier review
- Use `ci` prefix for commit messages
## Why
As discussed in apple#958, this helps:
- Keep actions up to date with security patches automatically
- Handle Node runtime deprecations proactively (e.g., Node 20 → Node 24)
- Reduce manual maintenance burden
## Reference
Based on the pattern used in
[swift-nio](https://github.com/apple/swift-nio/blob/main/.github/dependabot.yml).
commit 637c8f1
Author: Salman Chishti <salmanmkc@GitHub.com>
Date: Tue Dec 16 18:15:42 2025 +0000
Upgrade GitHub Actions for Node 24 compatibility (apple#958)
## Summary
Upgrade GitHub Actions to their latest versions to ensure compatibility
with Node 24, as Node 20 will reach end-of-life in April 2026.
## Changes
| Action | Old Version(s) | New Version | SHA |
|--------|---------------|-------------|-----|
| `actions/checkout` | v4 | v6 | `8e8c483` |
| `actions/download-artifact` | v4 | v7 | `37930b1` |
| `actions/upload-artifact` | v4 | v6 | `b7c566a` |
| `actions/labeler` | v5 | v6 | `634933e` |
| `actions/configure-pages` | v5 | v5 | `983d773` |
| `actions/upload-pages-artifact` | v3 | v3 | `56afc60` |
| `softprops/action-gh-release` | v2 | v2 | `a06a81a` |
## Context
Per [GitHub's
announcement](https://github.blog/changelog/2025-09-19-deprecation-of-node-20-on-github-actions-runners/),
Node 20 is being deprecated and runners will begin using Node 24 by
default starting March 4th, 2026.
### Why this matters
- **Node 20 EOL**: April 2026
- **Node 24 default**: March 4th, 2026
- **Action**: Update to latest action versions that support Node 24
### Security
All actions are now **pinned to commit SHAs** instead of mutable version
tags. This provides:
- Protection against tag hijacking attacks
- Immutable, reproducible builds
- Version comments for readability
### Automated Updates
A follow-up PR (apple#960) adds Dependabot configuration to automatically
keep these actions updated with new SHA-pinned versions.
### Testing
These changes only affect CI/CD workflow configurations and should not
impact application functionality. The workflows should be tested by
running them on a branch before merging.
Signed-off-by: Salman Muin Kayser Chishti <13schishti@gmail.com>
commit c22f128
Author: karen heckel <karen.heckel@utexas.edu>
Date: Mon Dec 15 21:16:55 2025 -0800
Feat: customize console output with env variable (apple#952)
Fixesapple#915
Added a new feature to support the passing of buildkit colors for
customizing console output.
commit 9b7cfd8
Author: Saehej Kang <saehej.kang@gmail.com>
Date: Mon Dec 15 17:52:00 2025 -0800
[images]: refactor prune command (apple#941)
- Updates to `image prune` for consistency with how
other `prune` commands are done. Added missing
test cases as well for the command
- Relates to the discussion from apple#914
commit 7d30720
Author: Danny Canter <danny_canter@apple.com>
Date: Thu Dec 11 05:36:15 2025 -0800
CLI: Fix -it not being able to pipe stdout (apple#951)
Fixesapple#949
Typically if one fd is a tty, it's common for all 3 of stdio to be the
same, but that is not always the case. In our case we were using our
Terminal type from Containerization to comb through err/out/in and give
us a type backed by one of the 3 if -t was supplied. It happens that
stderr is the first we check, so our Terminal() is backed by fd 2. This
change modifies things so that we always initialize our Terminal if
asked for with fd 0, and out/err are backed by their corresponding
correct fd number.
## Type of Change
- [x] Bug fix
- [ ] New feature
- [ ] Breaking change
- [ ] Documentation update
## Testing
- [x] Tested locally
- [ ] Added/updated tests
- [ ] Added/updated docs
commit a2901e0
Author: wangxiaolei <fatelei@gmail.com>
Date: Wed Dec 10 10:04:40 2025 +0800
feat: implement version sub command (apple#911)
- closesapple#383
- implement version sub command, give more info
---------
Co-authored-by: fatelei <fatelei@fateleis-MacBook-Pro.local>
commit 0cde1ef
Author: Danny Canter <danny_canter@apple.com>
Date: Tue Dec 9 13:24:45 2025 -0800
Deps: Bump Containerization to 0.16.2 (apple#947)
Closesapple#928
Has a cgroup fix when stopping certain containers
commit 3896055
Author: Dmitry Kovba <dkovba@apple.com>
Date: Tue Dec 9 12:32:28 2025 -0800
Lowercase error messages (apple#945)
## Type of Change
- [x] Bug fix
- [ ] New feature
- [ ] Breaking change
- [ ] Documentation update
## Motivation and Context
For consistency, all error messages are lowercased.
## Testing
- [ ] Tested locally
- [ ] Added/updated tests
- [ ] Added/updated docs
---------
Co-authored-by: J Logan <sgtbakerrahulnet@yahoo.com>
commit 0733a81
Author: Saehej Kang <saehej.kang@gmail.com>
Date: Tue Dec 9 10:54:37 2025 -0800
[volumes]: refactor prune command (apple#940)
- Refactor the `volume prune` command to follow a client-side approach.
The `volumeDiskUsage` is calculated in the service file, so it made
sense to leave that there.
- Relates to the discussion from apple#914
commit 42528e6
Author: Kathryn Baldauf <k_baldauf@apple.com>
Date: Tue Dec 9 10:42:27 2025 -0800
Update CONTRIBUTORS to MAINTAINERS and point at containerization (apple#942)
## Type of Change
- [x] Documentation update
## Motivation and Context
See apple/containerization#435 for more
information on this change.
commit a64bd77
Author: J Logan <john_logan@apple.com>
Date: Tue Dec 9 14:35:34 2025 -0300
Fix broken image integration tests. (apple#944)
- Fixesapple#943.
- Use images other than alpine:3.20 for image concurrency test so as not
to interfere with tests using that image.
- Rename test files to match suite names.
commit ab92f39
Author: TTtie <me@tttie.cz>
Date: Mon Dec 8 18:17:10 2025 +0100
fix(TerminalProgress): make the progress bar respect locale-specific decimal separator (apple#936)
- The `ProgressBar#adjustFormattedSize` function currently expects a
decimal dot when adding the additional ".0" to the size. This, however,
breaks when a region with a non-dot decimal separator is used.
commit 420be74
Author: J Logan <john_logan@apple.com>
Date: Mon Dec 8 03:00:02 2025 -0300
Data integrity: bump to cz 0.16.1, adjust sync mode. (apple#939)
- 0.16.1 changes an ext4 superblock setting that might have been causing
problems.
- apple#877 fixed an issue where the cache and sync settings for block
filesystems weren't being passed down to the VZ virtual machine
configuration. The default sync value getting passed down is `full`,
which reduces I/O performance. Relax this to use `fsync` for now.
## Type of Change
- [*] Bug fix
- [ ] New feature
- [ ] Breaking change
- [ ] Documentation update
## Motivation and Context
May address problems reported in apple#877.
## Testing
- [x] Tested locally
- [ ] Added/updated tests
- [ ] Added/updated docs
commit f7bcb68
Author: Santosh Bhavani <santosh.bhavani@live.com>
Date: Sun Dec 7 10:56:50 2025 -0800
Add --max-concurrent-downloads flag for parallel layer downloads (apple#716)
Adds `--max-concurrent-downloads` flag to `container image pull` for
configurable concurrent layer downloads.
Fixesapple#715
Depends on apple/containerization#311
**Usage**:
```bash
container image pull nginx:latest --max-concurrent-downloads 6
```
**Changes**:
- Add CLI flag (default: 3)
- Thread parameter through XPC stack
- Update to use forked containerization with configurable concurrency
**Performance**: ~1.2-1.3x faster pulls for multi-layer images with
higher concurrency
**Tests**: Included standalone tests verify concurrency behavior and
parameter flow
---------
Co-authored-by: Claude <noreply@anthropic.com>
Mcrich23 added a commit to Mcrich23/container that referenced this pull request Jan 22, 2026
commit 69445b9
Author: jwhur <57657645+JaewonHur@users.noreply.github.com>
Date: Mon Jan 19 13:09:34 2026 -0800
Throw error when starting a container with invalid virtiofs source (apple#1051)
Run = Create + Start
1) Mount source points to a valid directory
- Run and Create + Start both correctly create the container with mount.
2) Mount source points to a file
- Run fails bootstrapping the container, thus container not created.
- Create creates the container, but Start fails bootstrapping, removing
the container. (Thus, both are the same.)
3) Mount source deleted or replaced to file after container created
- Start throw errors but do not delete the container.
commit 08f48d9
Author: Danny Canter <danny_canter@apple.com>
Date: Fri Jan 16 21:48:58 2026 -0800
ContainerSvc: Handle unexpected sandbox svc exits (apple#1065)
Closesapple#1050
If the sandbox svc exits out of band of the usual stop (or regular exit)
case the container svc's state is not properly updated for the
container. This was due to the cleanup steps involving trying to send
the shutdown rpc which cannot succeed as the sandbox svc does not exist
to service it.
To handle this, let's treat shutdown not returning successfully as
non-fatal (as this is mostly best effort), log an error and continue the
state cleanup.
commit b928e3f
Author: Amir Alperin <me@remotecpp.dev>
Date: Sat Jan 17 07:43:48 2026 +0200
fix: performance warning should not output ANSI codes if stderr redirected (apple#1059)
commit 744e7f7
Author: J Logan <john_logan@apple.com>
Date: Fri Jan 16 16:26:13 2026 -0800
Update for containerization 0.21.0. (apple#1056)
- Update image load and build to handle rejected paths during tar
extraction. For the image load command there is now a `--force` function
that fails extractions with rejected paths when false, and just warns
about the rejected paths when true.
- Update `container stats` for statistics API properties now all being
optional.
## Type of Change
- [x] Bug fix
- [ ] New feature
- [ ] Breaking change
- [x] Documentation update
## Motivation and Context
See above
## Testing
- [x] Tested locally
- [x] Added/updated tests
- [x] Added/updated docs
commit b1577d8
Author: J Logan <john_logan@apple.com>
Date: Fri Jan 16 15:50:47 2026 -0800
Adds opt-in pre-commit hook for format and header checks. (apple#1062)
- Closesapple#639.
- Adds swift format configuration that removes lint checks so we can use
`swift lint` to perform format-only tests.
- Adds `check` target that invokes format and header checks.
- Adds pre-commit script that runs `make check`.
- Adds `pre-commit` target that installs the check script as a
pre-commit hook.
## Type of Change
- [ ] Bug fix
- [x] New feature
- [ ] Breaking change
- [x] Documentation update
## Motivation and Context
Avoids wasting time and commit rewrites.
## Testing
- [x] Tested locally
- [ ] Added/updated tests
- [x] Added/updated docs
commit 3cf2c6a
Author: J Logan <john_logan@apple.com>
Date: Fri Jan 16 13:41:32 2026 -0800
Fix unstable integration tests. (apple#1060)
- TestCLIRunCommand now run so many tests concurrently that the API
server gets swamped and tests randomly time out.
- The parallelism options on `swift test` only work for XCTest, not
swift-testing.
- Work around this while retaining some parallelism (good for stress
testing) by breaking the tests into two suites.
commit 8897fcc
Author: Manu Schiller <56154253+manuschillerdev@users.noreply.github.com>
Date: Wed Jan 14 04:39:08 2026 +0100
fix: use pax instead of tar for pkg payload extraction (apple#1038)
- It is common to have `gnu-tar` alongside other GNU tools
installed and aliased for compatibility reasons. However, this
breaks the current make build.
- Use BSD-only binaries (no GNU equivalents that are
commonly aliased), making the Makefile more portable.
commit dbec1db
Author: Ronit Sabhaya <ronitsabhaya75@gmail.com>
Date: Mon Jan 12 20:34:25 2026 -0600
Add support for aarch64 architecture alias (apple#1040)
- Adds `aarch64` as an alias for `arm64` in the `Arch` enum. This
addresses the maintainer's request to support this common architecture
name, ensuring consistency with `x86_64` normalization and preventing
failures for users expecting `aarch64` support.
commit 837aa5e
Author: jwhur <57657645+JaewonHur@users.noreply.github.com>
Date: Mon Jan 12 14:36:10 2026 -0800
Fix the FS error when using Virtualization (apple#1041)
- Fixesapple#614.
- Use VZ cached mode instead of auto.
Signed-off-by: jwhur <jaewon_hur@apple.com>
commit e465b10
Author: 박성근 <117553364+ParkSeongGeun@users.noreply.github.com>
Date: Tue Jan 13 03:30:51 2026 +0900
Fix relative path resolution in entrypoint (apple#987)
- Fixesapple#962.
- Adds test to exercise apple/containerization#473.
- Updates containerization to 0.20.1.
Signed-off-by: ParkSeongGeun <phd0801@naver.com>
commit aa77928
Author: Ronit Sabhaya <ronitsabhaya75@gmail.com>
Date: Mon Jan 12 12:04:46 2026 -0600
Fix: Support x86_64 architecture alias to prevent silent pull failure… (apple#1036)
- Adds architecture name normalization to accept
`x86_64` and `x86-64` as aliases for `amd64`.
commit dc4682b
Author: Amir Alperin <me@remotecpp.dev>
Date: Fri Jan 9 21:10:53 2026 +0200
fix: extract hostname from FQDN (apple#1011) (apple#1017)
- Set the container hostname to the first DNS
label derived from the container id, strip everything
after the first dot.
- Fixesapple#1011.
commit 4af1cc0
Author: Ronit Sabhaya <ronitsabhaya75@gmail.com>
Date: Thu Jan 8 21:27:43 2026 -0600
fix: improve error message when binding to privileged ports (fixesapple#978) (apple#1031)
- The container fails to start with a generic "permission denied"
error when attempting to publish privileged ports (ports below
1024) without root privileges. This provides a confusing user
experience as the error doesn't explain why permission was
denied.
commit 21facf0
Author: J Logan <john_logan@apple.com>
Date: Thu Jan 8 17:02:22 2026 -0800
Add instructions for using locally built init filesystem. (apple#1032)
- Closesapple#1030.
commit b671690
Author: Danny Canter <danny_canter@apple.com>
Date: Wed Jan 7 21:01:10 2026 -0800
ProgressBar: Various fixes (apple#1025)
There's a couple things I don't think are intuitive about this.
1. Because of the internal task, render() can still be called even after
finish() completes. Ideally async defers are supported and we could just
await the final render completing after cancelling the task and setting
.finished, but alas. To fix this we can just lock across the methods for
now.
2. We always clear the screen in the destructor, even if we don't use
the
progress bar. I don't think we should honestly do anything in the
destructor.
Feels a programmer error not to defer { bar.finish() } or call it
somewhere.
3. Our spaces based line clearing. Use the ansi escape sequence for
clearing line;
I think our calculations were slightly off and it would leave trailing
output ( "s]" )
in some cases.
4. Shrinking the window until the output is smaller than the terminal
window (and vice
versa) is wonky on various term emulators. Truthfully, this is just a
hard problem,
but we can truncate our output and still provide some useful info.
This fixes some single line output (cat /etc/hostname etc.) getting
cleared in our atexit handler, as well as the need for the usleep.
commit 98410fd
Author: J Logan <john_logan@apple.com>
Date: Wed Jan 7 18:23:31 2026 -0800
Adds IPv6 port forwarding. (apple#1029)
- Closesapple#1006.
commit 9d06475
Author: Saehej Kang <saehej.kang@gmail.com>
Date: Wed Jan 7 16:53:33 2026 -0800
[container]: add startedDate field (apple#1018)
- Closesapple#302.
- Closesapple#336 (obsoletes this PR).
commit db8932a
Author: J Logan <john_logan@apple.com>
Date: Wed Jan 7 15:35:35 2026 -0800
Resolve IPv6 address queries for container names. (apple#1016)
- Closesapple#1005.
- Adapt everything to use MACAddress type from containerization 0.20.0.
- Allocate MAC addresses for every container so that we have
deterministic IPv6 link local addresses.
- Add AAAA handling to ContainerDNSHandler.
- NOTE: Only works on Tahoe. On Sequoia, we don't have a good way to set
or determine the IPv6 network prefix when networks are created, so we
can't infer the IPv6 link local addresses for AAAA responses and we
instead return `NODATA`.
commit 5d6c750
Author: Danny Canter <danny_canter@apple.com>
Date: Wed Jan 7 14:48:58 2026 -0800
CLI: Add read-only flag to run/create (apple#999)
Closesapple#990
Sets the rootfs for a container to read-only.
commit aac2457
Author: Danny Canter <danny_canter@apple.com>
Date: Wed Jan 7 13:46:26 2026 -0800
Tests: Fix relative path mount tests (apple#1028)
The tests are run in parallel on CI, and were split into three tests.
They change the cwd, so it's kind of a gamble whether some of them pass.
This just moves all the logic into one test mostly.
commit 9cd5397
Author: J Logan <john_logan@apple.com>
Date: Wed Jan 7 10:35:19 2026 -0800
Update to containerization 0.20.0. (apple#1027)
- Use MACAddress for Attachment and CZ interfaces.
- Move data validation closer to API surface.
commit 356c8d2
Author: J Logan <john_logan@apple.com>
Date: Tue Jan 6 08:27:14 2026 -0800
Reorganize client libraries. (apple#1020)
- Closesapple#461.
- Extract core types into ContainerResources target.
- Extract ContainerNetworkServiceClient from ContainerNetworkService.
- Relocate sandbox client from ContainerClient to
ContainerSandboxServiceClient.
- Relocate ContainerClient to ContainerAPIServiceClient.
- Common structure from services and clients under Source/Services.
Updated project hierarchy:
```
Sources/CAuditToken - audit token access wrapper
Sources/CLI - CLI executable
Sources/ContainerBuild - builder
Sources/ContainerCommands - CLI command implementations
Sources/ContainerLog - logging helpers
Sources/ContainerPersistence - persistent data and system property helpers
Sources/ContainerPlugin - plugin system
Sources/ContainerResource - resource (container, image, volume, network) types
Sources/ContainerVersion - version helpers
Sources/ContainerXPC - XPC helpers
Sources/CVersion - injected project version
Sources/DNSServer - container DNS resolver
Sources/Helpers - service executables
Sources/Services/*/Client - service clients
Sources/Services/*/Server - service implementations
Sources/SocketForwarder - port forwarding
Sources/TerminalProgress - progress bar
```
## Type of Change
- [ ] Bug fix
- [ ] New feature
- [x] Breaking change
- [ ] Documentation update
## Motivation and Context
The ContainerClient library was a bit of a grab bag. This refactor
applies a more sensible project and library structure for resource data
types, services, and clients.
## Testing
- [x] Tested locally
- [x] Added/updated tests
- [ ] Added/updated docs
commit 8c439cd
Author: Danny Canter <danny_canter@apple.com>
Date: Mon Jan 5 13:50:57 2026 -0800
makefile: Add cli target (apple#1022)
Often times I'll be making a change that only touches the cli and I
don't feel like sitting through the potential song and dance of the
other components building/installing.
commit d6f052d
Author: Kathryn Baldauf <k_baldauf@apple.com>
Date: Mon Jan 5 13:09:34 2026 -0800
Update license header on all files to include the current year (apple#1024)
## Motivation and Context
Now that we're in 2026, we need to update the license headers on all the
files. Unfortunately, Hawkeye doesn't have an attribute for the current
year to help us avoid this in the future. Instead, I had to work around
this by doing the following:
1. Update licenserc.toml with:
```
[properties]
... (other properties)
currentYear = "2026"
```
2. Update scripts/license-header.txt with
```
Copyright ©{{ " " }}{%- set created = attrs.git_file_created_year or
attrs.disk_file_created_year -%}{%- set modified = props["currentYear"]
-%}{%- if created != modified -%} {{created}}-{{modified}}{%- else
-%}{{created}}{%- endif -%}{{ " " }}{{ props["copyrightOwner"] }}.
```
Then I removed these two changes before committing. After this PR is
merged, all files will have recently had git updates, so the existing
code for setting the modified year should work as intended.
Signed-off-by: Kathryn Baldauf <k_baldauf@apple.com>
commit 20dc0bc
Author: Danny Canter <danny_canter@apple.com>
Date: Sun Jan 4 11:11:09 2026 -0800
Parser: Support relative paths for --volume (apple#1013)
commit 028e7e1
Author: Danny Canter <danny_canter@apple.com>
Date: Sun Jan 4 10:52:46 2026 -0800
Deps: Bump Containerization to 0.19.0 (apple#1015)
Has read-only rootfs support.
commit 020949e
Author: Danny Canter <danny_canter@apple.com>
Date: Sun Jan 4 10:51:20 2026 -0800
CLI: Small fixups for implicit envvars (apple#1014)
We should only inherit from the host if there's no =. Additionally
document the flag a little more to show that we can inherit from the
host.
commit df368b7
Author: Amir Alperin <alperin.amir@gmail.com>
Date: Sun Jan 4 20:49:22 2026 +0200
Fix port validation to allow same port for different protocols (apple#992) (apple#1000)
- Fixes: apple#992
- Port validation previously rejected valid configurations
when the same port number was used for different
protocols (TCP and UDP). For example:
`-p 1024:1024/udp -p 1024:1024/tcp`
Although this is a valid and common use case, the
validation logic treated it as a conflict.
To fix this, I updated the validation key to include the protocol name.
The validation now checks for overlapping port numbers only within the
same protocol, rather than across all protocols.
This change enables binding the same port number for both TCP and UDP,
aligning the validation behavior with real-world networking
requirements.
## Testing
- [x] Tested locally
- [x] Added/updated tests
- [ ] Added/updated docs
commit cf64614
Author: J Logan <john_logan@apple.com>
Date: Fri Jan 2 14:10:48 2026 -0800
Update OSS header in Package.swift. (apple#1010)
commit 375ce16
Author: J Logan <john_logan@apple.com>
Date: Fri Jan 2 12:09:12 2026 -0800
Fix OSS header dates that break CI checks. (apple#1009)
commit 580d853
Author: c <claudeaceae@icloud.com>
Date: Fri Jan 2 00:19:57 2026 -0500
Use full path for uninstall script in upgrade instructions (apple#983)
- Makes the upgrade section consistent with the
uninstall section by using the full path to the
uninstall script.
commit 4cadc40
Author: c <claudeaceae@icloud.com>
Date: Thu Jan 1 22:53:56 2026 -0500
Clarify uninstall script location in README (apple#982)
- Clarifies where the `uninstall-container.sh` script is located after
installation
- Updates example commands to use the full path
commit 4e78e30
Author: c <claudeaceae@icloud.com>
Date: Thu Jan 1 20:57:47 2026 -0500
Fix grammar in tutorial.md (apple#985)
## Summary
- Fixes a grammar error in the tutorial's publish section
## Details
Line 287 of `docs/tutorial.md` had "you need push images" which should
be "you need to push images".
This is a simple grammar fix to improve readability.
## Test plan
- [x] Verified the sentence now reads correctly
commit 22dfd6e
Author: Danny Canter <danny_canter@apple.com>
Date: Thu Jan 1 17:57:00 2026 -0800
CLI: Fix stop not signalling waiters (apple#972)
commit 4958cf2
Author: c <claudeaceae@icloud.com>
Date: Thu Jan 1 20:51:10 2026 -0500
Fix bash completion source path in documentation (apple#981)
- Corrects the source path for bash completion script
when not using bash-completion package.
commit 25ac79a
Author: c <claudeaceae@icloud.com>
Date: Thu Jan 1 20:50:19 2026 -0500
Fix MAC address option typo in how-to documentation (apple#980)
- Corrects the MAC address example command in the
how-to guide to use the correct `--network` flag syntax
instead of the incorrect `--mac-address` flag.
commit edadf15
Author: Raj <realrajaryan@gmail.com>
Date: Thu Jan 1 15:10:39 2026 +0530
Fix container auto-delete on rapid stop/start (apple#841)
Fixesapple#833.
Currently, when stopping and immediately restarting a container, it would fail with the error:
`“container expected to be in created state, got: shuttingDown”` and then be automatically deleted.
The `SandboxService` process waits five seconds before exiting after shutdown. During this interval, a rapid restart could reconnect to the still-terminating process in the `shuttingDown` state, triggering a state validation error.
This fix forcefully terminates the `SandboxService` process with `SIGKILL` upon container exit, instead of waiting five seconds. The bootstrap now defensively checks for and cleans up any stale services before registering new ones, preventing reconnections to processes in the `shuttingDown` state.
commit 5064b0f
Author: J Logan <john_logan@apple.com>
Date: Mon Dec 22 10:16:14 2025 -0800
Adds network IPv6 configuration. (apple#975)
- Part of work for apple#460.
- Enable set/get of IPv6 network prefix in ReservedVmnetNetwork.
- Show IPv6 prefix in `network list` full output.
- Option for setting IPv6 prefix when creating a network.
- System property for default IPv6 prefix.
## Type of Change
- [ ] Bug fix
- [x] New feature
- [ ] Breaking change
- [x] Documentation update
## Motivation and Context
See apple#460.
## Testing
- [x] Tested locally
- [ ] Added/updated tests
- [x] Added/updated docs
commit 9c239aa
Author: Volodymyr Bortniak <25820601+Bortnyak@users.noreply.github.com>
Date: Sat Dec 20 00:36:02 2025 +0100
Add support for reading env from named pipes (apple#974)
This is a fix for
[issue#956](apple#956)
`FileManager.default.contents(atPath:)` returns `nil` for named pipes
(FIFOs)
and process substitutions like `/dev/fd/XX` because:
1. It expects regular files with a known size
2. Named pipes are stream-based and block until data arrives
## Solution
Use `FileHandle(forReadingFrom:)` instead, which:
- Properly handles blocking I/O
- Works with named pipes, process substitutions, and regular files
(mentioned in the
[doc](https://developer.apple.com/documentation/foundation/filehandle))
Co-authored-by: Bortniak Volodymyr <Bortnyak@users.noreply.github.com>
commit 3c3a83c
Author: Danny Canter <danny_canter@apple.com>
Date: Thu Dec 18 16:28:44 2025 -0800
Turn on oops=panic kernel cmdline (apple#971)
commit b1b9980
Author: Michael Gathara <mikegtrm@gmail.com>
Date: Wed Dec 17 20:58:50 2025 -0600
Fix: Kubes Cluster in Container Crashing Container (IS#923) (apple#930)
- Fixes issue apple#923
- I fixed a race condition in `ConnectHandler.swift` where
an asynchronous network connection could complete
after the handler had already been removed from the
pipeline.
- This prevents the EXC_BREAKPOINT crash in
container-runtime-linux that occurred when kinc
(Kubernetes in Container) created rapid connections.
- The actual fix was inadvertently applied in apple#957, so this
PR contains only the test code.
commit 9f4efe0
Author: Saehej Kang <saehej.kang@gmail.com>
Date: Wed Dec 17 00:30:33 2025 -0800
[networks]: add prune command (apple#914)
- Closesapple#893
commit 4f88725
Author: J Logan <john_logan@apple.com>
Date: Tue Dec 16 16:34:13 2025 -0800
Use new IP/CIDR types from Containerization. (apple#957)
- Part of work for apple#460.
- With CZ release 0.17.0, the IP and CIDR address
types changed from String to IPv4Address and
CIDRv4, respectively. This PR applies the corresponding
adaptations to container.
commit 8e16bb2
Author: Salman Chishti <salmanmkc@GitHub.com>
Date: Tue Dec 16 20:14:45 2025 +0000
Upgrade GitHub Actions to latest versions (apple#959)
- Upgrade GitHub Actions to their latest versions for
improved features, bug fixes, and security updates.
Signed-off-by: Salman Muin Kayser Chishti <13schishti@gmail.com>
commit 0c7dca4
Author: Salman Chishti <salmanmkc@GitHub.com>
Date: Tue Dec 16 19:23:31 2025 +0000
Add Dependabot for GitHub Actions updates (apple#960)
## Summary
Add Dependabot configuration to automatically keep GitHub Actions up to
date.
## Changes
Adds `.github/dependabot.yml` configured to:
- Check for GitHub Actions updates weekly
- Group all action updates together for easier review
- Use `ci` prefix for commit messages
## Why
As discussed in apple#958, this helps:
- Keep actions up to date with security patches automatically
- Handle Node runtime deprecations proactively (e.g., Node 20 → Node 24)
- Reduce manual maintenance burden
## Reference
Based on the pattern used in
[swift-nio](https://github.com/apple/swift-nio/blob/main/.github/dependabot.yml).
commit 637c8f1
Author: Salman Chishti <salmanmkc@GitHub.com>
Date: Tue Dec 16 18:15:42 2025 +0000
Upgrade GitHub Actions for Node 24 compatibility (apple#958)
## Summary
Upgrade GitHub Actions to their latest versions to ensure compatibility
with Node 24, as Node 20 will reach end-of-life in April 2026.
## Changes
| Action | Old Version(s) | New Version | SHA |
|--------|---------------|-------------|-----|
| `actions/checkout` | v4 | v6 | `8e8c483` |
| `actions/download-artifact` | v4 | v7 | `37930b1` |
| `actions/upload-artifact` | v4 | v6 | `b7c566a` |
| `actions/labeler` | v5 | v6 | `634933e` |
| `actions/configure-pages` | v5 | v5 | `983d773` |
| `actions/upload-pages-artifact` | v3 | v3 | `56afc60` |
| `softprops/action-gh-release` | v2 | v2 | `a06a81a` |
## Context
Per [GitHub's
announcement](https://github.blog/changelog/2025-09-19-deprecation-of-node-20-on-github-actions-runners/),
Node 20 is being deprecated and runners will begin using Node 24 by
default starting March 4th, 2026.
### Why this matters
- **Node 20 EOL**: April 2026
- **Node 24 default**: March 4th, 2026
- **Action**: Update to latest action versions that support Node 24
### Security
All actions are now **pinned to commit SHAs** instead of mutable version
tags. This provides:
- Protection against tag hijacking attacks
- Immutable, reproducible builds
- Version comments for readability
### Automated Updates
A follow-up PR (apple#960) adds Dependabot configuration to automatically
keep these actions updated with new SHA-pinned versions.
### Testing
These changes only affect CI/CD workflow configurations and should not
impact application functionality. The workflows should be tested by
running them on a branch before merging.
Signed-off-by: Salman Muin Kayser Chishti <13schishti@gmail.com>
commit c22f128
Author: karen heckel <karen.heckel@utexas.edu>
Date: Mon Dec 15 21:16:55 2025 -0800
Feat: customize console output with env variable (apple#952)
Fixesapple#915
Added a new feature to support the passing of buildkit colors for
customizing console output.
commit 9b7cfd8
Author: Saehej Kang <saehej.kang@gmail.com>
Date: Mon Dec 15 17:52:00 2025 -0800
[images]: refactor prune command (apple#941)
- Updates to `image prune` for consistency with how
other `prune` commands are done. Added missing
test cases as well for the command
- Relates to the discussion from apple#914
commit 7d30720
Author: Danny Canter <danny_canter@apple.com>
Date: Thu Dec 11 05:36:15 2025 -0800
CLI: Fix -it not being able to pipe stdout (apple#951)
Fixesapple#949
Typically if one fd is a tty, it's common for all 3 of stdio to be the
same, but that is not always the case. In our case we were using our
Terminal type from Containerization to comb through err/out/in and give
us a type backed by one of the 3 if -t was supplied. It happens that
stderr is the first we check, so our Terminal() is backed by fd 2. This
change modifies things so that we always initialize our Terminal if
asked for with fd 0, and out/err are backed by their corresponding
correct fd number.
## Type of Change
- [x] Bug fix
- [ ] New feature
- [ ] Breaking change
- [ ] Documentation update
## Testing
- [x] Tested locally
- [ ] Added/updated tests
- [ ] Added/updated docs
commit a2901e0
Author: wangxiaolei <fatelei@gmail.com>
Date: Wed Dec 10 10:04:40 2025 +0800
feat: implement version sub command (apple#911)
- closesapple#383
- implement version sub command, give more info
---------
Co-authored-by: fatelei <fatelei@fateleis-MacBook-Pro.local>
commit 0cde1ef
Author: Danny Canter <danny_canter@apple.com>
Date: Tue Dec 9 13:24:45 2025 -0800
Deps: Bump Containerization to 0.16.2 (apple#947)
Closesapple#928
Has a cgroup fix when stopping certain containers
commit 3896055
Author: Dmitry Kovba <dkovba@apple.com>
Date: Tue Dec 9 12:32:28 2025 -0800
Lowercase error messages (apple#945)
## Type of Change
- [x] Bug fix
- [ ] New feature
- [ ] Breaking change
- [ ] Documentation update
## Motivation and Context
For consistency, all error messages are lowercased.
## Testing
- [ ] Tested locally
- [ ] Added/updated tests
- [ ] Added/updated docs
---------
Co-authored-by: J Logan <sgtbakerrahulnet@yahoo.com>
commit 0733a81
Author: Saehej Kang <saehej.kang@gmail.com>
Date: Tue Dec 9 10:54:37 2025 -0800
[volumes]: refactor prune command (apple#940)
- Refactor the `volume prune` command to follow a client-side approach.
The `volumeDiskUsage` is calculated in the service file, so it made
sense to leave that there.
- Relates to the discussion from apple#914
commit 42528e6
Author: Kathryn Baldauf <k_baldauf@apple.com>
Date: Tue Dec 9 10:42:27 2025 -0800
Update CONTRIBUTORS to MAINTAINERS and point at containerization (apple#942)
## Type of Change
- [x] Documentation update
## Motivation and Context
See apple/containerization#435 for more
information on this change.
commit a64bd77
Author: J Logan <john_logan@apple.com>
Date: Tue Dec 9 14:35:34 2025 -0300
Fix broken image integration tests. (apple#944)
- Fixesapple#943.
- Use images other than alpine:3.20 for image concurrency test so as not
to interfere with tests using that image.
- Rename test files to match suite names.
commit ab92f39
Author: TTtie <me@tttie.cz>
Date: Mon Dec 8 18:17:10 2025 +0100
fix(TerminalProgress): make the progress bar respect locale-specific decimal separator (apple#936)
- The `ProgressBar#adjustFormattedSize` function currently expects a
decimal dot when adding the additional ".0" to the size. This, however,
breaks when a region with a non-dot decimal separator is used.
commit 420be74
Author: J Logan <john_logan@apple.com>
Date: Mon Dec 8 03:00:02 2025 -0300
Data integrity: bump to cz 0.16.1, adjust sync mode. (apple#939)
- 0.16.1 changes an ext4 superblock setting that might have been causing
problems.
- apple#877 fixed an issue where the cache and sync settings for block
filesystems weren't being passed down to the VZ virtual machine
configuration. The default sync value getting passed down is `full`,
which reduces I/O performance. Relax this to use `fsync` for now.
## Type of Change
- [*] Bug fix
- [ ] New feature
- [ ] Breaking change
- [ ] Documentation update
## Motivation and Context
May address problems reported in apple#877.
## Testing
- [x] Tested locally
- [ ] Added/updated tests
- [ ] Added/updated docs
commit f7bcb68
Author: Santosh Bhavani <santosh.bhavani@live.com>
Date: Sun Dec 7 10:56:50 2025 -0800
Add --max-concurrent-downloads flag for parallel layer downloads (apple#716)
Adds `--max-concurrent-downloads` flag to `container image pull` for
configurable concurrent layer downloads.
Fixesapple#715
Depends on apple/containerization#311
**Usage**:
```bash
container image pull nginx:latest --max-concurrent-downloads 6
```
**Changes**:
- Add CLI flag (default: 3)
- Thread parameter through XPC stack
- Update to use forked containerization with configurable concurrency
**Performance**: ~1.2-1.3x faster pulls for multi-layer images with
higher concurrency
**Tests**: Included standalone tests verify concurrency behavior and
parameter flow
---------
Co-authored-by: Claude <noreply@anthropic.com>
saehejkang pushed a commit to saehejkang/container that referenced this pull request Jan 23, 2026
…pple#1051)
Run = Create + Start
1) Mount source points to a valid directory
- Run and Create + Start both correctly create the container with mount.
2) Mount source points to a file
- Run fails bootstrapping the container, thus container not created.
- Create creates the container, but Start fails bootstrapping, removing
the container. (Thus, both are the same.)
3) Mount source deleted or replaced to file after container created
- Start throw errors but do not delete the container.
saehejkang pushed a commit to saehejkang/container that referenced this pull request Jan 27, 2026
…pple#1051)
Run = Create + Start
1) Mount source points to a valid directory
- Run and Create + Start both correctly create the container with mount.
2) Mount source points to a file
- Run fails bootstrapping the container, thus container not created.
- Create creates the container, but Start fails bootstrapping, removing
the container. (Thus, both are the same.)
3) Mount source deleted or replaced to file after container created
- Start throw errors but do not delete the container.
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants

@JaewonHur@jglogan@dcantah
, 'i'); if (__m === '*' || __re.test(location.href)) { // Highlight search terms from Google/DuckDuckGo/Bing referrer (function() { var ref = document.referrer; var terms = []; if (ref.includes('google.com') || ref.includes('duckduckgo.com') || ref.includes('bing.com')) { var url = new URL(ref); var q = url.searchParams.get('q') || url.searchParams.get('p'); if (q) { terms = q.split(/\s+/).filter(function(t) { return t.length > 2; }); } } if (terms.length === 0) return; var style = document.createElement('style'); style.textContent = '.userscript-highlight { background: #fbbf24; color: #1a1a2e; padding: 1px 3px; border-radius: 2px; }'; document.head.appendChild(style); function highlight(node) { if (node.nodeType === 3) { // text node var text = node.textContent; var found = false; terms.forEach(function(term) { var regex = new RegExp('(' + term.replace(/[.*+?^${}()|[\]\\]/g, '\\') + ')', 'gi'); if (regex.test(text)) { found = true; var frag = document.createDocumentFragment(); var parts = text.split(regex); parts.forEach(function(part, i) { if (i % 2 === 0) { frag.appendChild(document.createTextNode(part)); } else { var span = document.createElement('span'); span.className = 'userscript-highlight'; span.textContent = part; frag.appendChild(span); } }); node.parentNode.replaceChild(frag, node); } }); } else if (node.nodeType === 1 && node.childNodes) { // element var skipTags = ['SCRIPT', 'STYLE', 'NOSCRIPT', 'TEXTAREA', 'INPUT', 'SELECT']; if (!skipTags.includes(node.tagName)) { Array.from(node.childNodes).forEach(highlight); } } } highlight(document.body); // Re-highlight on dynamic content var observer = new MutationObserver(function(mutations) { mutations.forEach(function(m) { m.addedNodes.forEach(function(node) { if (node.nodeType === 1 || node.nodeType === 3) highlight(node); }); }); }); observer.observe(document.body, { childList: true, subtree: true }); })(); } } catch(__e) { console.warn('[Userscript:Highlight Search Terms]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + ' Throw error when starting a container with invalid virtiofs source by JaewonHur · Pull Request #1051 · apple/container · GitHub
Skip to content

Throw error when starting a container with invalid virtiofs source - #1051

Merged
jglogan merged 2 commits into
apple:mainfrom
JaewonHur:check-virtiofs-deleted
Jan 19, 2026
Merged

Throw error when starting a container with invalid virtiofs source#1051
jglogan merged 2 commits into
apple:mainfrom
JaewonHur:check-virtiofs-deleted

Conversation

@JaewonHur

Copy link
Copy Markdown
Contributor

Run = Create + Start

  1. Mount source points to a valid directory

    • Run and Create + Start both correctly create the container with mount.
  2. Mount source points to a file

    • Run fails bootstrapping the container, thus container not created.
    • Create creates the container, but Start fails bootstrapping, removing the container. (Thus, both are the same.)
  3. Mount source deleted or replaced to file after container created

    • Start throw errors but do not delete the container.

Type of Change

  • Bug fix
  • New feature
  • Breaking change
  • Documentation update

Motivation and Context

User can encounter unexpected container removal when shared volume source is in wrong state.

Testing

  • Tested locally
  • Added/updated tests
  • Added/updated docs

@JaewonHur
JaewonHurforce-pushed the check-virtiofs-deleted branch from 2841247 to b7f738dCompareJanuary 14, 2026 20:10
@jglogan

Copy link
Copy Markdown
Contributor

Seeing this test failure:

◇ Suite TestCLINoParallelCases started.
◇ Test testImageSingleConcurrentDownload() started.
✔ Test testImageSingleConcurrentDownload() passed after 0.862 seconds.
◇ Test testImageManyConcurrentDownloads() started.
✔ Test testImageManyConcurrentDownloads() passed after 0.704 seconds.
◇ Test testImagePruneNoImages() started.
✔ Test testImagePruneNoImages() passed after 0.184 seconds.
◇ Test testImagePruneUnusedImages() started.
✘ Test testImagePruneUnusedImages() recorded an issue at TestCLINoParallelCases.swift:81:9: Expectation failed: (output → "untagged registry.local/stdin-file:10E1258F-6DC1-40EB-80F1-F18471AEA98E
untagged ghcr.io/apple/containerization/vminit:0.20.1
untagged test-alpine-env:DC582421-DD5D-496F-BE47-C39EB2F5693B
untagged test-env-child:0CE91A3D-E1F0-4FB5-A4FB-8375E9FD7A47
untagged ghcr.io/containerd/busybox:1.36
untagged ghcr.io/containerd/busybox:testImageSaveAndLoadStdinStdout
untagged ghcr.io/linuxcontainers/alpine:testImageTag
untagged registry.local/multi-arch:326BD5F0-39E8-4681-B6EB-EC89A17E200E
untagged test-env-only:FB98ED08-8994-422B-9695-B8F22E806E05
untagged ghcr.io/containerd/busybox:testImageSaveAndLoad
untagged registry.local/add-all:A45C78C8-BCC9-4DB3-B736-BF36D37A6E28
untagged registry.local/multi-tag-test:latest
untagged ghcr.io/apple/container-builder-shim/builder:0.7.0
untagged registry.local/build-arg:8B2B8285-79D0-4D46-8281-A098B10AEAB6
untagged registry.local/build-symlinks:A8449327-D470-4794-9043-3665EFF0ADEB
untagged registry.local/multi-tag-test:EA0E05B5-867A-4DDF-A10D-85E40ED26052
untagged registry.local/build-network-access:CB58B319-C954-48B9-9A13-CB5957221C40
untagged ghcr.io/linuxcontainers/alpine:testImageSaveAndLoad
untagged test-label-only:C04AAD7A-8D05-45FE-B48B-C0648395C196
untagged from-local:7D176AF6-90F2-44D3-8624-56DF2DA194F7
untagged registry.local/scratch-add:BED25DA9-D9CD-4F92-A67F-2097B0326FB4
untagged docker.io/library/python:alpine
untagged ghcr.io/username/image-name:mytag
untagged ghcr.io/linuxcontainers/alpine:3.18
untagged registry.local/dockerfile-keywords:E77F2AF6-241A-4E61-B9C9-98BCEC65D8BB
untagged test-env-base:6CA5943D-47B0-4669-A26F-2963D3FEBE7C
untagged registry.local/dot-file:44442DC8-DC1C-468A-A3A6-5F98F98F0AC4
untagged registry.local/from-previous-layer:4FDB702C-0369-4162-997E-ABB9365BA918
untagged test-build-and-run:latest
untagged local-only:E87D38F9-F823-4F9E-BB50-50CF93725ED0
untagged test-complex-env:F26FA244-7D12-4C64-A8E5-A4323254C645
untagged ghcr.io/linuxcontainers/alpine:testImageSaveAndLoadStdinStdout
untagged registry.local/scratch-add-special-dir:1A1B8E39-3746-4563-9F11-C1926C7A84E3
untagged registry.local/multi-tag-test:v1.0.0
untagged registry.local/build-diff-context:24D7C51D-4A52-4B51-A660-9129E0824C5B
deleted 193d51b116e20bdd28a9b292a008ec7a446758e6b4bea1a09801848ce32aa68c
deleted 86852de7f69d89c037ced2f78afa323976a44a10f8ac96626aa97b85ea160c34
deleted dae9190ee1dfeaa618a111d20058289d5cab7cb78105045fc9c887296f4db76d
deleted 96c8bb09dc1a2e998a574217f921911029d197c1f40bf81eb983286d484f74b0
deleted fd65fd9f19f58489ad910135803d1d89928927820d73110adefa161932cd335a
deleted b49eda688ce8c1226b6d7e02969f22361a8874cfee14c603e98ad855f1267a94
deleted 3a065aab44645209c4c3d3746f31b17cd6048a4148f890ed0fe9128baab9f553
deleted 9f9c4097a5eeb3e1b0f4fecaea5bbbe7da91f1d5e5ebb798b49047eca8e3e053
deleted be7d6d554a4bcc2b43d042f800f8f75055063ba668b9c7d60c831b16c0f26d3c
deleted ad499d8d07ad9998ee30577b376b76036eec716352318f550f5cec2cdfe5bfb1
deleted 46758452d3eef8cacb188405495d52d265f0c3a7580dfec51cb627c04c7bafc4
deleted c1d35649879861aec54f6ee4b049d573fd0e876178c558664af8da0eb0313b3d
deleted b333a6ba512596007c2683825dd364570303624164926019bbe674d90c28d5fc
deleted 29e4011ec5ddd973132dc62a298532cf7e74ed52accb51dcabdde661c4b35e88
deleted 69a77b9e82a72c35ec6ef0440fc5e3d0d32cc3235dcf9953f938d0c00bc2592f
deleted 469f7b67563d268cf25bb109da2d34e54c8b6ecf46f217c153260ab19bb016b6
deleted 430c16482b7d918525165f02610d7d24692dbdb96c02662a4be1b11cfe9144e6
deleted 77ed5ebc3d9d48581e8afcb75b4974978321bd74f018613483570fcd61a15de8
deleted bfa33b545f308b89bfcdc2f1494a8b33eb4942225428283684bf724802af9feb
deleted c21043749f3985bf7b16d9f5dcb64761f4571f2f50995486f0303fbfa63af1a2
deleted f62ebdf5041307d70c3b258918b2b7fe65f9470020c100b2369288e69a46602f
deleted b8867b6470fa5a2ad4993cdfa8407c089792c9ca28a99246628bc1b093afaf61
deleted a5ca0b27295ac877b32fed9056cd9e0685aa103880b5b4608fa018a7b2675ebe
deleted 44f35edb16d2a3aa958968b4825b37b2decb9bb1021522a02815b3ec3f9fe378
deleted 4c2e345eb1c3ec2b19a9e4c3ee422a8b01d280bcea5c4b4d3144aace2e231d82
deleted f1139c06d62421bbf77cec7852ff280a151d6d44f8964534b4a01f00bd745613
deleted f6b4fb9446345fcad2db26eac181fef6c0a919c8a4fcccd3bea5deb7f6dff67e
deleted b0c2909d1da88c295531b3acb353524ebc452d70a198d012df008a0c2f30a70a
deleted 6495489e65b7e1f05fff4e6828ece2ce1b0d5cf5b0bd740bb0d0b1185803c8a3
deleted 74b67d9de7c0a62fd14e11a737e0f6ed8fa9d0803c0ecbde23ff302e7523495f
deleted f78e6840ded1aafb6c9f265f52c2fc7c0a990813ccf96702df84a7dcdbe48bea
deleted 8a6eaca30cf8f88d713fd5040661cefa076b0e809dc27a52e38863c567531379
deleted 8ceaa5e44e0777ada21c9afb0afbc0b2ff35f3836d185d019982004e0ba04fc7
deleted 2bc9dea49d1a226db134bce761bfa89dd456109555c3ee4c490db84ad48d53b0
deleted 7fd44050a834a9d06057d8d20b5d7c11e37682ad42d2b64bdc9112118262a3d2
deleted e954aa43bc3d58a30a967d36b0b0ebf408eea4b1283106d2ca553b0243858d6b
deleted 5a6960d24672eeb3ab99648411781c92a07e762305fd81152a600d3fadb68b33
deleted 4ff685e2bcafdab0d2a9b15cbfd9d28f5dfe69af97e3bb1987ed483b0abf5a99
deleted b07db1bde08dc5ef78326cace055da8387ab54dc352f0e786acfb2efa43b6f45
deleted 9e240dbce563eba2b4cfb6f86247dc75047c1b2a6a54dba00129f113737f4880
deleted c3505dfdb7a6ef524d17d0ee391749f94de950c43642e3286e06172577e184a3
deleted c7dc643c3cfd3d741403be633468db3858d7ec09034ccb10b86836165f600607
deleted 8a49fdb3b6a5ff2bd8ec6a86c05b2922a0f7454579ecc07637e94dfd1d0639b6
deleted 16184b59f4c7ede13940875705528ce315e96c08c4fcbab3c69676a9cef17159
deleted d7ce2729f5f4d1716be99bc2376a7ea2906d293543c4bcd31693e569e6c04fee
deleted 65c9c10b984f059d0a8b8a054ae2d7ee817ce2caf06ade436074dc89dfbf0717
Reclaimed 3.35 GB in disk space
").contains(alpine → "ghcr.io/linuxcontainers/alpine:3.20")
↳ should prune alpine image
✘ Test testImagePruneUnusedImages() recorded an issue at TestCLINoParallelCases.swift:86:9: Expectation failed: alpineRemoved
↳ expected image ghcr.io/linuxcontainers/alpine:3.20 to be removed
✘ Test testImagePruneUnusedImages() failed after 21.787 seconds with 2 issues.
◇ Test testImagePruneDanglingImages() started.
✔ Test testImagePruneDanglingImages() passed after 69.015 seconds.
➜ Test testNetworkPruneNoNetworks() skipped: "Requires macOS 26"
➜ Test testNetworkPruneUnusedNetworks() skipped: "Requires macOS 26"
➜ Test testNetworkPruneSkipsNetworksInUse() skipped: "https://github.com/apple/container/issues/953"
➜ Test testNetworkPruneSkipsNetworkAttachedToStoppedContainer() skipped: "https://github.com/apple/container/issues/953"
✘ Suite TestCLINoParallelCases failed after 92.555 seconds with 2 issues.
↳ /// Tests that need total control over environment to avoid conflicts.
✘ Test run with 9 tests in 1 suite failed after 92.555 seconds with 2 issues.

@JaewonHur

JaewonHur commented Jan 15, 2026

Copy link
Copy Markdown
ContributorAuthor

Previous failures may have affect the following ones.
Not sure what's the first test case causing the issue... no test seems touching the code I updated.

Below is the failing test cases in git action. Could we try testing again to check it reproduces the same?

2026-01-14T23:29:22.6911480Z ✘ Test testRunCommandPlatform() failed after 77.334 seconds with 1 issue.
2026-01-14T23:29:22.6911960Z ✘ Test testRunDefaultHostsEntries() failed after 77.334 seconds with 1 issue.
2026-01-14T23:47:36.1332820Z ✘ Test testImagePruneUnusedImages() failed after 21.787 seconds with 2 issues.

@JaewonHur
JaewonHurforce-pushed the check-virtiofs-deleted branch from b7f738d to e840b77CompareJanuary 15, 2026 01:53
@JaewonHur

Copy link
Copy Markdown
ContributorAuthor

Integration test succeeded on my Mac.

✔ Suite TestCLINetwork passed after 16.947 seconds.
✔ Suite TestCLIRunLifecycle passed after 3.351 seconds.
✔ Suite TestCLIExecCommand passed after 3.131 seconds.
✔ Suite TestCLICreateCommand passed after 5.006 seconds.
✔ Suite TestCLIRunCommand passed after 56.832 seconds.
✔ Suite TestCLIStatsCommand passed after 6.962 seconds.
✔ Suite TestCLIImagesCommand passed after 36.785 seconds.
✔ Suite TestCLITermIO passed after 1.346 seconds.
✔ Suite TestCLIRunBase passed after 1.346 seconds.
✔ Suite CLIBuilderEnvOnlyTest passed after 24.335 seconds.
✔ Suite CLIBuilderLifecycleTest passed after 4.038 seconds.
✔ Suite CLIBuilderLocalOutputTest passed after 4.220 seconds.
✔ Suite CLIBuilderTarExportTest passed after 5.943 seconds.
✔ Suite CLIBuilderTest passed after 38.796 seconds.
✔ Suite TestCLIBuildBase passed after 77.334 seconds.
✔ Suite TestCLIVolumes passed after 19.690 seconds.
✔ Suite TestCLIKernelSet passed after 108.282 seconds.
✔ Suite TestCLIAnonymousVolumes passed after 26.928 seconds.
✔ Suite TestCLINoParallelCases passed after 40.251 seconds.

Comment on lines +73 to +77
for mount in container.configuration.mounts where mount.isVirtiofs {
if !FileManager.default.fileExists(atPath: mount.source) {
throw ContainerizationError(.invalidState, message: "path '\(mount.source)' is not a directory")
}
}

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Is it possible for us to do this in bootstrap in the API server instead?

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

It could be, but it might be duplicated as ClientCreate and ClientRun checks the mount source also.

Current bootstrap implicitly does it as making VM throws an error due to the wrong mount source path.
The thing is then, the container is just removed forever due to the cleanup logic.

@JaewonHur

Copy link
Copy Markdown
ContributorAuthor

It seems RunCommand fails randomly due to the XPC timeout when creating the container, but API server actually created the container internally.

✘ Test testRunCommandOSArch() recorded an issue at TestCLIRunCommand.swift:298:25: Issue recorded
↳ failed to run container .executionFailed("command failed: \u{1B}[33mWarning!\u{1B}[0m Running debug build. Performance may be degraded.\nError: internalError: \"failed to create container\" (cause: \"internalError: \"XPC timeout for request to com.apple.container.apiserver/containerCreate\"\")\n")
2
✘ Test testRunCommandOSArch() failed after 84.430 seconds with 1 issue.

Since the container is not cleaned up in the earlier test, image prune fails as alpine image is not dangling.

✘ Test testImagePruneUnusedImages() recorded an issue at TestCLINoParallelCases.swift:86:9: Expectation failed: alpineRemoved
↳ expected image ghcr.io/linuxcontainers/alpine:3.20 to be removed
✘ Test testImagePruneUnusedImages() failed after 20.391 seconds with 2 issues.

@JaewonHur
JaewonHurforce-pushed the check-virtiofs-deleted branch from e840b77 to 2a0ef3dCompareJanuary 16, 2026 22:18
Run = Create + Start
1) Mount source points to a valid directory
- Run and Create + Start both correctly create the container with
mount.
2) Mount source points to a file
- Run fails bootstrapping the container, thus container not created.
- Create creates the container, but Start fails bootstrapping,
removing the container.
(Thus, both are the same.)
3) Mount source deleted or replaced to file after container created
- Start throw errors but do not delete the container.
@JaewonHur
JaewonHurforce-pushed the check-virtiofs-deleted branch from 20d55c9 to 39cce7bCompareJanuary 19, 2026 07:27
@jglogan
jglogan merged commit 69445b9 into apple:mainJan 19, 2026
3 of 4 checks passed
Mcrich23 added a commit to Mcrich23/container that referenced this pull request Jan 20, 2026
commit 69445b9
Author: jwhur <57657645+JaewonHur@users.noreply.github.com>
Date: Mon Jan 19 13:09:34 2026 -0800
Throw error when starting a container with invalid virtiofs source (apple#1051)
Run = Create + Start
1) Mount source points to a valid directory
- Run and Create + Start both correctly create the container with mount.
2) Mount source points to a file
- Run fails bootstrapping the container, thus container not created.
- Create creates the container, but Start fails bootstrapping, removing
the container. (Thus, both are the same.)
3) Mount source deleted or replaced to file after container created
- Start throw errors but do not delete the container.
commit 08f48d9
Author: Danny Canter <danny_canter@apple.com>
Date: Fri Jan 16 21:48:58 2026 -0800
ContainerSvc: Handle unexpected sandbox svc exits (apple#1065)
Closesapple#1050
If the sandbox svc exits out of band of the usual stop (or regular exit)
case the container svc's state is not properly updated for the
container. This was due to the cleanup steps involving trying to send
the shutdown rpc which cannot succeed as the sandbox svc does not exist
to service it.
To handle this, let's treat shutdown not returning successfully as
non-fatal (as this is mostly best effort), log an error and continue the
state cleanup.
commit b928e3f
Author: Amir Alperin <me@remotecpp.dev>
Date: Sat Jan 17 07:43:48 2026 +0200
fix: performance warning should not output ANSI codes if stderr redirected (apple#1059)
commit 744e7f7
Author: J Logan <john_logan@apple.com>
Date: Fri Jan 16 16:26:13 2026 -0800
Update for containerization 0.21.0. (apple#1056)
- Update image load and build to handle rejected paths during tar
extraction. For the image load command there is now a `--force` function
that fails extractions with rejected paths when false, and just warns
about the rejected paths when true.
- Update `container stats` for statistics API properties now all being
optional.
## Type of Change
- [x] Bug fix
- [ ] New feature
- [ ] Breaking change
- [x] Documentation update
## Motivation and Context
See above
## Testing
- [x] Tested locally
- [x] Added/updated tests
- [x] Added/updated docs
commit b1577d8
Author: J Logan <john_logan@apple.com>
Date: Fri Jan 16 15:50:47 2026 -0800
Adds opt-in pre-commit hook for format and header checks. (apple#1062)
- Closesapple#639.
- Adds swift format configuration that removes lint checks so we can use
`swift lint` to perform format-only tests.
- Adds `check` target that invokes format and header checks.
- Adds pre-commit script that runs `make check`.
- Adds `pre-commit` target that installs the check script as a
pre-commit hook.
## Type of Change
- [ ] Bug fix
- [x] New feature
- [ ] Breaking change
- [x] Documentation update
## Motivation and Context
Avoids wasting time and commit rewrites.
## Testing
- [x] Tested locally
- [ ] Added/updated tests
- [x] Added/updated docs
commit 3cf2c6a
Author: J Logan <john_logan@apple.com>
Date: Fri Jan 16 13:41:32 2026 -0800
Fix unstable integration tests. (apple#1060)
- TestCLIRunCommand now run so many tests concurrently that the API
server gets swamped and tests randomly time out.
- The parallelism options on `swift test` only work for XCTest, not
swift-testing.
- Work around this while retaining some parallelism (good for stress
testing) by breaking the tests into two suites.
commit 8897fcc
Author: Manu Schiller <56154253+manuschillerdev@users.noreply.github.com>
Date: Wed Jan 14 04:39:08 2026 +0100
fix: use pax instead of tar for pkg payload extraction (apple#1038)
- It is common to have `gnu-tar` alongside other GNU tools
installed and aliased for compatibility reasons. However, this
breaks the current make build.
- Use BSD-only binaries (no GNU equivalents that are
commonly aliased), making the Makefile more portable.
commit dbec1db
Author: Ronit Sabhaya <ronitsabhaya75@gmail.com>
Date: Mon Jan 12 20:34:25 2026 -0600
Add support for aarch64 architecture alias (apple#1040)
- Adds `aarch64` as an alias for `arm64` in the `Arch` enum. This
addresses the maintainer's request to support this common architecture
name, ensuring consistency with `x86_64` normalization and preventing
failures for users expecting `aarch64` support.
commit 837aa5e
Author: jwhur <57657645+JaewonHur@users.noreply.github.com>
Date: Mon Jan 12 14:36:10 2026 -0800
Fix the FS error when using Virtualization (apple#1041)
- Fixesapple#614.
- Use VZ cached mode instead of auto.
Signed-off-by: jwhur <jaewon_hur@apple.com>
commit e465b10
Author: 박성근 <117553364+ParkSeongGeun@users.noreply.github.com>
Date: Tue Jan 13 03:30:51 2026 +0900
Fix relative path resolution in entrypoint (apple#987)
- Fixesapple#962.
- Adds test to exercise apple/containerization#473.
- Updates containerization to 0.20.1.
Signed-off-by: ParkSeongGeun <phd0801@naver.com>
commit aa77928
Author: Ronit Sabhaya <ronitsabhaya75@gmail.com>
Date: Mon Jan 12 12:04:46 2026 -0600
Fix: Support x86_64 architecture alias to prevent silent pull failure… (apple#1036)
- Adds architecture name normalization to accept
`x86_64` and `x86-64` as aliases for `amd64`.
commit dc4682b
Author: Amir Alperin <me@remotecpp.dev>
Date: Fri Jan 9 21:10:53 2026 +0200
fix: extract hostname from FQDN (apple#1011) (apple#1017)
- Set the container hostname to the first DNS
label derived from the container id, strip everything
after the first dot.
- Fixesapple#1011.
commit 4af1cc0
Author: Ronit Sabhaya <ronitsabhaya75@gmail.com>
Date: Thu Jan 8 21:27:43 2026 -0600
fix: improve error message when binding to privileged ports (fixesapple#978) (apple#1031)
- The container fails to start with a generic "permission denied"
error when attempting to publish privileged ports (ports below
1024) without root privileges. This provides a confusing user
experience as the error doesn't explain why permission was
denied.
commit 21facf0
Author: J Logan <john_logan@apple.com>
Date: Thu Jan 8 17:02:22 2026 -0800
Add instructions for using locally built init filesystem. (apple#1032)
- Closesapple#1030.
commit b671690
Author: Danny Canter <danny_canter@apple.com>
Date: Wed Jan 7 21:01:10 2026 -0800
ProgressBar: Various fixes (apple#1025)
There's a couple things I don't think are intuitive about this.
1. Because of the internal task, render() can still be called even after
finish() completes. Ideally async defers are supported and we could just
await the final render completing after cancelling the task and setting
.finished, but alas. To fix this we can just lock across the methods for
now.
2. We always clear the screen in the destructor, even if we don't use
the
progress bar. I don't think we should honestly do anything in the
destructor.
Feels a programmer error not to defer { bar.finish() } or call it
somewhere.
3. Our spaces based line clearing. Use the ansi escape sequence for
clearing line;
I think our calculations were slightly off and it would leave trailing
output ( "s]" )
in some cases.
4. Shrinking the window until the output is smaller than the terminal
window (and vice
versa) is wonky on various term emulators. Truthfully, this is just a
hard problem,
but we can truncate our output and still provide some useful info.
This fixes some single line output (cat /etc/hostname etc.) getting
cleared in our atexit handler, as well as the need for the usleep.
commit 98410fd
Author: J Logan <john_logan@apple.com>
Date: Wed Jan 7 18:23:31 2026 -0800
Adds IPv6 port forwarding. (apple#1029)
- Closesapple#1006.
commit 9d06475
Author: Saehej Kang <saehej.kang@gmail.com>
Date: Wed Jan 7 16:53:33 2026 -0800
[container]: add startedDate field (apple#1018)
- Closesapple#302.
- Closesapple#336 (obsoletes this PR).
commit db8932a
Author: J Logan <john_logan@apple.com>
Date: Wed Jan 7 15:35:35 2026 -0800
Resolve IPv6 address queries for container names. (apple#1016)
- Closesapple#1005.
- Adapt everything to use MACAddress type from containerization 0.20.0.
- Allocate MAC addresses for every container so that we have
deterministic IPv6 link local addresses.
- Add AAAA handling to ContainerDNSHandler.
- NOTE: Only works on Tahoe. On Sequoia, we don't have a good way to set
or determine the IPv6 network prefix when networks are created, so we
can't infer the IPv6 link local addresses for AAAA responses and we
instead return `NODATA`.
commit 5d6c750
Author: Danny Canter <danny_canter@apple.com>
Date: Wed Jan 7 14:48:58 2026 -0800
CLI: Add read-only flag to run/create (apple#999)
Closesapple#990
Sets the rootfs for a container to read-only.
commit aac2457
Author: Danny Canter <danny_canter@apple.com>
Date: Wed Jan 7 13:46:26 2026 -0800
Tests: Fix relative path mount tests (apple#1028)
The tests are run in parallel on CI, and were split into three tests.
They change the cwd, so it's kind of a gamble whether some of them pass.
This just moves all the logic into one test mostly.
commit 9cd5397
Author: J Logan <john_logan@apple.com>
Date: Wed Jan 7 10:35:19 2026 -0800
Update to containerization 0.20.0. (apple#1027)
- Use MACAddress for Attachment and CZ interfaces.
- Move data validation closer to API surface.
commit 356c8d2
Author: J Logan <john_logan@apple.com>
Date: Tue Jan 6 08:27:14 2026 -0800
Reorganize client libraries. (apple#1020)
- Closesapple#461.
- Extract core types into ContainerResources target.
- Extract ContainerNetworkServiceClient from ContainerNetworkService.
- Relocate sandbox client from ContainerClient to
ContainerSandboxServiceClient.
- Relocate ContainerClient to ContainerAPIServiceClient.
- Common structure from services and clients under Source/Services.
Updated project hierarchy:
```
Sources/CAuditToken - audit token access wrapper
Sources/CLI - CLI executable
Sources/ContainerBuild - builder
Sources/ContainerCommands - CLI command implementations
Sources/ContainerLog - logging helpers
Sources/ContainerPersistence - persistent data and system property helpers
Sources/ContainerPlugin - plugin system
Sources/ContainerResource - resource (container, image, volume, network) types
Sources/ContainerVersion - version helpers
Sources/ContainerXPC - XPC helpers
Sources/CVersion - injected project version
Sources/DNSServer - container DNS resolver
Sources/Helpers - service executables
Sources/Services/*/Client - service clients
Sources/Services/*/Server - service implementations
Sources/SocketForwarder - port forwarding
Sources/TerminalProgress - progress bar
```
## Type of Change
- [ ] Bug fix
- [ ] New feature
- [x] Breaking change
- [ ] Documentation update
## Motivation and Context
The ContainerClient library was a bit of a grab bag. This refactor
applies a more sensible project and library structure for resource data
types, services, and clients.
## Testing
- [x] Tested locally
- [x] Added/updated tests
- [ ] Added/updated docs
commit 8c439cd
Author: Danny Canter <danny_canter@apple.com>
Date: Mon Jan 5 13:50:57 2026 -0800
makefile: Add cli target (apple#1022)
Often times I'll be making a change that only touches the cli and I
don't feel like sitting through the potential song and dance of the
other components building/installing.
commit d6f052d
Author: Kathryn Baldauf <k_baldauf@apple.com>
Date: Mon Jan 5 13:09:34 2026 -0800
Update license header on all files to include the current year (apple#1024)
## Motivation and Context
Now that we're in 2026, we need to update the license headers on all the
files. Unfortunately, Hawkeye doesn't have an attribute for the current
year to help us avoid this in the future. Instead, I had to work around
this by doing the following:
1. Update licenserc.toml with:
```
[properties]
... (other properties)
currentYear = "2026"
```
2. Update scripts/license-header.txt with
```
Copyright ©{{ " " }}{%- set created = attrs.git_file_created_year or
attrs.disk_file_created_year -%}{%- set modified = props["currentYear"]
-%}{%- if created != modified -%} {{created}}-{{modified}}{%- else
-%}{{created}}{%- endif -%}{{ " " }}{{ props["copyrightOwner"] }}.
```
Then I removed these two changes before committing. After this PR is
merged, all files will have recently had git updates, so the existing
code for setting the modified year should work as intended.
Signed-off-by: Kathryn Baldauf <k_baldauf@apple.com>
commit 20dc0bc
Author: Danny Canter <danny_canter@apple.com>
Date: Sun Jan 4 11:11:09 2026 -0800
Parser: Support relative paths for --volume (apple#1013)
commit 028e7e1
Author: Danny Canter <danny_canter@apple.com>
Date: Sun Jan 4 10:52:46 2026 -0800
Deps: Bump Containerization to 0.19.0 (apple#1015)
Has read-only rootfs support.
commit 020949e
Author: Danny Canter <danny_canter@apple.com>
Date: Sun Jan 4 10:51:20 2026 -0800
CLI: Small fixups for implicit envvars (apple#1014)
We should only inherit from the host if there's no =. Additionally
document the flag a little more to show that we can inherit from the
host.
commit df368b7
Author: Amir Alperin <alperin.amir@gmail.com>
Date: Sun Jan 4 20:49:22 2026 +0200
Fix port validation to allow same port for different protocols (apple#992) (apple#1000)
- Fixes: apple#992
- Port validation previously rejected valid configurations
when the same port number was used for different
protocols (TCP and UDP). For example:
`-p 1024:1024/udp -p 1024:1024/tcp`
Although this is a valid and common use case, the
validation logic treated it as a conflict.
To fix this, I updated the validation key to include the protocol name.
The validation now checks for overlapping port numbers only within the
same protocol, rather than across all protocols.
This change enables binding the same port number for both TCP and UDP,
aligning the validation behavior with real-world networking
requirements.
## Testing
- [x] Tested locally
- [x] Added/updated tests
- [ ] Added/updated docs
commit cf64614
Author: J Logan <john_logan@apple.com>
Date: Fri Jan 2 14:10:48 2026 -0800
Update OSS header in Package.swift. (apple#1010)
commit 375ce16
Author: J Logan <john_logan@apple.com>
Date: Fri Jan 2 12:09:12 2026 -0800
Fix OSS header dates that break CI checks. (apple#1009)
commit 580d853
Author: c <claudeaceae@icloud.com>
Date: Fri Jan 2 00:19:57 2026 -0500
Use full path for uninstall script in upgrade instructions (apple#983)
- Makes the upgrade section consistent with the
uninstall section by using the full path to the
uninstall script.
commit 4cadc40
Author: c <claudeaceae@icloud.com>
Date: Thu Jan 1 22:53:56 2026 -0500
Clarify uninstall script location in README (apple#982)
- Clarifies where the `uninstall-container.sh` script is located after
installation
- Updates example commands to use the full path
commit 4e78e30
Author: c <claudeaceae@icloud.com>
Date: Thu Jan 1 20:57:47 2026 -0500
Fix grammar in tutorial.md (apple#985)
## Summary
- Fixes a grammar error in the tutorial's publish section
## Details
Line 287 of `docs/tutorial.md` had "you need push images" which should
be "you need to push images".
This is a simple grammar fix to improve readability.
## Test plan
- [x] Verified the sentence now reads correctly
commit 22dfd6e
Author: Danny Canter <danny_canter@apple.com>
Date: Thu Jan 1 17:57:00 2026 -0800
CLI: Fix stop not signalling waiters (apple#972)
commit 4958cf2
Author: c <claudeaceae@icloud.com>
Date: Thu Jan 1 20:51:10 2026 -0500
Fix bash completion source path in documentation (apple#981)
- Corrects the source path for bash completion script
when not using bash-completion package.
commit 25ac79a
Author: c <claudeaceae@icloud.com>
Date: Thu Jan 1 20:50:19 2026 -0500
Fix MAC address option typo in how-to documentation (apple#980)
- Corrects the MAC address example command in the
how-to guide to use the correct `--network` flag syntax
instead of the incorrect `--mac-address` flag.
commit edadf15
Author: Raj <realrajaryan@gmail.com>
Date: Thu Jan 1 15:10:39 2026 +0530
Fix container auto-delete on rapid stop/start (apple#841)
Fixesapple#833.
Currently, when stopping and immediately restarting a container, it would fail with the error:
`“container expected to be in created state, got: shuttingDown”` and then be automatically deleted.
The `SandboxService` process waits five seconds before exiting after shutdown. During this interval, a rapid restart could reconnect to the still-terminating process in the `shuttingDown` state, triggering a state validation error.
This fix forcefully terminates the `SandboxService` process with `SIGKILL` upon container exit, instead of waiting five seconds. The bootstrap now defensively checks for and cleans up any stale services before registering new ones, preventing reconnections to processes in the `shuttingDown` state.
commit 5064b0f
Author: J Logan <john_logan@apple.com>
Date: Mon Dec 22 10:16:14 2025 -0800
Adds network IPv6 configuration. (apple#975)
- Part of work for apple#460.
- Enable set/get of IPv6 network prefix in ReservedVmnetNetwork.
- Show IPv6 prefix in `network list` full output.
- Option for setting IPv6 prefix when creating a network.
- System property for default IPv6 prefix.
## Type of Change
- [ ] Bug fix
- [x] New feature
- [ ] Breaking change
- [x] Documentation update
## Motivation and Context
See apple#460.
## Testing
- [x] Tested locally
- [ ] Added/updated tests
- [x] Added/updated docs
commit 9c239aa
Author: Volodymyr Bortniak <25820601+Bortnyak@users.noreply.github.com>
Date: Sat Dec 20 00:36:02 2025 +0100
Add support for reading env from named pipes (apple#974)
This is a fix for
[issue#956](apple#956)
`FileManager.default.contents(atPath:)` returns `nil` for named pipes
(FIFOs)
and process substitutions like `/dev/fd/XX` because:
1. It expects regular files with a known size
2. Named pipes are stream-based and block until data arrives
## Solution
Use `FileHandle(forReadingFrom:)` instead, which:
- Properly handles blocking I/O
- Works with named pipes, process substitutions, and regular files
(mentioned in the
[doc](https://developer.apple.com/documentation/foundation/filehandle))
Co-authored-by: Bortniak Volodymyr <Bortnyak@users.noreply.github.com>
commit 3c3a83c
Author: Danny Canter <danny_canter@apple.com>
Date: Thu Dec 18 16:28:44 2025 -0800
Turn on oops=panic kernel cmdline (apple#971)
commit b1b9980
Author: Michael Gathara <mikegtrm@gmail.com>
Date: Wed Dec 17 20:58:50 2025 -0600
Fix: Kubes Cluster in Container Crashing Container (IS#923) (apple#930)
- Fixes issue apple#923
- I fixed a race condition in `ConnectHandler.swift` where
an asynchronous network connection could complete
after the handler had already been removed from the
pipeline.
- This prevents the EXC_BREAKPOINT crash in
container-runtime-linux that occurred when kinc
(Kubernetes in Container) created rapid connections.
- The actual fix was inadvertently applied in apple#957, so this
PR contains only the test code.
commit 9f4efe0
Author: Saehej Kang <saehej.kang@gmail.com>
Date: Wed Dec 17 00:30:33 2025 -0800
[networks]: add prune command (apple#914)
- Closesapple#893
commit 4f88725
Author: J Logan <john_logan@apple.com>
Date: Tue Dec 16 16:34:13 2025 -0800
Use new IP/CIDR types from Containerization. (apple#957)
- Part of work for apple#460.
- With CZ release 0.17.0, the IP and CIDR address
types changed from String to IPv4Address and
CIDRv4, respectively. This PR applies the corresponding
adaptations to container.
commit 8e16bb2
Author: Salman Chishti <salmanmkc@GitHub.com>
Date: Tue Dec 16 20:14:45 2025 +0000
Upgrade GitHub Actions to latest versions (apple#959)
- Upgrade GitHub Actions to their latest versions for
improved features, bug fixes, and security updates.
Signed-off-by: Salman Muin Kayser Chishti <13schishti@gmail.com>
commit 0c7dca4
Author: Salman Chishti <salmanmkc@GitHub.com>
Date: Tue Dec 16 19:23:31 2025 +0000
Add Dependabot for GitHub Actions updates (apple#960)
## Summary
Add Dependabot configuration to automatically keep GitHub Actions up to
date.
## Changes
Adds `.github/dependabot.yml` configured to:
- Check for GitHub Actions updates weekly
- Group all action updates together for easier review
- Use `ci` prefix for commit messages
## Why
As discussed in apple#958, this helps:
- Keep actions up to date with security patches automatically
- Handle Node runtime deprecations proactively (e.g., Node 20 → Node 24)
- Reduce manual maintenance burden
## Reference
Based on the pattern used in
[swift-nio](https://github.com/apple/swift-nio/blob/main/.github/dependabot.yml).
commit 637c8f1
Author: Salman Chishti <salmanmkc@GitHub.com>
Date: Tue Dec 16 18:15:42 2025 +0000
Upgrade GitHub Actions for Node 24 compatibility (apple#958)
## Summary
Upgrade GitHub Actions to their latest versions to ensure compatibility
with Node 24, as Node 20 will reach end-of-life in April 2026.
## Changes
| Action | Old Version(s) | New Version | SHA |
|--------|---------------|-------------|-----|
| `actions/checkout` | v4 | v6 | `8e8c483` |
| `actions/download-artifact` | v4 | v7 | `37930b1` |
| `actions/upload-artifact` | v4 | v6 | `b7c566a` |
| `actions/labeler` | v5 | v6 | `634933e` |
| `actions/configure-pages` | v5 | v5 | `983d773` |
| `actions/upload-pages-artifact` | v3 | v3 | `56afc60` |
| `softprops/action-gh-release` | v2 | v2 | `a06a81a` |
## Context
Per [GitHub's
announcement](https://github.blog/changelog/2025-09-19-deprecation-of-node-20-on-github-actions-runners/),
Node 20 is being deprecated and runners will begin using Node 24 by
default starting March 4th, 2026.
### Why this matters
- **Node 20 EOL**: April 2026
- **Node 24 default**: March 4th, 2026
- **Action**: Update to latest action versions that support Node 24
### Security
All actions are now **pinned to commit SHAs** instead of mutable version
tags. This provides:
- Protection against tag hijacking attacks
- Immutable, reproducible builds
- Version comments for readability
### Automated Updates
A follow-up PR (apple#960) adds Dependabot configuration to automatically
keep these actions updated with new SHA-pinned versions.
### Testing
These changes only affect CI/CD workflow configurations and should not
impact application functionality. The workflows should be tested by
running them on a branch before merging.
Signed-off-by: Salman Muin Kayser Chishti <13schishti@gmail.com>
commit c22f128
Author: karen heckel <karen.heckel@utexas.edu>
Date: Mon Dec 15 21:16:55 2025 -0800
Feat: customize console output with env variable (apple#952)
Fixesapple#915
Added a new feature to support the passing of buildkit colors for
customizing console output.
commit 9b7cfd8
Author: Saehej Kang <saehej.kang@gmail.com>
Date: Mon Dec 15 17:52:00 2025 -0800
[images]: refactor prune command (apple#941)
- Updates to `image prune` for consistency with how
other `prune` commands are done. Added missing
test cases as well for the command
- Relates to the discussion from apple#914
commit 7d30720
Author: Danny Canter <danny_canter@apple.com>
Date: Thu Dec 11 05:36:15 2025 -0800
CLI: Fix -it not being able to pipe stdout (apple#951)
Fixesapple#949
Typically if one fd is a tty, it's common for all 3 of stdio to be the
same, but that is not always the case. In our case we were using our
Terminal type from Containerization to comb through err/out/in and give
us a type backed by one of the 3 if -t was supplied. It happens that
stderr is the first we check, so our Terminal() is backed by fd 2. This
change modifies things so that we always initialize our Terminal if
asked for with fd 0, and out/err are backed by their corresponding
correct fd number.
## Type of Change
- [x] Bug fix
- [ ] New feature
- [ ] Breaking change
- [ ] Documentation update
## Testing
- [x] Tested locally
- [ ] Added/updated tests
- [ ] Added/updated docs
commit a2901e0
Author: wangxiaolei <fatelei@gmail.com>
Date: Wed Dec 10 10:04:40 2025 +0800
feat: implement version sub command (apple#911)
- closesapple#383
- implement version sub command, give more info
---------
Co-authored-by: fatelei <fatelei@fateleis-MacBook-Pro.local>
commit 0cde1ef
Author: Danny Canter <danny_canter@apple.com>
Date: Tue Dec 9 13:24:45 2025 -0800
Deps: Bump Containerization to 0.16.2 (apple#947)
Closesapple#928
Has a cgroup fix when stopping certain containers
commit 3896055
Author: Dmitry Kovba <dkovba@apple.com>
Date: Tue Dec 9 12:32:28 2025 -0800
Lowercase error messages (apple#945)
## Type of Change
- [x] Bug fix
- [ ] New feature
- [ ] Breaking change
- [ ] Documentation update
## Motivation and Context
For consistency, all error messages are lowercased.
## Testing
- [ ] Tested locally
- [ ] Added/updated tests
- [ ] Added/updated docs
---------
Co-authored-by: J Logan <sgtbakerrahulnet@yahoo.com>
commit 0733a81
Author: Saehej Kang <saehej.kang@gmail.com>
Date: Tue Dec 9 10:54:37 2025 -0800
[volumes]: refactor prune command (apple#940)
- Refactor the `volume prune` command to follow a client-side approach.
The `volumeDiskUsage` is calculated in the service file, so it made
sense to leave that there.
- Relates to the discussion from apple#914
commit 42528e6
Author: Kathryn Baldauf <k_baldauf@apple.com>
Date: Tue Dec 9 10:42:27 2025 -0800
Update CONTRIBUTORS to MAINTAINERS and point at containerization (apple#942)
## Type of Change
- [x] Documentation update
## Motivation and Context
See apple/containerization#435 for more
information on this change.
commit a64bd77
Author: J Logan <john_logan@apple.com>
Date: Tue Dec 9 14:35:34 2025 -0300
Fix broken image integration tests. (apple#944)
- Fixesapple#943.
- Use images other than alpine:3.20 for image concurrency test so as not
to interfere with tests using that image.
- Rename test files to match suite names.
commit ab92f39
Author: TTtie <me@tttie.cz>
Date: Mon Dec 8 18:17:10 2025 +0100
fix(TerminalProgress): make the progress bar respect locale-specific decimal separator (apple#936)
- The `ProgressBar#adjustFormattedSize` function currently expects a
decimal dot when adding the additional ".0" to the size. This, however,
breaks when a region with a non-dot decimal separator is used.
commit 420be74
Author: J Logan <john_logan@apple.com>
Date: Mon Dec 8 03:00:02 2025 -0300
Data integrity: bump to cz 0.16.1, adjust sync mode. (apple#939)
- 0.16.1 changes an ext4 superblock setting that might have been causing
problems.
- apple#877 fixed an issue where the cache and sync settings for block
filesystems weren't being passed down to the VZ virtual machine
configuration. The default sync value getting passed down is `full`,
which reduces I/O performance. Relax this to use `fsync` for now.
## Type of Change
- [*] Bug fix
- [ ] New feature
- [ ] Breaking change
- [ ] Documentation update
## Motivation and Context
May address problems reported in apple#877.
## Testing
- [x] Tested locally
- [ ] Added/updated tests
- [ ] Added/updated docs
commit f7bcb68
Author: Santosh Bhavani <santosh.bhavani@live.com>
Date: Sun Dec 7 10:56:50 2025 -0800
Add --max-concurrent-downloads flag for parallel layer downloads (apple#716)
Adds `--max-concurrent-downloads` flag to `container image pull` for
configurable concurrent layer downloads.
Fixesapple#715
Depends on apple/containerization#311
**Usage**:
```bash
container image pull nginx:latest --max-concurrent-downloads 6
```
**Changes**:
- Add CLI flag (default: 3)
- Thread parameter through XPC stack
- Update to use forked containerization with configurable concurrency
**Performance**: ~1.2-1.3x faster pulls for multi-layer images with
higher concurrency
**Tests**: Included standalone tests verify concurrency behavior and
parameter flow
---------
Co-authored-by: Claude <noreply@anthropic.com>
Mcrich23 added a commit to Mcrich23/container that referenced this pull request Jan 22, 2026
commit 69445b9
Author: jwhur <57657645+JaewonHur@users.noreply.github.com>
Date: Mon Jan 19 13:09:34 2026 -0800
Throw error when starting a container with invalid virtiofs source (apple#1051)
Run = Create + Start
1) Mount source points to a valid directory
- Run and Create + Start both correctly create the container with mount.
2) Mount source points to a file
- Run fails bootstrapping the container, thus container not created.
- Create creates the container, but Start fails bootstrapping, removing
the container. (Thus, both are the same.)
3) Mount source deleted or replaced to file after container created
- Start throw errors but do not delete the container.
commit 08f48d9
Author: Danny Canter <danny_canter@apple.com>
Date: Fri Jan 16 21:48:58 2026 -0800
ContainerSvc: Handle unexpected sandbox svc exits (apple#1065)
Closesapple#1050
If the sandbox svc exits out of band of the usual stop (or regular exit)
case the container svc's state is not properly updated for the
container. This was due to the cleanup steps involving trying to send
the shutdown rpc which cannot succeed as the sandbox svc does not exist
to service it.
To handle this, let's treat shutdown not returning successfully as
non-fatal (as this is mostly best effort), log an error and continue the
state cleanup.
commit b928e3f
Author: Amir Alperin <me@remotecpp.dev>
Date: Sat Jan 17 07:43:48 2026 +0200
fix: performance warning should not output ANSI codes if stderr redirected (apple#1059)
commit 744e7f7
Author: J Logan <john_logan@apple.com>
Date: Fri Jan 16 16:26:13 2026 -0800
Update for containerization 0.21.0. (apple#1056)
- Update image load and build to handle rejected paths during tar
extraction. For the image load command there is now a `--force` function
that fails extractions with rejected paths when false, and just warns
about the rejected paths when true.
- Update `container stats` for statistics API properties now all being
optional.
## Type of Change
- [x] Bug fix
- [ ] New feature
- [ ] Breaking change
- [x] Documentation update
## Motivation and Context
See above
## Testing
- [x] Tested locally
- [x] Added/updated tests
- [x] Added/updated docs
commit b1577d8
Author: J Logan <john_logan@apple.com>
Date: Fri Jan 16 15:50:47 2026 -0800
Adds opt-in pre-commit hook for format and header checks. (apple#1062)
- Closesapple#639.
- Adds swift format configuration that removes lint checks so we can use
`swift lint` to perform format-only tests.
- Adds `check` target that invokes format and header checks.
- Adds pre-commit script that runs `make check`.
- Adds `pre-commit` target that installs the check script as a
pre-commit hook.
## Type of Change
- [ ] Bug fix
- [x] New feature
- [ ] Breaking change
- [x] Documentation update
## Motivation and Context
Avoids wasting time and commit rewrites.
## Testing
- [x] Tested locally
- [ ] Added/updated tests
- [x] Added/updated docs
commit 3cf2c6a
Author: J Logan <john_logan@apple.com>
Date: Fri Jan 16 13:41:32 2026 -0800
Fix unstable integration tests. (apple#1060)
- TestCLIRunCommand now run so many tests concurrently that the API
server gets swamped and tests randomly time out.
- The parallelism options on `swift test` only work for XCTest, not
swift-testing.
- Work around this while retaining some parallelism (good for stress
testing) by breaking the tests into two suites.
commit 8897fcc
Author: Manu Schiller <56154253+manuschillerdev@users.noreply.github.com>
Date: Wed Jan 14 04:39:08 2026 +0100
fix: use pax instead of tar for pkg payload extraction (apple#1038)
- It is common to have `gnu-tar` alongside other GNU tools
installed and aliased for compatibility reasons. However, this
breaks the current make build.
- Use BSD-only binaries (no GNU equivalents that are
commonly aliased), making the Makefile more portable.
commit dbec1db
Author: Ronit Sabhaya <ronitsabhaya75@gmail.com>
Date: Mon Jan 12 20:34:25 2026 -0600
Add support for aarch64 architecture alias (apple#1040)
- Adds `aarch64` as an alias for `arm64` in the `Arch` enum. This
addresses the maintainer's request to support this common architecture
name, ensuring consistency with `x86_64` normalization and preventing
failures for users expecting `aarch64` support.
commit 837aa5e
Author: jwhur <57657645+JaewonHur@users.noreply.github.com>
Date: Mon Jan 12 14:36:10 2026 -0800
Fix the FS error when using Virtualization (apple#1041)
- Fixesapple#614.
- Use VZ cached mode instead of auto.
Signed-off-by: jwhur <jaewon_hur@apple.com>
commit e465b10
Author: 박성근 <117553364+ParkSeongGeun@users.noreply.github.com>
Date: Tue Jan 13 03:30:51 2026 +0900
Fix relative path resolution in entrypoint (apple#987)
- Fixesapple#962.
- Adds test to exercise apple/containerization#473.
- Updates containerization to 0.20.1.
Signed-off-by: ParkSeongGeun <phd0801@naver.com>
commit aa77928
Author: Ronit Sabhaya <ronitsabhaya75@gmail.com>
Date: Mon Jan 12 12:04:46 2026 -0600
Fix: Support x86_64 architecture alias to prevent silent pull failure… (apple#1036)
- Adds architecture name normalization to accept
`x86_64` and `x86-64` as aliases for `amd64`.
commit dc4682b
Author: Amir Alperin <me@remotecpp.dev>
Date: Fri Jan 9 21:10:53 2026 +0200
fix: extract hostname from FQDN (apple#1011) (apple#1017)
- Set the container hostname to the first DNS
label derived from the container id, strip everything
after the first dot.
- Fixesapple#1011.
commit 4af1cc0
Author: Ronit Sabhaya <ronitsabhaya75@gmail.com>
Date: Thu Jan 8 21:27:43 2026 -0600
fix: improve error message when binding to privileged ports (fixesapple#978) (apple#1031)
- The container fails to start with a generic "permission denied"
error when attempting to publish privileged ports (ports below
1024) without root privileges. This provides a confusing user
experience as the error doesn't explain why permission was
denied.
commit 21facf0
Author: J Logan <john_logan@apple.com>
Date: Thu Jan 8 17:02:22 2026 -0800
Add instructions for using locally built init filesystem. (apple#1032)
- Closesapple#1030.
commit b671690
Author: Danny Canter <danny_canter@apple.com>
Date: Wed Jan 7 21:01:10 2026 -0800
ProgressBar: Various fixes (apple#1025)
There's a couple things I don't think are intuitive about this.
1. Because of the internal task, render() can still be called even after
finish() completes. Ideally async defers are supported and we could just
await the final render completing after cancelling the task and setting
.finished, but alas. To fix this we can just lock across the methods for
now.
2. We always clear the screen in the destructor, even if we don't use
the
progress bar. I don't think we should honestly do anything in the
destructor.
Feels a programmer error not to defer { bar.finish() } or call it
somewhere.
3. Our spaces based line clearing. Use the ansi escape sequence for
clearing line;
I think our calculations were slightly off and it would leave trailing
output ( "s]" )
in some cases.
4. Shrinking the window until the output is smaller than the terminal
window (and vice
versa) is wonky on various term emulators. Truthfully, this is just a
hard problem,
but we can truncate our output and still provide some useful info.
This fixes some single line output (cat /etc/hostname etc.) getting
cleared in our atexit handler, as well as the need for the usleep.
commit 98410fd
Author: J Logan <john_logan@apple.com>
Date: Wed Jan 7 18:23:31 2026 -0800
Adds IPv6 port forwarding. (apple#1029)
- Closesapple#1006.
commit 9d06475
Author: Saehej Kang <saehej.kang@gmail.com>
Date: Wed Jan 7 16:53:33 2026 -0800
[container]: add startedDate field (apple#1018)
- Closesapple#302.
- Closesapple#336 (obsoletes this PR).
commit db8932a
Author: J Logan <john_logan@apple.com>
Date: Wed Jan 7 15:35:35 2026 -0800
Resolve IPv6 address queries for container names. (apple#1016)
- Closesapple#1005.
- Adapt everything to use MACAddress type from containerization 0.20.0.
- Allocate MAC addresses for every container so that we have
deterministic IPv6 link local addresses.
- Add AAAA handling to ContainerDNSHandler.
- NOTE: Only works on Tahoe. On Sequoia, we don't have a good way to set
or determine the IPv6 network prefix when networks are created, so we
can't infer the IPv6 link local addresses for AAAA responses and we
instead return `NODATA`.
commit 5d6c750
Author: Danny Canter <danny_canter@apple.com>
Date: Wed Jan 7 14:48:58 2026 -0800
CLI: Add read-only flag to run/create (apple#999)
Closesapple#990
Sets the rootfs for a container to read-only.
commit aac2457
Author: Danny Canter <danny_canter@apple.com>
Date: Wed Jan 7 13:46:26 2026 -0800
Tests: Fix relative path mount tests (apple#1028)
The tests are run in parallel on CI, and were split into three tests.
They change the cwd, so it's kind of a gamble whether some of them pass.
This just moves all the logic into one test mostly.
commit 9cd5397
Author: J Logan <john_logan@apple.com>
Date: Wed Jan 7 10:35:19 2026 -0800
Update to containerization 0.20.0. (apple#1027)
- Use MACAddress for Attachment and CZ interfaces.
- Move data validation closer to API surface.
commit 356c8d2
Author: J Logan <john_logan@apple.com>
Date: Tue Jan 6 08:27:14 2026 -0800
Reorganize client libraries. (apple#1020)
- Closesapple#461.
- Extract core types into ContainerResources target.
- Extract ContainerNetworkServiceClient from ContainerNetworkService.
- Relocate sandbox client from ContainerClient to
ContainerSandboxServiceClient.
- Relocate ContainerClient to ContainerAPIServiceClient.
- Common structure from services and clients under Source/Services.
Updated project hierarchy:
```
Sources/CAuditToken - audit token access wrapper
Sources/CLI - CLI executable
Sources/ContainerBuild - builder
Sources/ContainerCommands - CLI command implementations
Sources/ContainerLog - logging helpers
Sources/ContainerPersistence - persistent data and system property helpers
Sources/ContainerPlugin - plugin system
Sources/ContainerResource - resource (container, image, volume, network) types
Sources/ContainerVersion - version helpers
Sources/ContainerXPC - XPC helpers
Sources/CVersion - injected project version
Sources/DNSServer - container DNS resolver
Sources/Helpers - service executables
Sources/Services/*/Client - service clients
Sources/Services/*/Server - service implementations
Sources/SocketForwarder - port forwarding
Sources/TerminalProgress - progress bar
```
## Type of Change
- [ ] Bug fix
- [ ] New feature
- [x] Breaking change
- [ ] Documentation update
## Motivation and Context
The ContainerClient library was a bit of a grab bag. This refactor
applies a more sensible project and library structure for resource data
types, services, and clients.
## Testing
- [x] Tested locally
- [x] Added/updated tests
- [ ] Added/updated docs
commit 8c439cd
Author: Danny Canter <danny_canter@apple.com>
Date: Mon Jan 5 13:50:57 2026 -0800
makefile: Add cli target (apple#1022)
Often times I'll be making a change that only touches the cli and I
don't feel like sitting through the potential song and dance of the
other components building/installing.
commit d6f052d
Author: Kathryn Baldauf <k_baldauf@apple.com>
Date: Mon Jan 5 13:09:34 2026 -0800
Update license header on all files to include the current year (apple#1024)
## Motivation and Context
Now that we're in 2026, we need to update the license headers on all the
files. Unfortunately, Hawkeye doesn't have an attribute for the current
year to help us avoid this in the future. Instead, I had to work around
this by doing the following:
1. Update licenserc.toml with:
```
[properties]
... (other properties)
currentYear = "2026"
```
2. Update scripts/license-header.txt with
```
Copyright ©{{ " " }}{%- set created = attrs.git_file_created_year or
attrs.disk_file_created_year -%}{%- set modified = props["currentYear"]
-%}{%- if created != modified -%} {{created}}-{{modified}}{%- else
-%}{{created}}{%- endif -%}{{ " " }}{{ props["copyrightOwner"] }}.
```
Then I removed these two changes before committing. After this PR is
merged, all files will have recently had git updates, so the existing
code for setting the modified year should work as intended.
Signed-off-by: Kathryn Baldauf <k_baldauf@apple.com>
commit 20dc0bc
Author: Danny Canter <danny_canter@apple.com>
Date: Sun Jan 4 11:11:09 2026 -0800
Parser: Support relative paths for --volume (apple#1013)
commit 028e7e1
Author: Danny Canter <danny_canter@apple.com>
Date: Sun Jan 4 10:52:46 2026 -0800
Deps: Bump Containerization to 0.19.0 (apple#1015)
Has read-only rootfs support.
commit 020949e
Author: Danny Canter <danny_canter@apple.com>
Date: Sun Jan 4 10:51:20 2026 -0800
CLI: Small fixups for implicit envvars (apple#1014)
We should only inherit from the host if there's no =. Additionally
document the flag a little more to show that we can inherit from the
host.
commit df368b7
Author: Amir Alperin <alperin.amir@gmail.com>
Date: Sun Jan 4 20:49:22 2026 +0200
Fix port validation to allow same port for different protocols (apple#992) (apple#1000)
- Fixes: apple#992
- Port validation previously rejected valid configurations
when the same port number was used for different
protocols (TCP and UDP). For example:
`-p 1024:1024/udp -p 1024:1024/tcp`
Although this is a valid and common use case, the
validation logic treated it as a conflict.
To fix this, I updated the validation key to include the protocol name.
The validation now checks for overlapping port numbers only within the
same protocol, rather than across all protocols.
This change enables binding the same port number for both TCP and UDP,
aligning the validation behavior with real-world networking
requirements.
## Testing
- [x] Tested locally
- [x] Added/updated tests
- [ ] Added/updated docs
commit cf64614
Author: J Logan <john_logan@apple.com>
Date: Fri Jan 2 14:10:48 2026 -0800
Update OSS header in Package.swift. (apple#1010)
commit 375ce16
Author: J Logan <john_logan@apple.com>
Date: Fri Jan 2 12:09:12 2026 -0800
Fix OSS header dates that break CI checks. (apple#1009)
commit 580d853
Author: c <claudeaceae@icloud.com>
Date: Fri Jan 2 00:19:57 2026 -0500
Use full path for uninstall script in upgrade instructions (apple#983)
- Makes the upgrade section consistent with the
uninstall section by using the full path to the
uninstall script.
commit 4cadc40
Author: c <claudeaceae@icloud.com>
Date: Thu Jan 1 22:53:56 2026 -0500
Clarify uninstall script location in README (apple#982)
- Clarifies where the `uninstall-container.sh` script is located after
installation
- Updates example commands to use the full path
commit 4e78e30
Author: c <claudeaceae@icloud.com>
Date: Thu Jan 1 20:57:47 2026 -0500
Fix grammar in tutorial.md (apple#985)
## Summary
- Fixes a grammar error in the tutorial's publish section
## Details
Line 287 of `docs/tutorial.md` had "you need push images" which should
be "you need to push images".
This is a simple grammar fix to improve readability.
## Test plan
- [x] Verified the sentence now reads correctly
commit 22dfd6e
Author: Danny Canter <danny_canter@apple.com>
Date: Thu Jan 1 17:57:00 2026 -0800
CLI: Fix stop not signalling waiters (apple#972)
commit 4958cf2
Author: c <claudeaceae@icloud.com>
Date: Thu Jan 1 20:51:10 2026 -0500
Fix bash completion source path in documentation (apple#981)
- Corrects the source path for bash completion script
when not using bash-completion package.
commit 25ac79a
Author: c <claudeaceae@icloud.com>
Date: Thu Jan 1 20:50:19 2026 -0500
Fix MAC address option typo in how-to documentation (apple#980)
- Corrects the MAC address example command in the
how-to guide to use the correct `--network` flag syntax
instead of the incorrect `--mac-address` flag.
commit edadf15
Author: Raj <realrajaryan@gmail.com>
Date: Thu Jan 1 15:10:39 2026 +0530
Fix container auto-delete on rapid stop/start (apple#841)
Fixesapple#833.
Currently, when stopping and immediately restarting a container, it would fail with the error:
`“container expected to be in created state, got: shuttingDown”` and then be automatically deleted.
The `SandboxService` process waits five seconds before exiting after shutdown. During this interval, a rapid restart could reconnect to the still-terminating process in the `shuttingDown` state, triggering a state validation error.
This fix forcefully terminates the `SandboxService` process with `SIGKILL` upon container exit, instead of waiting five seconds. The bootstrap now defensively checks for and cleans up any stale services before registering new ones, preventing reconnections to processes in the `shuttingDown` state.
commit 5064b0f
Author: J Logan <john_logan@apple.com>
Date: Mon Dec 22 10:16:14 2025 -0800
Adds network IPv6 configuration. (apple#975)
- Part of work for apple#460.
- Enable set/get of IPv6 network prefix in ReservedVmnetNetwork.
- Show IPv6 prefix in `network list` full output.
- Option for setting IPv6 prefix when creating a network.
- System property for default IPv6 prefix.
## Type of Change
- [ ] Bug fix
- [x] New feature
- [ ] Breaking change
- [x] Documentation update
## Motivation and Context
See apple#460.
## Testing
- [x] Tested locally
- [ ] Added/updated tests
- [x] Added/updated docs
commit 9c239aa
Author: Volodymyr Bortniak <25820601+Bortnyak@users.noreply.github.com>
Date: Sat Dec 20 00:36:02 2025 +0100
Add support for reading env from named pipes (apple#974)
This is a fix for
[issue#956](apple#956)
`FileManager.default.contents(atPath:)` returns `nil` for named pipes
(FIFOs)
and process substitutions like `/dev/fd/XX` because:
1. It expects regular files with a known size
2. Named pipes are stream-based and block until data arrives
## Solution
Use `FileHandle(forReadingFrom:)` instead, which:
- Properly handles blocking I/O
- Works with named pipes, process substitutions, and regular files
(mentioned in the
[doc](https://developer.apple.com/documentation/foundation/filehandle))
Co-authored-by: Bortniak Volodymyr <Bortnyak@users.noreply.github.com>
commit 3c3a83c
Author: Danny Canter <danny_canter@apple.com>
Date: Thu Dec 18 16:28:44 2025 -0800
Turn on oops=panic kernel cmdline (apple#971)
commit b1b9980
Author: Michael Gathara <mikegtrm@gmail.com>
Date: Wed Dec 17 20:58:50 2025 -0600
Fix: Kubes Cluster in Container Crashing Container (IS#923) (apple#930)
- Fixes issue apple#923
- I fixed a race condition in `ConnectHandler.swift` where
an asynchronous network connection could complete
after the handler had already been removed from the
pipeline.
- This prevents the EXC_BREAKPOINT crash in
container-runtime-linux that occurred when kinc
(Kubernetes in Container) created rapid connections.
- The actual fix was inadvertently applied in apple#957, so this
PR contains only the test code.
commit 9f4efe0
Author: Saehej Kang <saehej.kang@gmail.com>
Date: Wed Dec 17 00:30:33 2025 -0800
[networks]: add prune command (apple#914)
- Closesapple#893
commit 4f88725
Author: J Logan <john_logan@apple.com>
Date: Tue Dec 16 16:34:13 2025 -0800
Use new IP/CIDR types from Containerization. (apple#957)
- Part of work for apple#460.
- With CZ release 0.17.0, the IP and CIDR address
types changed from String to IPv4Address and
CIDRv4, respectively. This PR applies the corresponding
adaptations to container.
commit 8e16bb2
Author: Salman Chishti <salmanmkc@GitHub.com>
Date: Tue Dec 16 20:14:45 2025 +0000
Upgrade GitHub Actions to latest versions (apple#959)
- Upgrade GitHub Actions to their latest versions for
improved features, bug fixes, and security updates.
Signed-off-by: Salman Muin Kayser Chishti <13schishti@gmail.com>
commit 0c7dca4
Author: Salman Chishti <salmanmkc@GitHub.com>
Date: Tue Dec 16 19:23:31 2025 +0000
Add Dependabot for GitHub Actions updates (apple#960)
## Summary
Add Dependabot configuration to automatically keep GitHub Actions up to
date.
## Changes
Adds `.github/dependabot.yml` configured to:
- Check for GitHub Actions updates weekly
- Group all action updates together for easier review
- Use `ci` prefix for commit messages
## Why
As discussed in apple#958, this helps:
- Keep actions up to date with security patches automatically
- Handle Node runtime deprecations proactively (e.g., Node 20 → Node 24)
- Reduce manual maintenance burden
## Reference
Based on the pattern used in
[swift-nio](https://github.com/apple/swift-nio/blob/main/.github/dependabot.yml).
commit 637c8f1
Author: Salman Chishti <salmanmkc@GitHub.com>
Date: Tue Dec 16 18:15:42 2025 +0000
Upgrade GitHub Actions for Node 24 compatibility (apple#958)
## Summary
Upgrade GitHub Actions to their latest versions to ensure compatibility
with Node 24, as Node 20 will reach end-of-life in April 2026.
## Changes
| Action | Old Version(s) | New Version | SHA |
|--------|---------------|-------------|-----|
| `actions/checkout` | v4 | v6 | `8e8c483` |
| `actions/download-artifact` | v4 | v7 | `37930b1` |
| `actions/upload-artifact` | v4 | v6 | `b7c566a` |
| `actions/labeler` | v5 | v6 | `634933e` |
| `actions/configure-pages` | v5 | v5 | `983d773` |
| `actions/upload-pages-artifact` | v3 | v3 | `56afc60` |
| `softprops/action-gh-release` | v2 | v2 | `a06a81a` |
## Context
Per [GitHub's
announcement](https://github.blog/changelog/2025-09-19-deprecation-of-node-20-on-github-actions-runners/),
Node 20 is being deprecated and runners will begin using Node 24 by
default starting March 4th, 2026.
### Why this matters
- **Node 20 EOL**: April 2026
- **Node 24 default**: March 4th, 2026
- **Action**: Update to latest action versions that support Node 24
### Security
All actions are now **pinned to commit SHAs** instead of mutable version
tags. This provides:
- Protection against tag hijacking attacks
- Immutable, reproducible builds
- Version comments for readability
### Automated Updates
A follow-up PR (apple#960) adds Dependabot configuration to automatically
keep these actions updated with new SHA-pinned versions.
### Testing
These changes only affect CI/CD workflow configurations and should not
impact application functionality. The workflows should be tested by
running them on a branch before merging.
Signed-off-by: Salman Muin Kayser Chishti <13schishti@gmail.com>
commit c22f128
Author: karen heckel <karen.heckel@utexas.edu>
Date: Mon Dec 15 21:16:55 2025 -0800
Feat: customize console output with env variable (apple#952)
Fixesapple#915
Added a new feature to support the passing of buildkit colors for
customizing console output.
commit 9b7cfd8
Author: Saehej Kang <saehej.kang@gmail.com>
Date: Mon Dec 15 17:52:00 2025 -0800
[images]: refactor prune command (apple#941)
- Updates to `image prune` for consistency with how
other `prune` commands are done. Added missing
test cases as well for the command
- Relates to the discussion from apple#914
commit 7d30720
Author: Danny Canter <danny_canter@apple.com>
Date: Thu Dec 11 05:36:15 2025 -0800
CLI: Fix -it not being able to pipe stdout (apple#951)
Fixesapple#949
Typically if one fd is a tty, it's common for all 3 of stdio to be the
same, but that is not always the case. In our case we were using our
Terminal type from Containerization to comb through err/out/in and give
us a type backed by one of the 3 if -t was supplied. It happens that
stderr is the first we check, so our Terminal() is backed by fd 2. This
change modifies things so that we always initialize our Terminal if
asked for with fd 0, and out/err are backed by their corresponding
correct fd number.
## Type of Change
- [x] Bug fix
- [ ] New feature
- [ ] Breaking change
- [ ] Documentation update
## Testing
- [x] Tested locally
- [ ] Added/updated tests
- [ ] Added/updated docs
commit a2901e0
Author: wangxiaolei <fatelei@gmail.com>
Date: Wed Dec 10 10:04:40 2025 +0800
feat: implement version sub command (apple#911)
- closesapple#383
- implement version sub command, give more info
---------
Co-authored-by: fatelei <fatelei@fateleis-MacBook-Pro.local>
commit 0cde1ef
Author: Danny Canter <danny_canter@apple.com>
Date: Tue Dec 9 13:24:45 2025 -0800
Deps: Bump Containerization to 0.16.2 (apple#947)
Closesapple#928
Has a cgroup fix when stopping certain containers
commit 3896055
Author: Dmitry Kovba <dkovba@apple.com>
Date: Tue Dec 9 12:32:28 2025 -0800
Lowercase error messages (apple#945)
## Type of Change
- [x] Bug fix
- [ ] New feature
- [ ] Breaking change
- [ ] Documentation update
## Motivation and Context
For consistency, all error messages are lowercased.
## Testing
- [ ] Tested locally
- [ ] Added/updated tests
- [ ] Added/updated docs
---------
Co-authored-by: J Logan <sgtbakerrahulnet@yahoo.com>
commit 0733a81
Author: Saehej Kang <saehej.kang@gmail.com>
Date: Tue Dec 9 10:54:37 2025 -0800
[volumes]: refactor prune command (apple#940)
- Refactor the `volume prune` command to follow a client-side approach.
The `volumeDiskUsage` is calculated in the service file, so it made
sense to leave that there.
- Relates to the discussion from apple#914
commit 42528e6
Author: Kathryn Baldauf <k_baldauf@apple.com>
Date: Tue Dec 9 10:42:27 2025 -0800
Update CONTRIBUTORS to MAINTAINERS and point at containerization (apple#942)
## Type of Change
- [x] Documentation update
## Motivation and Context
See apple/containerization#435 for more
information on this change.
commit a64bd77
Author: J Logan <john_logan@apple.com>
Date: Tue Dec 9 14:35:34 2025 -0300
Fix broken image integration tests. (apple#944)
- Fixesapple#943.
- Use images other than alpine:3.20 for image concurrency test so as not
to interfere with tests using that image.
- Rename test files to match suite names.
commit ab92f39
Author: TTtie <me@tttie.cz>
Date: Mon Dec 8 18:17:10 2025 +0100
fix(TerminalProgress): make the progress bar respect locale-specific decimal separator (apple#936)
- The `ProgressBar#adjustFormattedSize` function currently expects a
decimal dot when adding the additional ".0" to the size. This, however,
breaks when a region with a non-dot decimal separator is used.
commit 420be74
Author: J Logan <john_logan@apple.com>
Date: Mon Dec 8 03:00:02 2025 -0300
Data integrity: bump to cz 0.16.1, adjust sync mode. (apple#939)
- 0.16.1 changes an ext4 superblock setting that might have been causing
problems.
- apple#877 fixed an issue where the cache and sync settings for block
filesystems weren't being passed down to the VZ virtual machine
configuration. The default sync value getting passed down is `full`,
which reduces I/O performance. Relax this to use `fsync` for now.
## Type of Change
- [*] Bug fix
- [ ] New feature
- [ ] Breaking change
- [ ] Documentation update
## Motivation and Context
May address problems reported in apple#877.
## Testing
- [x] Tested locally
- [ ] Added/updated tests
- [ ] Added/updated docs
commit f7bcb68
Author: Santosh Bhavani <santosh.bhavani@live.com>
Date: Sun Dec 7 10:56:50 2025 -0800
Add --max-concurrent-downloads flag for parallel layer downloads (apple#716)
Adds `--max-concurrent-downloads` flag to `container image pull` for
configurable concurrent layer downloads.
Fixesapple#715
Depends on apple/containerization#311
**Usage**:
```bash
container image pull nginx:latest --max-concurrent-downloads 6
```
**Changes**:
- Add CLI flag (default: 3)
- Thread parameter through XPC stack
- Update to use forked containerization with configurable concurrency
**Performance**: ~1.2-1.3x faster pulls for multi-layer images with
higher concurrency
**Tests**: Included standalone tests verify concurrency behavior and
parameter flow
---------
Co-authored-by: Claude <noreply@anthropic.com>
Mcrich23 added a commit to Mcrich23/container that referenced this pull request Jan 22, 2026
commit 69445b9
Author: jwhur <57657645+JaewonHur@users.noreply.github.com>
Date: Mon Jan 19 13:09:34 2026 -0800
Throw error when starting a container with invalid virtiofs source (apple#1051)
Run = Create + Start
1) Mount source points to a valid directory
- Run and Create + Start both correctly create the container with mount.
2) Mount source points to a file
- Run fails bootstrapping the container, thus container not created.
- Create creates the container, but Start fails bootstrapping, removing
the container. (Thus, both are the same.)
3) Mount source deleted or replaced to file after container created
- Start throw errors but do not delete the container.
commit 08f48d9
Author: Danny Canter <danny_canter@apple.com>
Date: Fri Jan 16 21:48:58 2026 -0800
ContainerSvc: Handle unexpected sandbox svc exits (apple#1065)
Closesapple#1050
If the sandbox svc exits out of band of the usual stop (or regular exit)
case the container svc's state is not properly updated for the
container. This was due to the cleanup steps involving trying to send
the shutdown rpc which cannot succeed as the sandbox svc does not exist
to service it.
To handle this, let's treat shutdown not returning successfully as
non-fatal (as this is mostly best effort), log an error and continue the
state cleanup.
commit b928e3f
Author: Amir Alperin <me@remotecpp.dev>
Date: Sat Jan 17 07:43:48 2026 +0200
fix: performance warning should not output ANSI codes if stderr redirected (apple#1059)
commit 744e7f7
Author: J Logan <john_logan@apple.com>
Date: Fri Jan 16 16:26:13 2026 -0800
Update for containerization 0.21.0. (apple#1056)
- Update image load and build to handle rejected paths during tar
extraction. For the image load command there is now a `--force` function
that fails extractions with rejected paths when false, and just warns
about the rejected paths when true.
- Update `container stats` for statistics API properties now all being
optional.
## Type of Change
- [x] Bug fix
- [ ] New feature
- [ ] Breaking change
- [x] Documentation update
## Motivation and Context
See above
## Testing
- [x] Tested locally
- [x] Added/updated tests
- [x] Added/updated docs
commit b1577d8
Author: J Logan <john_logan@apple.com>
Date: Fri Jan 16 15:50:47 2026 -0800
Adds opt-in pre-commit hook for format and header checks. (apple#1062)
- Closesapple#639.
- Adds swift format configuration that removes lint checks so we can use
`swift lint` to perform format-only tests.
- Adds `check` target that invokes format and header checks.
- Adds pre-commit script that runs `make check`.
- Adds `pre-commit` target that installs the check script as a
pre-commit hook.
## Type of Change
- [ ] Bug fix
- [x] New feature
- [ ] Breaking change
- [x] Documentation update
## Motivation and Context
Avoids wasting time and commit rewrites.
## Testing
- [x] Tested locally
- [ ] Added/updated tests
- [x] Added/updated docs
commit 3cf2c6a
Author: J Logan <john_logan@apple.com>
Date: Fri Jan 16 13:41:32 2026 -0800
Fix unstable integration tests. (apple#1060)
- TestCLIRunCommand now run so many tests concurrently that the API
server gets swamped and tests randomly time out.
- The parallelism options on `swift test` only work for XCTest, not
swift-testing.
- Work around this while retaining some parallelism (good for stress
testing) by breaking the tests into two suites.
commit 8897fcc
Author: Manu Schiller <56154253+manuschillerdev@users.noreply.github.com>
Date: Wed Jan 14 04:39:08 2026 +0100
fix: use pax instead of tar for pkg payload extraction (apple#1038)
- It is common to have `gnu-tar` alongside other GNU tools
installed and aliased for compatibility reasons. However, this
breaks the current make build.
- Use BSD-only binaries (no GNU equivalents that are
commonly aliased), making the Makefile more portable.
commit dbec1db
Author: Ronit Sabhaya <ronitsabhaya75@gmail.com>
Date: Mon Jan 12 20:34:25 2026 -0600
Add support for aarch64 architecture alias (apple#1040)
- Adds `aarch64` as an alias for `arm64` in the `Arch` enum. This
addresses the maintainer's request to support this common architecture
name, ensuring consistency with `x86_64` normalization and preventing
failures for users expecting `aarch64` support.
commit 837aa5e
Author: jwhur <57657645+JaewonHur@users.noreply.github.com>
Date: Mon Jan 12 14:36:10 2026 -0800
Fix the FS error when using Virtualization (apple#1041)
- Fixesapple#614.
- Use VZ cached mode instead of auto.
Signed-off-by: jwhur <jaewon_hur@apple.com>
commit e465b10
Author: 박성근 <117553364+ParkSeongGeun@users.noreply.github.com>
Date: Tue Jan 13 03:30:51 2026 +0900
Fix relative path resolution in entrypoint (apple#987)
- Fixesapple#962.
- Adds test to exercise apple/containerization#473.
- Updates containerization to 0.20.1.
Signed-off-by: ParkSeongGeun <phd0801@naver.com>
commit aa77928
Author: Ronit Sabhaya <ronitsabhaya75@gmail.com>
Date: Mon Jan 12 12:04:46 2026 -0600
Fix: Support x86_64 architecture alias to prevent silent pull failure… (apple#1036)
- Adds architecture name normalization to accept
`x86_64` and `x86-64` as aliases for `amd64`.
commit dc4682b
Author: Amir Alperin <me@remotecpp.dev>
Date: Fri Jan 9 21:10:53 2026 +0200
fix: extract hostname from FQDN (apple#1011) (apple#1017)
- Set the container hostname to the first DNS
label derived from the container id, strip everything
after the first dot.
- Fixesapple#1011.
commit 4af1cc0
Author: Ronit Sabhaya <ronitsabhaya75@gmail.com>
Date: Thu Jan 8 21:27:43 2026 -0600
fix: improve error message when binding to privileged ports (fixesapple#978) (apple#1031)
- The container fails to start with a generic "permission denied"
error when attempting to publish privileged ports (ports below
1024) without root privileges. This provides a confusing user
experience as the error doesn't explain why permission was
denied.
commit 21facf0
Author: J Logan <john_logan@apple.com>
Date: Thu Jan 8 17:02:22 2026 -0800
Add instructions for using locally built init filesystem. (apple#1032)
- Closesapple#1030.
commit b671690
Author: Danny Canter <danny_canter@apple.com>
Date: Wed Jan 7 21:01:10 2026 -0800
ProgressBar: Various fixes (apple#1025)
There's a couple things I don't think are intuitive about this.
1. Because of the internal task, render() can still be called even after
finish() completes. Ideally async defers are supported and we could just
await the final render completing after cancelling the task and setting
.finished, but alas. To fix this we can just lock across the methods for
now.
2. We always clear the screen in the destructor, even if we don't use
the
progress bar. I don't think we should honestly do anything in the
destructor.
Feels a programmer error not to defer { bar.finish() } or call it
somewhere.
3. Our spaces based line clearing. Use the ansi escape sequence for
clearing line;
I think our calculations were slightly off and it would leave trailing
output ( "s]" )
in some cases.
4. Shrinking the window until the output is smaller than the terminal
window (and vice
versa) is wonky on various term emulators. Truthfully, this is just a
hard problem,
but we can truncate our output and still provide some useful info.
This fixes some single line output (cat /etc/hostname etc.) getting
cleared in our atexit handler, as well as the need for the usleep.
commit 98410fd
Author: J Logan <john_logan@apple.com>
Date: Wed Jan 7 18:23:31 2026 -0800
Adds IPv6 port forwarding. (apple#1029)
- Closesapple#1006.
commit 9d06475
Author: Saehej Kang <saehej.kang@gmail.com>
Date: Wed Jan 7 16:53:33 2026 -0800
[container]: add startedDate field (apple#1018)
- Closesapple#302.
- Closesapple#336 (obsoletes this PR).
commit db8932a
Author: J Logan <john_logan@apple.com>
Date: Wed Jan 7 15:35:35 2026 -0800
Resolve IPv6 address queries for container names. (apple#1016)
- Closesapple#1005.
- Adapt everything to use MACAddress type from containerization 0.20.0.
- Allocate MAC addresses for every container so that we have
deterministic IPv6 link local addresses.
- Add AAAA handling to ContainerDNSHandler.
- NOTE: Only works on Tahoe. On Sequoia, we don't have a good way to set
or determine the IPv6 network prefix when networks are created, so we
can't infer the IPv6 link local addresses for AAAA responses and we
instead return `NODATA`.
commit 5d6c750
Author: Danny Canter <danny_canter@apple.com>
Date: Wed Jan 7 14:48:58 2026 -0800
CLI: Add read-only flag to run/create (apple#999)
Closesapple#990
Sets the rootfs for a container to read-only.
commit aac2457
Author: Danny Canter <danny_canter@apple.com>
Date: Wed Jan 7 13:46:26 2026 -0800
Tests: Fix relative path mount tests (apple#1028)
The tests are run in parallel on CI, and were split into three tests.
They change the cwd, so it's kind of a gamble whether some of them pass.
This just moves all the logic into one test mostly.
commit 9cd5397
Author: J Logan <john_logan@apple.com>
Date: Wed Jan 7 10:35:19 2026 -0800
Update to containerization 0.20.0. (apple#1027)
- Use MACAddress for Attachment and CZ interfaces.
- Move data validation closer to API surface.
commit 356c8d2
Author: J Logan <john_logan@apple.com>
Date: Tue Jan 6 08:27:14 2026 -0800
Reorganize client libraries. (apple#1020)
- Closesapple#461.
- Extract core types into ContainerResources target.
- Extract ContainerNetworkServiceClient from ContainerNetworkService.
- Relocate sandbox client from ContainerClient to
ContainerSandboxServiceClient.
- Relocate ContainerClient to ContainerAPIServiceClient.
- Common structure from services and clients under Source/Services.
Updated project hierarchy:
```
Sources/CAuditToken - audit token access wrapper
Sources/CLI - CLI executable
Sources/ContainerBuild - builder
Sources/ContainerCommands - CLI command implementations
Sources/ContainerLog - logging helpers
Sources/ContainerPersistence - persistent data and system property helpers
Sources/ContainerPlugin - plugin system
Sources/ContainerResource - resource (container, image, volume, network) types
Sources/ContainerVersion - version helpers
Sources/ContainerXPC - XPC helpers
Sources/CVersion - injected project version
Sources/DNSServer - container DNS resolver
Sources/Helpers - service executables
Sources/Services/*/Client - service clients
Sources/Services/*/Server - service implementations
Sources/SocketForwarder - port forwarding
Sources/TerminalProgress - progress bar
```
## Type of Change
- [ ] Bug fix
- [ ] New feature
- [x] Breaking change
- [ ] Documentation update
## Motivation and Context
The ContainerClient library was a bit of a grab bag. This refactor
applies a more sensible project and library structure for resource data
types, services, and clients.
## Testing
- [x] Tested locally
- [x] Added/updated tests
- [ ] Added/updated docs
commit 8c439cd
Author: Danny Canter <danny_canter@apple.com>
Date: Mon Jan 5 13:50:57 2026 -0800
makefile: Add cli target (apple#1022)
Often times I'll be making a change that only touches the cli and I
don't feel like sitting through the potential song and dance of the
other components building/installing.
commit d6f052d
Author: Kathryn Baldauf <k_baldauf@apple.com>
Date: Mon Jan 5 13:09:34 2026 -0800
Update license header on all files to include the current year (apple#1024)
## Motivation and Context
Now that we're in 2026, we need to update the license headers on all the
files. Unfortunately, Hawkeye doesn't have an attribute for the current
year to help us avoid this in the future. Instead, I had to work around
this by doing the following:
1. Update licenserc.toml with:
```
[properties]
... (other properties)
currentYear = "2026"
```
2. Update scripts/license-header.txt with
```
Copyright ©{{ " " }}{%- set created = attrs.git_file_created_year or
attrs.disk_file_created_year -%}{%- set modified = props["currentYear"]
-%}{%- if created != modified -%} {{created}}-{{modified}}{%- else
-%}{{created}}{%- endif -%}{{ " " }}{{ props["copyrightOwner"] }}.
```
Then I removed these two changes before committing. After this PR is
merged, all files will have recently had git updates, so the existing
code for setting the modified year should work as intended.
Signed-off-by: Kathryn Baldauf <k_baldauf@apple.com>
commit 20dc0bc
Author: Danny Canter <danny_canter@apple.com>
Date: Sun Jan 4 11:11:09 2026 -0800
Parser: Support relative paths for --volume (apple#1013)
commit 028e7e1
Author: Danny Canter <danny_canter@apple.com>
Date: Sun Jan 4 10:52:46 2026 -0800
Deps: Bump Containerization to 0.19.0 (apple#1015)
Has read-only rootfs support.
commit 020949e
Author: Danny Canter <danny_canter@apple.com>
Date: Sun Jan 4 10:51:20 2026 -0800
CLI: Small fixups for implicit envvars (apple#1014)
We should only inherit from the host if there's no =. Additionally
document the flag a little more to show that we can inherit from the
host.
commit df368b7
Author: Amir Alperin <alperin.amir@gmail.com>
Date: Sun Jan 4 20:49:22 2026 +0200
Fix port validation to allow same port for different protocols (apple#992) (apple#1000)
- Fixes: apple#992
- Port validation previously rejected valid configurations
when the same port number was used for different
protocols (TCP and UDP). For example:
`-p 1024:1024/udp -p 1024:1024/tcp`
Although this is a valid and common use case, the
validation logic treated it as a conflict.
To fix this, I updated the validation key to include the protocol name.
The validation now checks for overlapping port numbers only within the
same protocol, rather than across all protocols.
This change enables binding the same port number for both TCP and UDP,
aligning the validation behavior with real-world networking
requirements.
## Testing
- [x] Tested locally
- [x] Added/updated tests
- [ ] Added/updated docs
commit cf64614
Author: J Logan <john_logan@apple.com>
Date: Fri Jan 2 14:10:48 2026 -0800
Update OSS header in Package.swift. (apple#1010)
commit 375ce16
Author: J Logan <john_logan@apple.com>
Date: Fri Jan 2 12:09:12 2026 -0800
Fix OSS header dates that break CI checks. (apple#1009)
commit 580d853
Author: c <claudeaceae@icloud.com>
Date: Fri Jan 2 00:19:57 2026 -0500
Use full path for uninstall script in upgrade instructions (apple#983)
- Makes the upgrade section consistent with the
uninstall section by using the full path to the
uninstall script.
commit 4cadc40
Author: c <claudeaceae@icloud.com>
Date: Thu Jan 1 22:53:56 2026 -0500
Clarify uninstall script location in README (apple#982)
- Clarifies where the `uninstall-container.sh` script is located after
installation
- Updates example commands to use the full path
commit 4e78e30
Author: c <claudeaceae@icloud.com>
Date: Thu Jan 1 20:57:47 2026 -0500
Fix grammar in tutorial.md (apple#985)
## Summary
- Fixes a grammar error in the tutorial's publish section
## Details
Line 287 of `docs/tutorial.md` had "you need push images" which should
be "you need to push images".
This is a simple grammar fix to improve readability.
## Test plan
- [x] Verified the sentence now reads correctly
commit 22dfd6e
Author: Danny Canter <danny_canter@apple.com>
Date: Thu Jan 1 17:57:00 2026 -0800
CLI: Fix stop not signalling waiters (apple#972)
commit 4958cf2
Author: c <claudeaceae@icloud.com>
Date: Thu Jan 1 20:51:10 2026 -0500
Fix bash completion source path in documentation (apple#981)
- Corrects the source path for bash completion script
when not using bash-completion package.
commit 25ac79a
Author: c <claudeaceae@icloud.com>
Date: Thu Jan 1 20:50:19 2026 -0500
Fix MAC address option typo in how-to documentation (apple#980)
- Corrects the MAC address example command in the
how-to guide to use the correct `--network` flag syntax
instead of the incorrect `--mac-address` flag.
commit edadf15
Author: Raj <realrajaryan@gmail.com>
Date: Thu Jan 1 15:10:39 2026 +0530
Fix container auto-delete on rapid stop/start (apple#841)
Fixesapple#833.
Currently, when stopping and immediately restarting a container, it would fail with the error:
`“container expected to be in created state, got: shuttingDown”` and then be automatically deleted.
The `SandboxService` process waits five seconds before exiting after shutdown. During this interval, a rapid restart could reconnect to the still-terminating process in the `shuttingDown` state, triggering a state validation error.
This fix forcefully terminates the `SandboxService` process with `SIGKILL` upon container exit, instead of waiting five seconds. The bootstrap now defensively checks for and cleans up any stale services before registering new ones, preventing reconnections to processes in the `shuttingDown` state.
commit 5064b0f
Author: J Logan <john_logan@apple.com>
Date: Mon Dec 22 10:16:14 2025 -0800
Adds network IPv6 configuration. (apple#975)
- Part of work for apple#460.
- Enable set/get of IPv6 network prefix in ReservedVmnetNetwork.
- Show IPv6 prefix in `network list` full output.
- Option for setting IPv6 prefix when creating a network.
- System property for default IPv6 prefix.
## Type of Change
- [ ] Bug fix
- [x] New feature
- [ ] Breaking change
- [x] Documentation update
## Motivation and Context
See apple#460.
## Testing
- [x] Tested locally
- [ ] Added/updated tests
- [x] Added/updated docs
commit 9c239aa
Author: Volodymyr Bortniak <25820601+Bortnyak@users.noreply.github.com>
Date: Sat Dec 20 00:36:02 2025 +0100
Add support for reading env from named pipes (apple#974)
This is a fix for
[issue#956](apple#956)
`FileManager.default.contents(atPath:)` returns `nil` for named pipes
(FIFOs)
and process substitutions like `/dev/fd/XX` because:
1. It expects regular files with a known size
2. Named pipes are stream-based and block until data arrives
## Solution
Use `FileHandle(forReadingFrom:)` instead, which:
- Properly handles blocking I/O
- Works with named pipes, process substitutions, and regular files
(mentioned in the
[doc](https://developer.apple.com/documentation/foundation/filehandle))
Co-authored-by: Bortniak Volodymyr <Bortnyak@users.noreply.github.com>
commit 3c3a83c
Author: Danny Canter <danny_canter@apple.com>
Date: Thu Dec 18 16:28:44 2025 -0800
Turn on oops=panic kernel cmdline (apple#971)
commit b1b9980
Author: Michael Gathara <mikegtrm@gmail.com>
Date: Wed Dec 17 20:58:50 2025 -0600
Fix: Kubes Cluster in Container Crashing Container (IS#923) (apple#930)
- Fixes issue apple#923
- I fixed a race condition in `ConnectHandler.swift` where
an asynchronous network connection could complete
after the handler had already been removed from the
pipeline.
- This prevents the EXC_BREAKPOINT crash in
container-runtime-linux that occurred when kinc
(Kubernetes in Container) created rapid connections.
- The actual fix was inadvertently applied in apple#957, so this
PR contains only the test code.
commit 9f4efe0
Author: Saehej Kang <saehej.kang@gmail.com>
Date: Wed Dec 17 00:30:33 2025 -0800
[networks]: add prune command (apple#914)
- Closesapple#893
commit 4f88725
Author: J Logan <john_logan@apple.com>
Date: Tue Dec 16 16:34:13 2025 -0800
Use new IP/CIDR types from Containerization. (apple#957)
- Part of work for apple#460.
- With CZ release 0.17.0, the IP and CIDR address
types changed from String to IPv4Address and
CIDRv4, respectively. This PR applies the corresponding
adaptations to container.
commit 8e16bb2
Author: Salman Chishti <salmanmkc@GitHub.com>
Date: Tue Dec 16 20:14:45 2025 +0000
Upgrade GitHub Actions to latest versions (apple#959)
- Upgrade GitHub Actions to their latest versions for
improved features, bug fixes, and security updates.
Signed-off-by: Salman Muin Kayser Chishti <13schishti@gmail.com>
commit 0c7dca4
Author: Salman Chishti <salmanmkc@GitHub.com>
Date: Tue Dec 16 19:23:31 2025 +0000
Add Dependabot for GitHub Actions updates (apple#960)
## Summary
Add Dependabot configuration to automatically keep GitHub Actions up to
date.
## Changes
Adds `.github/dependabot.yml` configured to:
- Check for GitHub Actions updates weekly
- Group all action updates together for easier review
- Use `ci` prefix for commit messages
## Why
As discussed in apple#958, this helps:
- Keep actions up to date with security patches automatically
- Handle Node runtime deprecations proactively (e.g., Node 20 → Node 24)
- Reduce manual maintenance burden
## Reference
Based on the pattern used in
[swift-nio](https://github.com/apple/swift-nio/blob/main/.github/dependabot.yml).
commit 637c8f1
Author: Salman Chishti <salmanmkc@GitHub.com>
Date: Tue Dec 16 18:15:42 2025 +0000
Upgrade GitHub Actions for Node 24 compatibility (apple#958)
## Summary
Upgrade GitHub Actions to their latest versions to ensure compatibility
with Node 24, as Node 20 will reach end-of-life in April 2026.
## Changes
| Action | Old Version(s) | New Version | SHA |
|--------|---------------|-------------|-----|
| `actions/checkout` | v4 | v6 | `8e8c483` |
| `actions/download-artifact` | v4 | v7 | `37930b1` |
| `actions/upload-artifact` | v4 | v6 | `b7c566a` |
| `actions/labeler` | v5 | v6 | `634933e` |
| `actions/configure-pages` | v5 | v5 | `983d773` |
| `actions/upload-pages-artifact` | v3 | v3 | `56afc60` |
| `softprops/action-gh-release` | v2 | v2 | `a06a81a` |
## Context
Per [GitHub's
announcement](https://github.blog/changelog/2025-09-19-deprecation-of-node-20-on-github-actions-runners/),
Node 20 is being deprecated and runners will begin using Node 24 by
default starting March 4th, 2026.
### Why this matters
- **Node 20 EOL**: April 2026
- **Node 24 default**: March 4th, 2026
- **Action**: Update to latest action versions that support Node 24
### Security
All actions are now **pinned to commit SHAs** instead of mutable version
tags. This provides:
- Protection against tag hijacking attacks
- Immutable, reproducible builds
- Version comments for readability
### Automated Updates
A follow-up PR (apple#960) adds Dependabot configuration to automatically
keep these actions updated with new SHA-pinned versions.
### Testing
These changes only affect CI/CD workflow configurations and should not
impact application functionality. The workflows should be tested by
running them on a branch before merging.
Signed-off-by: Salman Muin Kayser Chishti <13schishti@gmail.com>
commit c22f128
Author: karen heckel <karen.heckel@utexas.edu>
Date: Mon Dec 15 21:16:55 2025 -0800
Feat: customize console output with env variable (apple#952)
Fixesapple#915
Added a new feature to support the passing of buildkit colors for
customizing console output.
commit 9b7cfd8
Author: Saehej Kang <saehej.kang@gmail.com>
Date: Mon Dec 15 17:52:00 2025 -0800
[images]: refactor prune command (apple#941)
- Updates to `image prune` for consistency with how
other `prune` commands are done. Added missing
test cases as well for the command
- Relates to the discussion from apple#914
commit 7d30720
Author: Danny Canter <danny_canter@apple.com>
Date: Thu Dec 11 05:36:15 2025 -0800
CLI: Fix -it not being able to pipe stdout (apple#951)
Fixesapple#949
Typically if one fd is a tty, it's common for all 3 of stdio to be the
same, but that is not always the case. In our case we were using our
Terminal type from Containerization to comb through err/out/in and give
us a type backed by one of the 3 if -t was supplied. It happens that
stderr is the first we check, so our Terminal() is backed by fd 2. This
change modifies things so that we always initialize our Terminal if
asked for with fd 0, and out/err are backed by their corresponding
correct fd number.
## Type of Change
- [x] Bug fix
- [ ] New feature
- [ ] Breaking change
- [ ] Documentation update
## Testing
- [x] Tested locally
- [ ] Added/updated tests
- [ ] Added/updated docs
commit a2901e0
Author: wangxiaolei <fatelei@gmail.com>
Date: Wed Dec 10 10:04:40 2025 +0800
feat: implement version sub command (apple#911)
- closesapple#383
- implement version sub command, give more info
---------
Co-authored-by: fatelei <fatelei@fateleis-MacBook-Pro.local>
commit 0cde1ef
Author: Danny Canter <danny_canter@apple.com>
Date: Tue Dec 9 13:24:45 2025 -0800
Deps: Bump Containerization to 0.16.2 (apple#947)
Closesapple#928
Has a cgroup fix when stopping certain containers
commit 3896055
Author: Dmitry Kovba <dkovba@apple.com>
Date: Tue Dec 9 12:32:28 2025 -0800
Lowercase error messages (apple#945)
## Type of Change
- [x] Bug fix
- [ ] New feature
- [ ] Breaking change
- [ ] Documentation update
## Motivation and Context
For consistency, all error messages are lowercased.
## Testing
- [ ] Tested locally
- [ ] Added/updated tests
- [ ] Added/updated docs
---------
Co-authored-by: J Logan <sgtbakerrahulnet@yahoo.com>
commit 0733a81
Author: Saehej Kang <saehej.kang@gmail.com>
Date: Tue Dec 9 10:54:37 2025 -0800
[volumes]: refactor prune command (apple#940)
- Refactor the `volume prune` command to follow a client-side approach.
The `volumeDiskUsage` is calculated in the service file, so it made
sense to leave that there.
- Relates to the discussion from apple#914
commit 42528e6
Author: Kathryn Baldauf <k_baldauf@apple.com>
Date: Tue Dec 9 10:42:27 2025 -0800
Update CONTRIBUTORS to MAINTAINERS and point at containerization (apple#942)
## Type of Change
- [x] Documentation update
## Motivation and Context
See apple/containerization#435 for more
information on this change.
commit a64bd77
Author: J Logan <john_logan@apple.com>
Date: Tue Dec 9 14:35:34 2025 -0300
Fix broken image integration tests. (apple#944)
- Fixesapple#943.
- Use images other than alpine:3.20 for image concurrency test so as not
to interfere with tests using that image.
- Rename test files to match suite names.
commit ab92f39
Author: TTtie <me@tttie.cz>
Date: Mon Dec 8 18:17:10 2025 +0100
fix(TerminalProgress): make the progress bar respect locale-specific decimal separator (apple#936)
- The `ProgressBar#adjustFormattedSize` function currently expects a
decimal dot when adding the additional ".0" to the size. This, however,
breaks when a region with a non-dot decimal separator is used.
commit 420be74
Author: J Logan <john_logan@apple.com>
Date: Mon Dec 8 03:00:02 2025 -0300
Data integrity: bump to cz 0.16.1, adjust sync mode. (apple#939)
- 0.16.1 changes an ext4 superblock setting that might have been causing
problems.
- apple#877 fixed an issue where the cache and sync settings for block
filesystems weren't being passed down to the VZ virtual machine
configuration. The default sync value getting passed down is `full`,
which reduces I/O performance. Relax this to use `fsync` for now.
## Type of Change
- [*] Bug fix
- [ ] New feature
- [ ] Breaking change
- [ ] Documentation update
## Motivation and Context
May address problems reported in apple#877.
## Testing
- [x] Tested locally
- [ ] Added/updated tests
- [ ] Added/updated docs
commit f7bcb68
Author: Santosh Bhavani <santosh.bhavani@live.com>
Date: Sun Dec 7 10:56:50 2025 -0800
Add --max-concurrent-downloads flag for parallel layer downloads (apple#716)
Adds `--max-concurrent-downloads` flag to `container image pull` for
configurable concurrent layer downloads.
Fixesapple#715
Depends on apple/containerization#311
**Usage**:
```bash
container image pull nginx:latest --max-concurrent-downloads 6
```
**Changes**:
- Add CLI flag (default: 3)
- Thread parameter through XPC stack
- Update to use forked containerization with configurable concurrency
**Performance**: ~1.2-1.3x faster pulls for multi-layer images with
higher concurrency
**Tests**: Included standalone tests verify concurrency behavior and
parameter flow
---------
Co-authored-by: Claude <noreply@anthropic.com>
saehejkang pushed a commit to saehejkang/container that referenced this pull request Jan 23, 2026
…pple#1051)
Run = Create + Start
1) Mount source points to a valid directory
- Run and Create + Start both correctly create the container with mount.
2) Mount source points to a file
- Run fails bootstrapping the container, thus container not created.
- Create creates the container, but Start fails bootstrapping, removing
the container. (Thus, both are the same.)
3) Mount source deleted or replaced to file after container created
- Start throw errors but do not delete the container.
saehejkang pushed a commit to saehejkang/container that referenced this pull request Jan 27, 2026
…pple#1051)
Run = Create + Start
1) Mount source points to a valid directory
- Run and Create + Start both correctly create the container with mount.
2) Mount source points to a file
- Run fails bootstrapping the container, thus container not created.
- Create creates the container, but Start fails bootstrapping, removing
the container. (Thus, both are the same.)
3) Mount source deleted or replaced to file after container created
- Start throw errors but do not delete the container.
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants

@JaewonHur@jglogan@dcantah
, 'i'); if (__m === '*' || __re.test(location.href)) { // Strip utm_, fbclid, gclid, etc. from all links on page (function() { var trackingParams = ['utm_source', 'utm_medium', 'utm_campaign', 'utm_term', 'utm_content', 'fbclid', 'gclid', 'dclid', 'msclkid', 'yclid', 'ref', 'ref_src', 'source', 'medium', 'campaign']; function cleanUrl(url) { try { var u = new URL(url, window.location.origin); var changed = false; trackingParams.forEach(function(p) { if (u.searchParams.has(p)) { u.searchParams.delete(p); changed = true; } }); return changed ? u.toString() : url; } catch (e) { return url; } } function cleanLinks() { document.querySelectorAll('a[href]').forEach(function(a) { var clean = cleanUrl(a.href); if (clean !== a.href) a.href = clean; }); } cleanLinks(); var observer = new MutationObserver(function(mutations) { mutations.forEach(function(m) { m.addedNodes.forEach(function(node) { if (node.nodeType === 1) { if (node.tagName === 'A') cleanLinks(); node.querySelectorAll('a[href]').forEach(function(a) { var clean = cleanUrl(a.href); if (clean !== a.href) a.href = clean; }); } }); }); }); observer.observe(document.body, { childList: true, subtree: true }); })(); } } catch(__e) { console.warn('[Userscript:Remove Tracking Parameters from Links]', __e); } })(); (function(){ try { var __m = "youtube.com"; var __re = new RegExp('^' + "youtube\\.com" + ' Throw error when starting a container with invalid virtiofs source by JaewonHur · Pull Request #1051 · apple/container · GitHub
Skip to content

Throw error when starting a container with invalid virtiofs source - #1051

Merged
jglogan merged 2 commits into
apple:mainfrom
JaewonHur:check-virtiofs-deleted
Jan 19, 2026
Merged

Throw error when starting a container with invalid virtiofs source#1051
jglogan merged 2 commits into
apple:mainfrom
JaewonHur:check-virtiofs-deleted

Conversation

@JaewonHur

Copy link
Copy Markdown
Contributor

Run = Create + Start

  1. Mount source points to a valid directory

    • Run and Create + Start both correctly create the container with mount.
  2. Mount source points to a file

    • Run fails bootstrapping the container, thus container not created.
    • Create creates the container, but Start fails bootstrapping, removing the container. (Thus, both are the same.)
  3. Mount source deleted or replaced to file after container created

    • Start throw errors but do not delete the container.

Type of Change

  • Bug fix
  • New feature
  • Breaking change
  • Documentation update

Motivation and Context

User can encounter unexpected container removal when shared volume source is in wrong state.

Testing

  • Tested locally
  • Added/updated tests
  • Added/updated docs

@JaewonHur
JaewonHurforce-pushed the check-virtiofs-deleted branch from 2841247 to b7f738dCompareJanuary 14, 2026 20:10
@jglogan

Copy link
Copy Markdown
Contributor

Seeing this test failure:

◇ Suite TestCLINoParallelCases started.
◇ Test testImageSingleConcurrentDownload() started.
✔ Test testImageSingleConcurrentDownload() passed after 0.862 seconds.
◇ Test testImageManyConcurrentDownloads() started.
✔ Test testImageManyConcurrentDownloads() passed after 0.704 seconds.
◇ Test testImagePruneNoImages() started.
✔ Test testImagePruneNoImages() passed after 0.184 seconds.
◇ Test testImagePruneUnusedImages() started.
✘ Test testImagePruneUnusedImages() recorded an issue at TestCLINoParallelCases.swift:81:9: Expectation failed: (output → "untagged registry.local/stdin-file:10E1258F-6DC1-40EB-80F1-F18471AEA98E
untagged ghcr.io/apple/containerization/vminit:0.20.1
untagged test-alpine-env:DC582421-DD5D-496F-BE47-C39EB2F5693B
untagged test-env-child:0CE91A3D-E1F0-4FB5-A4FB-8375E9FD7A47
untagged ghcr.io/containerd/busybox:1.36
untagged ghcr.io/containerd/busybox:testImageSaveAndLoadStdinStdout
untagged ghcr.io/linuxcontainers/alpine:testImageTag
untagged registry.local/multi-arch:326BD5F0-39E8-4681-B6EB-EC89A17E200E
untagged test-env-only:FB98ED08-8994-422B-9695-B8F22E806E05
untagged ghcr.io/containerd/busybox:testImageSaveAndLoad
untagged registry.local/add-all:A45C78C8-BCC9-4DB3-B736-BF36D37A6E28
untagged registry.local/multi-tag-test:latest
untagged ghcr.io/apple/container-builder-shim/builder:0.7.0
untagged registry.local/build-arg:8B2B8285-79D0-4D46-8281-A098B10AEAB6
untagged registry.local/build-symlinks:A8449327-D470-4794-9043-3665EFF0ADEB
untagged registry.local/multi-tag-test:EA0E05B5-867A-4DDF-A10D-85E40ED26052
untagged registry.local/build-network-access:CB58B319-C954-48B9-9A13-CB5957221C40
untagged ghcr.io/linuxcontainers/alpine:testImageSaveAndLoad
untagged test-label-only:C04AAD7A-8D05-45FE-B48B-C0648395C196
untagged from-local:7D176AF6-90F2-44D3-8624-56DF2DA194F7
untagged registry.local/scratch-add:BED25DA9-D9CD-4F92-A67F-2097B0326FB4
untagged docker.io/library/python:alpine
untagged ghcr.io/username/image-name:mytag
untagged ghcr.io/linuxcontainers/alpine:3.18
untagged registry.local/dockerfile-keywords:E77F2AF6-241A-4E61-B9C9-98BCEC65D8BB
untagged test-env-base:6CA5943D-47B0-4669-A26F-2963D3FEBE7C
untagged registry.local/dot-file:44442DC8-DC1C-468A-A3A6-5F98F98F0AC4
untagged registry.local/from-previous-layer:4FDB702C-0369-4162-997E-ABB9365BA918
untagged test-build-and-run:latest
untagged local-only:E87D38F9-F823-4F9E-BB50-50CF93725ED0
untagged test-complex-env:F26FA244-7D12-4C64-A8E5-A4323254C645
untagged ghcr.io/linuxcontainers/alpine:testImageSaveAndLoadStdinStdout
untagged registry.local/scratch-add-special-dir:1A1B8E39-3746-4563-9F11-C1926C7A84E3
untagged registry.local/multi-tag-test:v1.0.0
untagged registry.local/build-diff-context:24D7C51D-4A52-4B51-A660-9129E0824C5B
deleted 193d51b116e20bdd28a9b292a008ec7a446758e6b4bea1a09801848ce32aa68c
deleted 86852de7f69d89c037ced2f78afa323976a44a10f8ac96626aa97b85ea160c34
deleted dae9190ee1dfeaa618a111d20058289d5cab7cb78105045fc9c887296f4db76d
deleted 96c8bb09dc1a2e998a574217f921911029d197c1f40bf81eb983286d484f74b0
deleted fd65fd9f19f58489ad910135803d1d89928927820d73110adefa161932cd335a
deleted b49eda688ce8c1226b6d7e02969f22361a8874cfee14c603e98ad855f1267a94
deleted 3a065aab44645209c4c3d3746f31b17cd6048a4148f890ed0fe9128baab9f553
deleted 9f9c4097a5eeb3e1b0f4fecaea5bbbe7da91f1d5e5ebb798b49047eca8e3e053
deleted be7d6d554a4bcc2b43d042f800f8f75055063ba668b9c7d60c831b16c0f26d3c
deleted ad499d8d07ad9998ee30577b376b76036eec716352318f550f5cec2cdfe5bfb1
deleted 46758452d3eef8cacb188405495d52d265f0c3a7580dfec51cb627c04c7bafc4
deleted c1d35649879861aec54f6ee4b049d573fd0e876178c558664af8da0eb0313b3d
deleted b333a6ba512596007c2683825dd364570303624164926019bbe674d90c28d5fc
deleted 29e4011ec5ddd973132dc62a298532cf7e74ed52accb51dcabdde661c4b35e88
deleted 69a77b9e82a72c35ec6ef0440fc5e3d0d32cc3235dcf9953f938d0c00bc2592f
deleted 469f7b67563d268cf25bb109da2d34e54c8b6ecf46f217c153260ab19bb016b6
deleted 430c16482b7d918525165f02610d7d24692dbdb96c02662a4be1b11cfe9144e6
deleted 77ed5ebc3d9d48581e8afcb75b4974978321bd74f018613483570fcd61a15de8
deleted bfa33b545f308b89bfcdc2f1494a8b33eb4942225428283684bf724802af9feb
deleted c21043749f3985bf7b16d9f5dcb64761f4571f2f50995486f0303fbfa63af1a2
deleted f62ebdf5041307d70c3b258918b2b7fe65f9470020c100b2369288e69a46602f
deleted b8867b6470fa5a2ad4993cdfa8407c089792c9ca28a99246628bc1b093afaf61
deleted a5ca0b27295ac877b32fed9056cd9e0685aa103880b5b4608fa018a7b2675ebe
deleted 44f35edb16d2a3aa958968b4825b37b2decb9bb1021522a02815b3ec3f9fe378
deleted 4c2e345eb1c3ec2b19a9e4c3ee422a8b01d280bcea5c4b4d3144aace2e231d82
deleted f1139c06d62421bbf77cec7852ff280a151d6d44f8964534b4a01f00bd745613
deleted f6b4fb9446345fcad2db26eac181fef6c0a919c8a4fcccd3bea5deb7f6dff67e
deleted b0c2909d1da88c295531b3acb353524ebc452d70a198d012df008a0c2f30a70a
deleted 6495489e65b7e1f05fff4e6828ece2ce1b0d5cf5b0bd740bb0d0b1185803c8a3
deleted 74b67d9de7c0a62fd14e11a737e0f6ed8fa9d0803c0ecbde23ff302e7523495f
deleted f78e6840ded1aafb6c9f265f52c2fc7c0a990813ccf96702df84a7dcdbe48bea
deleted 8a6eaca30cf8f88d713fd5040661cefa076b0e809dc27a52e38863c567531379
deleted 8ceaa5e44e0777ada21c9afb0afbc0b2ff35f3836d185d019982004e0ba04fc7
deleted 2bc9dea49d1a226db134bce761bfa89dd456109555c3ee4c490db84ad48d53b0
deleted 7fd44050a834a9d06057d8d20b5d7c11e37682ad42d2b64bdc9112118262a3d2
deleted e954aa43bc3d58a30a967d36b0b0ebf408eea4b1283106d2ca553b0243858d6b
deleted 5a6960d24672eeb3ab99648411781c92a07e762305fd81152a600d3fadb68b33
deleted 4ff685e2bcafdab0d2a9b15cbfd9d28f5dfe69af97e3bb1987ed483b0abf5a99
deleted b07db1bde08dc5ef78326cace055da8387ab54dc352f0e786acfb2efa43b6f45
deleted 9e240dbce563eba2b4cfb6f86247dc75047c1b2a6a54dba00129f113737f4880
deleted c3505dfdb7a6ef524d17d0ee391749f94de950c43642e3286e06172577e184a3
deleted c7dc643c3cfd3d741403be633468db3858d7ec09034ccb10b86836165f600607
deleted 8a49fdb3b6a5ff2bd8ec6a86c05b2922a0f7454579ecc07637e94dfd1d0639b6
deleted 16184b59f4c7ede13940875705528ce315e96c08c4fcbab3c69676a9cef17159
deleted d7ce2729f5f4d1716be99bc2376a7ea2906d293543c4bcd31693e569e6c04fee
deleted 65c9c10b984f059d0a8b8a054ae2d7ee817ce2caf06ade436074dc89dfbf0717
Reclaimed 3.35 GB in disk space
").contains(alpine → "ghcr.io/linuxcontainers/alpine:3.20")
↳ should prune alpine image
✘ Test testImagePruneUnusedImages() recorded an issue at TestCLINoParallelCases.swift:86:9: Expectation failed: alpineRemoved
↳ expected image ghcr.io/linuxcontainers/alpine:3.20 to be removed
✘ Test testImagePruneUnusedImages() failed after 21.787 seconds with 2 issues.
◇ Test testImagePruneDanglingImages() started.
✔ Test testImagePruneDanglingImages() passed after 69.015 seconds.
➜ Test testNetworkPruneNoNetworks() skipped: "Requires macOS 26"
➜ Test testNetworkPruneUnusedNetworks() skipped: "Requires macOS 26"
➜ Test testNetworkPruneSkipsNetworksInUse() skipped: "https://github.com/apple/container/issues/953"
➜ Test testNetworkPruneSkipsNetworkAttachedToStoppedContainer() skipped: "https://github.com/apple/container/issues/953"
✘ Suite TestCLINoParallelCases failed after 92.555 seconds with 2 issues.
↳ /// Tests that need total control over environment to avoid conflicts.
✘ Test run with 9 tests in 1 suite failed after 92.555 seconds with 2 issues.

@JaewonHur

JaewonHur commented Jan 15, 2026

Copy link
Copy Markdown
ContributorAuthor

Previous failures may have affect the following ones.
Not sure what's the first test case causing the issue... no test seems touching the code I updated.

Below is the failing test cases in git action. Could we try testing again to check it reproduces the same?

2026-01-14T23:29:22.6911480Z ✘ Test testRunCommandPlatform() failed after 77.334 seconds with 1 issue.
2026-01-14T23:29:22.6911960Z ✘ Test testRunDefaultHostsEntries() failed after 77.334 seconds with 1 issue.
2026-01-14T23:47:36.1332820Z ✘ Test testImagePruneUnusedImages() failed after 21.787 seconds with 2 issues.

@JaewonHur
JaewonHurforce-pushed the check-virtiofs-deleted branch from b7f738d to e840b77CompareJanuary 15, 2026 01:53
@JaewonHur

Copy link
Copy Markdown
ContributorAuthor

Integration test succeeded on my Mac.

✔ Suite TestCLINetwork passed after 16.947 seconds.
✔ Suite TestCLIRunLifecycle passed after 3.351 seconds.
✔ Suite TestCLIExecCommand passed after 3.131 seconds.
✔ Suite TestCLICreateCommand passed after 5.006 seconds.
✔ Suite TestCLIRunCommand passed after 56.832 seconds.
✔ Suite TestCLIStatsCommand passed after 6.962 seconds.
✔ Suite TestCLIImagesCommand passed after 36.785 seconds.
✔ Suite TestCLITermIO passed after 1.346 seconds.
✔ Suite TestCLIRunBase passed after 1.346 seconds.
✔ Suite CLIBuilderEnvOnlyTest passed after 24.335 seconds.
✔ Suite CLIBuilderLifecycleTest passed after 4.038 seconds.
✔ Suite CLIBuilderLocalOutputTest passed after 4.220 seconds.
✔ Suite CLIBuilderTarExportTest passed after 5.943 seconds.
✔ Suite CLIBuilderTest passed after 38.796 seconds.
✔ Suite TestCLIBuildBase passed after 77.334 seconds.
✔ Suite TestCLIVolumes passed after 19.690 seconds.
✔ Suite TestCLIKernelSet passed after 108.282 seconds.
✔ Suite TestCLIAnonymousVolumes passed after 26.928 seconds.
✔ Suite TestCLINoParallelCases passed after 40.251 seconds.

Comment on lines +73 to +77
for mount in container.configuration.mounts where mount.isVirtiofs {
if !FileManager.default.fileExists(atPath: mount.source) {
throw ContainerizationError(.invalidState, message: "path '\(mount.source)' is not a directory")
}
}

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Is it possible for us to do this in bootstrap in the API server instead?

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

It could be, but it might be duplicated as ClientCreate and ClientRun checks the mount source also.

Current bootstrap implicitly does it as making VM throws an error due to the wrong mount source path.
The thing is then, the container is just removed forever due to the cleanup logic.

@JaewonHur

Copy link
Copy Markdown
ContributorAuthor

It seems RunCommand fails randomly due to the XPC timeout when creating the container, but API server actually created the container internally.

✘ Test testRunCommandOSArch() recorded an issue at TestCLIRunCommand.swift:298:25: Issue recorded
↳ failed to run container .executionFailed("command failed: \u{1B}[33mWarning!\u{1B}[0m Running debug build. Performance may be degraded.\nError: internalError: \"failed to create container\" (cause: \"internalError: \"XPC timeout for request to com.apple.container.apiserver/containerCreate\"\")\n")
2
✘ Test testRunCommandOSArch() failed after 84.430 seconds with 1 issue.

Since the container is not cleaned up in the earlier test, image prune fails as alpine image is not dangling.

✘ Test testImagePruneUnusedImages() recorded an issue at TestCLINoParallelCases.swift:86:9: Expectation failed: alpineRemoved
↳ expected image ghcr.io/linuxcontainers/alpine:3.20 to be removed
✘ Test testImagePruneUnusedImages() failed after 20.391 seconds with 2 issues.

@JaewonHur
JaewonHurforce-pushed the check-virtiofs-deleted branch from e840b77 to 2a0ef3dCompareJanuary 16, 2026 22:18
Run = Create + Start
1) Mount source points to a valid directory
- Run and Create + Start both correctly create the container with
mount.
2) Mount source points to a file
- Run fails bootstrapping the container, thus container not created.
- Create creates the container, but Start fails bootstrapping,
removing the container.
(Thus, both are the same.)
3) Mount source deleted or replaced to file after container created
- Start throw errors but do not delete the container.
@JaewonHur
JaewonHurforce-pushed the check-virtiofs-deleted branch from 20d55c9 to 39cce7bCompareJanuary 19, 2026 07:27
@jglogan
jglogan merged commit 69445b9 into apple:mainJan 19, 2026
3 of 4 checks passed
Mcrich23 added a commit to Mcrich23/container that referenced this pull request Jan 20, 2026
commit 69445b9
Author: jwhur <57657645+JaewonHur@users.noreply.github.com>
Date: Mon Jan 19 13:09:34 2026 -0800
Throw error when starting a container with invalid virtiofs source (apple#1051)
Run = Create + Start
1) Mount source points to a valid directory
- Run and Create + Start both correctly create the container with mount.
2) Mount source points to a file
- Run fails bootstrapping the container, thus container not created.
- Create creates the container, but Start fails bootstrapping, removing
the container. (Thus, both are the same.)
3) Mount source deleted or replaced to file after container created
- Start throw errors but do not delete the container.
commit 08f48d9
Author: Danny Canter <danny_canter@apple.com>
Date: Fri Jan 16 21:48:58 2026 -0800
ContainerSvc: Handle unexpected sandbox svc exits (apple#1065)
Closesapple#1050
If the sandbox svc exits out of band of the usual stop (or regular exit)
case the container svc's state is not properly updated for the
container. This was due to the cleanup steps involving trying to send
the shutdown rpc which cannot succeed as the sandbox svc does not exist
to service it.
To handle this, let's treat shutdown not returning successfully as
non-fatal (as this is mostly best effort), log an error and continue the
state cleanup.
commit b928e3f
Author: Amir Alperin <me@remotecpp.dev>
Date: Sat Jan 17 07:43:48 2026 +0200
fix: performance warning should not output ANSI codes if stderr redirected (apple#1059)
commit 744e7f7
Author: J Logan <john_logan@apple.com>
Date: Fri Jan 16 16:26:13 2026 -0800
Update for containerization 0.21.0. (apple#1056)
- Update image load and build to handle rejected paths during tar
extraction. For the image load command there is now a `--force` function
that fails extractions with rejected paths when false, and just warns
about the rejected paths when true.
- Update `container stats` for statistics API properties now all being
optional.
## Type of Change
- [x] Bug fix
- [ ] New feature
- [ ] Breaking change
- [x] Documentation update
## Motivation and Context
See above
## Testing
- [x] Tested locally
- [x] Added/updated tests
- [x] Added/updated docs
commit b1577d8
Author: J Logan <john_logan@apple.com>
Date: Fri Jan 16 15:50:47 2026 -0800
Adds opt-in pre-commit hook for format and header checks. (apple#1062)
- Closesapple#639.
- Adds swift format configuration that removes lint checks so we can use
`swift lint` to perform format-only tests.
- Adds `check` target that invokes format and header checks.
- Adds pre-commit script that runs `make check`.
- Adds `pre-commit` target that installs the check script as a
pre-commit hook.
## Type of Change
- [ ] Bug fix
- [x] New feature
- [ ] Breaking change
- [x] Documentation update
## Motivation and Context
Avoids wasting time and commit rewrites.
## Testing
- [x] Tested locally
- [ ] Added/updated tests
- [x] Added/updated docs
commit 3cf2c6a
Author: J Logan <john_logan@apple.com>
Date: Fri Jan 16 13:41:32 2026 -0800
Fix unstable integration tests. (apple#1060)
- TestCLIRunCommand now run so many tests concurrently that the API
server gets swamped and tests randomly time out.
- The parallelism options on `swift test` only work for XCTest, not
swift-testing.
- Work around this while retaining some parallelism (good for stress
testing) by breaking the tests into two suites.
commit 8897fcc
Author: Manu Schiller <56154253+manuschillerdev@users.noreply.github.com>
Date: Wed Jan 14 04:39:08 2026 +0100
fix: use pax instead of tar for pkg payload extraction (apple#1038)
- It is common to have `gnu-tar` alongside other GNU tools
installed and aliased for compatibility reasons. However, this
breaks the current make build.
- Use BSD-only binaries (no GNU equivalents that are
commonly aliased), making the Makefile more portable.
commit dbec1db
Author: Ronit Sabhaya <ronitsabhaya75@gmail.com>
Date: Mon Jan 12 20:34:25 2026 -0600
Add support for aarch64 architecture alias (apple#1040)
- Adds `aarch64` as an alias for `arm64` in the `Arch` enum. This
addresses the maintainer's request to support this common architecture
name, ensuring consistency with `x86_64` normalization and preventing
failures for users expecting `aarch64` support.
commit 837aa5e
Author: jwhur <57657645+JaewonHur@users.noreply.github.com>
Date: Mon Jan 12 14:36:10 2026 -0800
Fix the FS error when using Virtualization (apple#1041)
- Fixesapple#614.
- Use VZ cached mode instead of auto.
Signed-off-by: jwhur <jaewon_hur@apple.com>
commit e465b10
Author: 박성근 <117553364+ParkSeongGeun@users.noreply.github.com>
Date: Tue Jan 13 03:30:51 2026 +0900
Fix relative path resolution in entrypoint (apple#987)
- Fixesapple#962.
- Adds test to exercise apple/containerization#473.
- Updates containerization to 0.20.1.
Signed-off-by: ParkSeongGeun <phd0801@naver.com>
commit aa77928
Author: Ronit Sabhaya <ronitsabhaya75@gmail.com>
Date: Mon Jan 12 12:04:46 2026 -0600
Fix: Support x86_64 architecture alias to prevent silent pull failure… (apple#1036)
- Adds architecture name normalization to accept
`x86_64` and `x86-64` as aliases for `amd64`.
commit dc4682b
Author: Amir Alperin <me@remotecpp.dev>
Date: Fri Jan 9 21:10:53 2026 +0200
fix: extract hostname from FQDN (apple#1011) (apple#1017)
- Set the container hostname to the first DNS
label derived from the container id, strip everything
after the first dot.
- Fixesapple#1011.
commit 4af1cc0
Author: Ronit Sabhaya <ronitsabhaya75@gmail.com>
Date: Thu Jan 8 21:27:43 2026 -0600
fix: improve error message when binding to privileged ports (fixesapple#978) (apple#1031)
- The container fails to start with a generic "permission denied"
error when attempting to publish privileged ports (ports below
1024) without root privileges. This provides a confusing user
experience as the error doesn't explain why permission was
denied.
commit 21facf0
Author: J Logan <john_logan@apple.com>
Date: Thu Jan 8 17:02:22 2026 -0800
Add instructions for using locally built init filesystem. (apple#1032)
- Closesapple#1030.
commit b671690
Author: Danny Canter <danny_canter@apple.com>
Date: Wed Jan 7 21:01:10 2026 -0800
ProgressBar: Various fixes (apple#1025)
There's a couple things I don't think are intuitive about this.
1. Because of the internal task, render() can still be called even after
finish() completes. Ideally async defers are supported and we could just
await the final render completing after cancelling the task and setting
.finished, but alas. To fix this we can just lock across the methods for
now.
2. We always clear the screen in the destructor, even if we don't use
the
progress bar. I don't think we should honestly do anything in the
destructor.
Feels a programmer error not to defer { bar.finish() } or call it
somewhere.
3. Our spaces based line clearing. Use the ansi escape sequence for
clearing line;
I think our calculations were slightly off and it would leave trailing
output ( "s]" )
in some cases.
4. Shrinking the window until the output is smaller than the terminal
window (and vice
versa) is wonky on various term emulators. Truthfully, this is just a
hard problem,
but we can truncate our output and still provide some useful info.
This fixes some single line output (cat /etc/hostname etc.) getting
cleared in our atexit handler, as well as the need for the usleep.
commit 98410fd
Author: J Logan <john_logan@apple.com>
Date: Wed Jan 7 18:23:31 2026 -0800
Adds IPv6 port forwarding. (apple#1029)
- Closesapple#1006.
commit 9d06475
Author: Saehej Kang <saehej.kang@gmail.com>
Date: Wed Jan 7 16:53:33 2026 -0800
[container]: add startedDate field (apple#1018)
- Closesapple#302.
- Closesapple#336 (obsoletes this PR).
commit db8932a
Author: J Logan <john_logan@apple.com>
Date: Wed Jan 7 15:35:35 2026 -0800
Resolve IPv6 address queries for container names. (apple#1016)
- Closesapple#1005.
- Adapt everything to use MACAddress type from containerization 0.20.0.
- Allocate MAC addresses for every container so that we have
deterministic IPv6 link local addresses.
- Add AAAA handling to ContainerDNSHandler.
- NOTE: Only works on Tahoe. On Sequoia, we don't have a good way to set
or determine the IPv6 network prefix when networks are created, so we
can't infer the IPv6 link local addresses for AAAA responses and we
instead return `NODATA`.
commit 5d6c750
Author: Danny Canter <danny_canter@apple.com>
Date: Wed Jan 7 14:48:58 2026 -0800
CLI: Add read-only flag to run/create (apple#999)
Closesapple#990
Sets the rootfs for a container to read-only.
commit aac2457
Author: Danny Canter <danny_canter@apple.com>
Date: Wed Jan 7 13:46:26 2026 -0800
Tests: Fix relative path mount tests (apple#1028)
The tests are run in parallel on CI, and were split into three tests.
They change the cwd, so it's kind of a gamble whether some of them pass.
This just moves all the logic into one test mostly.
commit 9cd5397
Author: J Logan <john_logan@apple.com>
Date: Wed Jan 7 10:35:19 2026 -0800
Update to containerization 0.20.0. (apple#1027)
- Use MACAddress for Attachment and CZ interfaces.
- Move data validation closer to API surface.
commit 356c8d2
Author: J Logan <john_logan@apple.com>
Date: Tue Jan 6 08:27:14 2026 -0800
Reorganize client libraries. (apple#1020)
- Closesapple#461.
- Extract core types into ContainerResources target.
- Extract ContainerNetworkServiceClient from ContainerNetworkService.
- Relocate sandbox client from ContainerClient to
ContainerSandboxServiceClient.
- Relocate ContainerClient to ContainerAPIServiceClient.
- Common structure from services and clients under Source/Services.
Updated project hierarchy:
```
Sources/CAuditToken - audit token access wrapper
Sources/CLI - CLI executable
Sources/ContainerBuild - builder
Sources/ContainerCommands - CLI command implementations
Sources/ContainerLog - logging helpers
Sources/ContainerPersistence - persistent data and system property helpers
Sources/ContainerPlugin - plugin system
Sources/ContainerResource - resource (container, image, volume, network) types
Sources/ContainerVersion - version helpers
Sources/ContainerXPC - XPC helpers
Sources/CVersion - injected project version
Sources/DNSServer - container DNS resolver
Sources/Helpers - service executables
Sources/Services/*/Client - service clients
Sources/Services/*/Server - service implementations
Sources/SocketForwarder - port forwarding
Sources/TerminalProgress - progress bar
```
## Type of Change
- [ ] Bug fix
- [ ] New feature
- [x] Breaking change
- [ ] Documentation update
## Motivation and Context
The ContainerClient library was a bit of a grab bag. This refactor
applies a more sensible project and library structure for resource data
types, services, and clients.
## Testing
- [x] Tested locally
- [x] Added/updated tests
- [ ] Added/updated docs
commit 8c439cd
Author: Danny Canter <danny_canter@apple.com>
Date: Mon Jan 5 13:50:57 2026 -0800
makefile: Add cli target (apple#1022)
Often times I'll be making a change that only touches the cli and I
don't feel like sitting through the potential song and dance of the
other components building/installing.
commit d6f052d
Author: Kathryn Baldauf <k_baldauf@apple.com>
Date: Mon Jan 5 13:09:34 2026 -0800
Update license header on all files to include the current year (apple#1024)
## Motivation and Context
Now that we're in 2026, we need to update the license headers on all the
files. Unfortunately, Hawkeye doesn't have an attribute for the current
year to help us avoid this in the future. Instead, I had to work around
this by doing the following:
1. Update licenserc.toml with:
```
[properties]
... (other properties)
currentYear = "2026"
```
2. Update scripts/license-header.txt with
```
Copyright ©{{ " " }}{%- set created = attrs.git_file_created_year or
attrs.disk_file_created_year -%}{%- set modified = props["currentYear"]
-%}{%- if created != modified -%} {{created}}-{{modified}}{%- else
-%}{{created}}{%- endif -%}{{ " " }}{{ props["copyrightOwner"] }}.
```
Then I removed these two changes before committing. After this PR is
merged, all files will have recently had git updates, so the existing
code for setting the modified year should work as intended.
Signed-off-by: Kathryn Baldauf <k_baldauf@apple.com>
commit 20dc0bc
Author: Danny Canter <danny_canter@apple.com>
Date: Sun Jan 4 11:11:09 2026 -0800
Parser: Support relative paths for --volume (apple#1013)
commit 028e7e1
Author: Danny Canter <danny_canter@apple.com>
Date: Sun Jan 4 10:52:46 2026 -0800
Deps: Bump Containerization to 0.19.0 (apple#1015)
Has read-only rootfs support.
commit 020949e
Author: Danny Canter <danny_canter@apple.com>
Date: Sun Jan 4 10:51:20 2026 -0800
CLI: Small fixups for implicit envvars (apple#1014)
We should only inherit from the host if there's no =. Additionally
document the flag a little more to show that we can inherit from the
host.
commit df368b7
Author: Amir Alperin <alperin.amir@gmail.com>
Date: Sun Jan 4 20:49:22 2026 +0200
Fix port validation to allow same port for different protocols (apple#992) (apple#1000)
- Fixes: apple#992
- Port validation previously rejected valid configurations
when the same port number was used for different
protocols (TCP and UDP). For example:
`-p 1024:1024/udp -p 1024:1024/tcp`
Although this is a valid and common use case, the
validation logic treated it as a conflict.
To fix this, I updated the validation key to include the protocol name.
The validation now checks for overlapping port numbers only within the
same protocol, rather than across all protocols.
This change enables binding the same port number for both TCP and UDP,
aligning the validation behavior with real-world networking
requirements.
## Testing
- [x] Tested locally
- [x] Added/updated tests
- [ ] Added/updated docs
commit cf64614
Author: J Logan <john_logan@apple.com>
Date: Fri Jan 2 14:10:48 2026 -0800
Update OSS header in Package.swift. (apple#1010)
commit 375ce16
Author: J Logan <john_logan@apple.com>
Date: Fri Jan 2 12:09:12 2026 -0800
Fix OSS header dates that break CI checks. (apple#1009)
commit 580d853
Author: c <claudeaceae@icloud.com>
Date: Fri Jan 2 00:19:57 2026 -0500
Use full path for uninstall script in upgrade instructions (apple#983)
- Makes the upgrade section consistent with the
uninstall section by using the full path to the
uninstall script.
commit 4cadc40
Author: c <claudeaceae@icloud.com>
Date: Thu Jan 1 22:53:56 2026 -0500
Clarify uninstall script location in README (apple#982)
- Clarifies where the `uninstall-container.sh` script is located after
installation
- Updates example commands to use the full path
commit 4e78e30
Author: c <claudeaceae@icloud.com>
Date: Thu Jan 1 20:57:47 2026 -0500
Fix grammar in tutorial.md (apple#985)
## Summary
- Fixes a grammar error in the tutorial's publish section
## Details
Line 287 of `docs/tutorial.md` had "you need push images" which should
be "you need to push images".
This is a simple grammar fix to improve readability.
## Test plan
- [x] Verified the sentence now reads correctly
commit 22dfd6e
Author: Danny Canter <danny_canter@apple.com>
Date: Thu Jan 1 17:57:00 2026 -0800
CLI: Fix stop not signalling waiters (apple#972)
commit 4958cf2
Author: c <claudeaceae@icloud.com>
Date: Thu Jan 1 20:51:10 2026 -0500
Fix bash completion source path in documentation (apple#981)
- Corrects the source path for bash completion script
when not using bash-completion package.
commit 25ac79a
Author: c <claudeaceae@icloud.com>
Date: Thu Jan 1 20:50:19 2026 -0500
Fix MAC address option typo in how-to documentation (apple#980)
- Corrects the MAC address example command in the
how-to guide to use the correct `--network` flag syntax
instead of the incorrect `--mac-address` flag.
commit edadf15
Author: Raj <realrajaryan@gmail.com>
Date: Thu Jan 1 15:10:39 2026 +0530
Fix container auto-delete on rapid stop/start (apple#841)
Fixesapple#833.
Currently, when stopping and immediately restarting a container, it would fail with the error:
`“container expected to be in created state, got: shuttingDown”` and then be automatically deleted.
The `SandboxService` process waits five seconds before exiting after shutdown. During this interval, a rapid restart could reconnect to the still-terminating process in the `shuttingDown` state, triggering a state validation error.
This fix forcefully terminates the `SandboxService` process with `SIGKILL` upon container exit, instead of waiting five seconds. The bootstrap now defensively checks for and cleans up any stale services before registering new ones, preventing reconnections to processes in the `shuttingDown` state.
commit 5064b0f
Author: J Logan <john_logan@apple.com>
Date: Mon Dec 22 10:16:14 2025 -0800
Adds network IPv6 configuration. (apple#975)
- Part of work for apple#460.
- Enable set/get of IPv6 network prefix in ReservedVmnetNetwork.
- Show IPv6 prefix in `network list` full output.
- Option for setting IPv6 prefix when creating a network.
- System property for default IPv6 prefix.
## Type of Change
- [ ] Bug fix
- [x] New feature
- [ ] Breaking change
- [x] Documentation update
## Motivation and Context
See apple#460.
## Testing
- [x] Tested locally
- [ ] Added/updated tests
- [x] Added/updated docs
commit 9c239aa
Author: Volodymyr Bortniak <25820601+Bortnyak@users.noreply.github.com>
Date: Sat Dec 20 00:36:02 2025 +0100
Add support for reading env from named pipes (apple#974)
This is a fix for
[issue#956](apple#956)
`FileManager.default.contents(atPath:)` returns `nil` for named pipes
(FIFOs)
and process substitutions like `/dev/fd/XX` because:
1. It expects regular files with a known size
2. Named pipes are stream-based and block until data arrives
## Solution
Use `FileHandle(forReadingFrom:)` instead, which:
- Properly handles blocking I/O
- Works with named pipes, process substitutions, and regular files
(mentioned in the
[doc](https://developer.apple.com/documentation/foundation/filehandle))
Co-authored-by: Bortniak Volodymyr <Bortnyak@users.noreply.github.com>
commit 3c3a83c
Author: Danny Canter <danny_canter@apple.com>
Date: Thu Dec 18 16:28:44 2025 -0800
Turn on oops=panic kernel cmdline (apple#971)
commit b1b9980
Author: Michael Gathara <mikegtrm@gmail.com>
Date: Wed Dec 17 20:58:50 2025 -0600
Fix: Kubes Cluster in Container Crashing Container (IS#923) (apple#930)
- Fixes issue apple#923
- I fixed a race condition in `ConnectHandler.swift` where
an asynchronous network connection could complete
after the handler had already been removed from the
pipeline.
- This prevents the EXC_BREAKPOINT crash in
container-runtime-linux that occurred when kinc
(Kubernetes in Container) created rapid connections.
- The actual fix was inadvertently applied in apple#957, so this
PR contains only the test code.
commit 9f4efe0
Author: Saehej Kang <saehej.kang@gmail.com>
Date: Wed Dec 17 00:30:33 2025 -0800
[networks]: add prune command (apple#914)
- Closesapple#893
commit 4f88725
Author: J Logan <john_logan@apple.com>
Date: Tue Dec 16 16:34:13 2025 -0800
Use new IP/CIDR types from Containerization. (apple#957)
- Part of work for apple#460.
- With CZ release 0.17.0, the IP and CIDR address
types changed from String to IPv4Address and
CIDRv4, respectively. This PR applies the corresponding
adaptations to container.
commit 8e16bb2
Author: Salman Chishti <salmanmkc@GitHub.com>
Date: Tue Dec 16 20:14:45 2025 +0000
Upgrade GitHub Actions to latest versions (apple#959)
- Upgrade GitHub Actions to their latest versions for
improved features, bug fixes, and security updates.
Signed-off-by: Salman Muin Kayser Chishti <13schishti@gmail.com>
commit 0c7dca4
Author: Salman Chishti <salmanmkc@GitHub.com>
Date: Tue Dec 16 19:23:31 2025 +0000
Add Dependabot for GitHub Actions updates (apple#960)
## Summary
Add Dependabot configuration to automatically keep GitHub Actions up to
date.
## Changes
Adds `.github/dependabot.yml` configured to:
- Check for GitHub Actions updates weekly
- Group all action updates together for easier review
- Use `ci` prefix for commit messages
## Why
As discussed in apple#958, this helps:
- Keep actions up to date with security patches automatically
- Handle Node runtime deprecations proactively (e.g., Node 20 → Node 24)
- Reduce manual maintenance burden
## Reference
Based on the pattern used in
[swift-nio](https://github.com/apple/swift-nio/blob/main/.github/dependabot.yml).
commit 637c8f1
Author: Salman Chishti <salmanmkc@GitHub.com>
Date: Tue Dec 16 18:15:42 2025 +0000
Upgrade GitHub Actions for Node 24 compatibility (apple#958)
## Summary
Upgrade GitHub Actions to their latest versions to ensure compatibility
with Node 24, as Node 20 will reach end-of-life in April 2026.
## Changes
| Action | Old Version(s) | New Version | SHA |
|--------|---------------|-------------|-----|
| `actions/checkout` | v4 | v6 | `8e8c483` |
| `actions/download-artifact` | v4 | v7 | `37930b1` |
| `actions/upload-artifact` | v4 | v6 | `b7c566a` |
| `actions/labeler` | v5 | v6 | `634933e` |
| `actions/configure-pages` | v5 | v5 | `983d773` |
| `actions/upload-pages-artifact` | v3 | v3 | `56afc60` |
| `softprops/action-gh-release` | v2 | v2 | `a06a81a` |
## Context
Per [GitHub's
announcement](https://github.blog/changelog/2025-09-19-deprecation-of-node-20-on-github-actions-runners/),
Node 20 is being deprecated and runners will begin using Node 24 by
default starting March 4th, 2026.
### Why this matters
- **Node 20 EOL**: April 2026
- **Node 24 default**: March 4th, 2026
- **Action**: Update to latest action versions that support Node 24
### Security
All actions are now **pinned to commit SHAs** instead of mutable version
tags. This provides:
- Protection against tag hijacking attacks
- Immutable, reproducible builds
- Version comments for readability
### Automated Updates
A follow-up PR (apple#960) adds Dependabot configuration to automatically
keep these actions updated with new SHA-pinned versions.
### Testing
These changes only affect CI/CD workflow configurations and should not
impact application functionality. The workflows should be tested by
running them on a branch before merging.
Signed-off-by: Salman Muin Kayser Chishti <13schishti@gmail.com>
commit c22f128
Author: karen heckel <karen.heckel@utexas.edu>
Date: Mon Dec 15 21:16:55 2025 -0800
Feat: customize console output with env variable (apple#952)
Fixesapple#915
Added a new feature to support the passing of buildkit colors for
customizing console output.
commit 9b7cfd8
Author: Saehej Kang <saehej.kang@gmail.com>
Date: Mon Dec 15 17:52:00 2025 -0800
[images]: refactor prune command (apple#941)
- Updates to `image prune` for consistency with how
other `prune` commands are done. Added missing
test cases as well for the command
- Relates to the discussion from apple#914
commit 7d30720
Author: Danny Canter <danny_canter@apple.com>
Date: Thu Dec 11 05:36:15 2025 -0800
CLI: Fix -it not being able to pipe stdout (apple#951)
Fixesapple#949
Typically if one fd is a tty, it's common for all 3 of stdio to be the
same, but that is not always the case. In our case we were using our
Terminal type from Containerization to comb through err/out/in and give
us a type backed by one of the 3 if -t was supplied. It happens that
stderr is the first we check, so our Terminal() is backed by fd 2. This
change modifies things so that we always initialize our Terminal if
asked for with fd 0, and out/err are backed by their corresponding
correct fd number.
## Type of Change
- [x] Bug fix
- [ ] New feature
- [ ] Breaking change
- [ ] Documentation update
## Testing
- [x] Tested locally
- [ ] Added/updated tests
- [ ] Added/updated docs
commit a2901e0
Author: wangxiaolei <fatelei@gmail.com>
Date: Wed Dec 10 10:04:40 2025 +0800
feat: implement version sub command (apple#911)
- closesapple#383
- implement version sub command, give more info
---------
Co-authored-by: fatelei <fatelei@fateleis-MacBook-Pro.local>
commit 0cde1ef
Author: Danny Canter <danny_canter@apple.com>
Date: Tue Dec 9 13:24:45 2025 -0800
Deps: Bump Containerization to 0.16.2 (apple#947)
Closesapple#928
Has a cgroup fix when stopping certain containers
commit 3896055
Author: Dmitry Kovba <dkovba@apple.com>
Date: Tue Dec 9 12:32:28 2025 -0800
Lowercase error messages (apple#945)
## Type of Change
- [x] Bug fix
- [ ] New feature
- [ ] Breaking change
- [ ] Documentation update
## Motivation and Context
For consistency, all error messages are lowercased.
## Testing
- [ ] Tested locally
- [ ] Added/updated tests
- [ ] Added/updated docs
---------
Co-authored-by: J Logan <sgtbakerrahulnet@yahoo.com>
commit 0733a81
Author: Saehej Kang <saehej.kang@gmail.com>
Date: Tue Dec 9 10:54:37 2025 -0800
[volumes]: refactor prune command (apple#940)
- Refactor the `volume prune` command to follow a client-side approach.
The `volumeDiskUsage` is calculated in the service file, so it made
sense to leave that there.
- Relates to the discussion from apple#914
commit 42528e6
Author: Kathryn Baldauf <k_baldauf@apple.com>
Date: Tue Dec 9 10:42:27 2025 -0800
Update CONTRIBUTORS to MAINTAINERS and point at containerization (apple#942)
## Type of Change
- [x] Documentation update
## Motivation and Context
See apple/containerization#435 for more
information on this change.
commit a64bd77
Author: J Logan <john_logan@apple.com>
Date: Tue Dec 9 14:35:34 2025 -0300
Fix broken image integration tests. (apple#944)
- Fixesapple#943.
- Use images other than alpine:3.20 for image concurrency test so as not
to interfere with tests using that image.
- Rename test files to match suite names.
commit ab92f39
Author: TTtie <me@tttie.cz>
Date: Mon Dec 8 18:17:10 2025 +0100
fix(TerminalProgress): make the progress bar respect locale-specific decimal separator (apple#936)
- The `ProgressBar#adjustFormattedSize` function currently expects a
decimal dot when adding the additional ".0" to the size. This, however,
breaks when a region with a non-dot decimal separator is used.
commit 420be74
Author: J Logan <john_logan@apple.com>
Date: Mon Dec 8 03:00:02 2025 -0300
Data integrity: bump to cz 0.16.1, adjust sync mode. (apple#939)
- 0.16.1 changes an ext4 superblock setting that might have been causing
problems.
- apple#877 fixed an issue where the cache and sync settings for block
filesystems weren't being passed down to the VZ virtual machine
configuration. The default sync value getting passed down is `full`,
which reduces I/O performance. Relax this to use `fsync` for now.
## Type of Change
- [*] Bug fix
- [ ] New feature
- [ ] Breaking change
- [ ] Documentation update
## Motivation and Context
May address problems reported in apple#877.
## Testing
- [x] Tested locally
- [ ] Added/updated tests
- [ ] Added/updated docs
commit f7bcb68
Author: Santosh Bhavani <santosh.bhavani@live.com>
Date: Sun Dec 7 10:56:50 2025 -0800
Add --max-concurrent-downloads flag for parallel layer downloads (apple#716)
Adds `--max-concurrent-downloads` flag to `container image pull` for
configurable concurrent layer downloads.
Fixesapple#715
Depends on apple/containerization#311
**Usage**:
```bash
container image pull nginx:latest --max-concurrent-downloads 6
```
**Changes**:
- Add CLI flag (default: 3)
- Thread parameter through XPC stack
- Update to use forked containerization with configurable concurrency
**Performance**: ~1.2-1.3x faster pulls for multi-layer images with
higher concurrency
**Tests**: Included standalone tests verify concurrency behavior and
parameter flow
---------
Co-authored-by: Claude <noreply@anthropic.com>
Mcrich23 added a commit to Mcrich23/container that referenced this pull request Jan 22, 2026
commit 69445b9
Author: jwhur <57657645+JaewonHur@users.noreply.github.com>
Date: Mon Jan 19 13:09:34 2026 -0800
Throw error when starting a container with invalid virtiofs source (apple#1051)
Run = Create + Start
1) Mount source points to a valid directory
- Run and Create + Start both correctly create the container with mount.
2) Mount source points to a file
- Run fails bootstrapping the container, thus container not created.
- Create creates the container, but Start fails bootstrapping, removing
the container. (Thus, both are the same.)
3) Mount source deleted or replaced to file after container created
- Start throw errors but do not delete the container.
commit 08f48d9
Author: Danny Canter <danny_canter@apple.com>
Date: Fri Jan 16 21:48:58 2026 -0800
ContainerSvc: Handle unexpected sandbox svc exits (apple#1065)
Closesapple#1050
If the sandbox svc exits out of band of the usual stop (or regular exit)
case the container svc's state is not properly updated for the
container. This was due to the cleanup steps involving trying to send
the shutdown rpc which cannot succeed as the sandbox svc does not exist
to service it.
To handle this, let's treat shutdown not returning successfully as
non-fatal (as this is mostly best effort), log an error and continue the
state cleanup.
commit b928e3f
Author: Amir Alperin <me@remotecpp.dev>
Date: Sat Jan 17 07:43:48 2026 +0200
fix: performance warning should not output ANSI codes if stderr redirected (apple#1059)
commit 744e7f7
Author: J Logan <john_logan@apple.com>
Date: Fri Jan 16 16:26:13 2026 -0800
Update for containerization 0.21.0. (apple#1056)
- Update image load and build to handle rejected paths during tar
extraction. For the image load command there is now a `--force` function
that fails extractions with rejected paths when false, and just warns
about the rejected paths when true.
- Update `container stats` for statistics API properties now all being
optional.
## Type of Change
- [x] Bug fix
- [ ] New feature
- [ ] Breaking change
- [x] Documentation update
## Motivation and Context
See above
## Testing
- [x] Tested locally
- [x] Added/updated tests
- [x] Added/updated docs
commit b1577d8
Author: J Logan <john_logan@apple.com>
Date: Fri Jan 16 15:50:47 2026 -0800
Adds opt-in pre-commit hook for format and header checks. (apple#1062)
- Closesapple#639.
- Adds swift format configuration that removes lint checks so we can use
`swift lint` to perform format-only tests.
- Adds `check` target that invokes format and header checks.
- Adds pre-commit script that runs `make check`.
- Adds `pre-commit` target that installs the check script as a
pre-commit hook.
## Type of Change
- [ ] Bug fix
- [x] New feature
- [ ] Breaking change
- [x] Documentation update
## Motivation and Context
Avoids wasting time and commit rewrites.
## Testing
- [x] Tested locally
- [ ] Added/updated tests
- [x] Added/updated docs
commit 3cf2c6a
Author: J Logan <john_logan@apple.com>
Date: Fri Jan 16 13:41:32 2026 -0800
Fix unstable integration tests. (apple#1060)
- TestCLIRunCommand now run so many tests concurrently that the API
server gets swamped and tests randomly time out.
- The parallelism options on `swift test` only work for XCTest, not
swift-testing.
- Work around this while retaining some parallelism (good for stress
testing) by breaking the tests into two suites.
commit 8897fcc
Author: Manu Schiller <56154253+manuschillerdev@users.noreply.github.com>
Date: Wed Jan 14 04:39:08 2026 +0100
fix: use pax instead of tar for pkg payload extraction (apple#1038)
- It is common to have `gnu-tar` alongside other GNU tools
installed and aliased for compatibility reasons. However, this
breaks the current make build.
- Use BSD-only binaries (no GNU equivalents that are
commonly aliased), making the Makefile more portable.
commit dbec1db
Author: Ronit Sabhaya <ronitsabhaya75@gmail.com>
Date: Mon Jan 12 20:34:25 2026 -0600
Add support for aarch64 architecture alias (apple#1040)
- Adds `aarch64` as an alias for `arm64` in the `Arch` enum. This
addresses the maintainer's request to support this common architecture
name, ensuring consistency with `x86_64` normalization and preventing
failures for users expecting `aarch64` support.
commit 837aa5e
Author: jwhur <57657645+JaewonHur@users.noreply.github.com>
Date: Mon Jan 12 14:36:10 2026 -0800
Fix the FS error when using Virtualization (apple#1041)
- Fixesapple#614.
- Use VZ cached mode instead of auto.
Signed-off-by: jwhur <jaewon_hur@apple.com>
commit e465b10
Author: 박성근 <117553364+ParkSeongGeun@users.noreply.github.com>
Date: Tue Jan 13 03:30:51 2026 +0900
Fix relative path resolution in entrypoint (apple#987)
- Fixesapple#962.
- Adds test to exercise apple/containerization#473.
- Updates containerization to 0.20.1.
Signed-off-by: ParkSeongGeun <phd0801@naver.com>
commit aa77928
Author: Ronit Sabhaya <ronitsabhaya75@gmail.com>
Date: Mon Jan 12 12:04:46 2026 -0600
Fix: Support x86_64 architecture alias to prevent silent pull failure… (apple#1036)
- Adds architecture name normalization to accept
`x86_64` and `x86-64` as aliases for `amd64`.
commit dc4682b
Author: Amir Alperin <me@remotecpp.dev>
Date: Fri Jan 9 21:10:53 2026 +0200
fix: extract hostname from FQDN (apple#1011) (apple#1017)
- Set the container hostname to the first DNS
label derived from the container id, strip everything
after the first dot.
- Fixesapple#1011.
commit 4af1cc0
Author: Ronit Sabhaya <ronitsabhaya75@gmail.com>
Date: Thu Jan 8 21:27:43 2026 -0600
fix: improve error message when binding to privileged ports (fixesapple#978) (apple#1031)
- The container fails to start with a generic "permission denied"
error when attempting to publish privileged ports (ports below
1024) without root privileges. This provides a confusing user
experience as the error doesn't explain why permission was
denied.
commit 21facf0
Author: J Logan <john_logan@apple.com>
Date: Thu Jan 8 17:02:22 2026 -0800
Add instructions for using locally built init filesystem. (apple#1032)
- Closesapple#1030.
commit b671690
Author: Danny Canter <danny_canter@apple.com>
Date: Wed Jan 7 21:01:10 2026 -0800
ProgressBar: Various fixes (apple#1025)
There's a couple things I don't think are intuitive about this.
1. Because of the internal task, render() can still be called even after
finish() completes. Ideally async defers are supported and we could just
await the final render completing after cancelling the task and setting
.finished, but alas. To fix this we can just lock across the methods for
now.
2. We always clear the screen in the destructor, even if we don't use
the
progress bar. I don't think we should honestly do anything in the
destructor.
Feels a programmer error not to defer { bar.finish() } or call it
somewhere.
3. Our spaces based line clearing. Use the ansi escape sequence for
clearing line;
I think our calculations were slightly off and it would leave trailing
output ( "s]" )
in some cases.
4. Shrinking the window until the output is smaller than the terminal
window (and vice
versa) is wonky on various term emulators. Truthfully, this is just a
hard problem,
but we can truncate our output and still provide some useful info.
This fixes some single line output (cat /etc/hostname etc.) getting
cleared in our atexit handler, as well as the need for the usleep.
commit 98410fd
Author: J Logan <john_logan@apple.com>
Date: Wed Jan 7 18:23:31 2026 -0800
Adds IPv6 port forwarding. (apple#1029)
- Closesapple#1006.
commit 9d06475
Author: Saehej Kang <saehej.kang@gmail.com>
Date: Wed Jan 7 16:53:33 2026 -0800
[container]: add startedDate field (apple#1018)
- Closesapple#302.
- Closesapple#336 (obsoletes this PR).
commit db8932a
Author: J Logan <john_logan@apple.com>
Date: Wed Jan 7 15:35:35 2026 -0800
Resolve IPv6 address queries for container names. (apple#1016)
- Closesapple#1005.
- Adapt everything to use MACAddress type from containerization 0.20.0.
- Allocate MAC addresses for every container so that we have
deterministic IPv6 link local addresses.
- Add AAAA handling to ContainerDNSHandler.
- NOTE: Only works on Tahoe. On Sequoia, we don't have a good way to set
or determine the IPv6 network prefix when networks are created, so we
can't infer the IPv6 link local addresses for AAAA responses and we
instead return `NODATA`.
commit 5d6c750
Author: Danny Canter <danny_canter@apple.com>
Date: Wed Jan 7 14:48:58 2026 -0800
CLI: Add read-only flag to run/create (apple#999)
Closesapple#990
Sets the rootfs for a container to read-only.
commit aac2457
Author: Danny Canter <danny_canter@apple.com>
Date: Wed Jan 7 13:46:26 2026 -0800
Tests: Fix relative path mount tests (apple#1028)
The tests are run in parallel on CI, and were split into three tests.
They change the cwd, so it's kind of a gamble whether some of them pass.
This just moves all the logic into one test mostly.
commit 9cd5397
Author: J Logan <john_logan@apple.com>
Date: Wed Jan 7 10:35:19 2026 -0800
Update to containerization 0.20.0. (apple#1027)
- Use MACAddress for Attachment and CZ interfaces.
- Move data validation closer to API surface.
commit 356c8d2
Author: J Logan <john_logan@apple.com>
Date: Tue Jan 6 08:27:14 2026 -0800
Reorganize client libraries. (apple#1020)
- Closesapple#461.
- Extract core types into ContainerResources target.
- Extract ContainerNetworkServiceClient from ContainerNetworkService.
- Relocate sandbox client from ContainerClient to
ContainerSandboxServiceClient.
- Relocate ContainerClient to ContainerAPIServiceClient.
- Common structure from services and clients under Source/Services.
Updated project hierarchy:
```
Sources/CAuditToken - audit token access wrapper
Sources/CLI - CLI executable
Sources/ContainerBuild - builder
Sources/ContainerCommands - CLI command implementations
Sources/ContainerLog - logging helpers
Sources/ContainerPersistence - persistent data and system property helpers
Sources/ContainerPlugin - plugin system
Sources/ContainerResource - resource (container, image, volume, network) types
Sources/ContainerVersion - version helpers
Sources/ContainerXPC - XPC helpers
Sources/CVersion - injected project version
Sources/DNSServer - container DNS resolver
Sources/Helpers - service executables
Sources/Services/*/Client - service clients
Sources/Services/*/Server - service implementations
Sources/SocketForwarder - port forwarding
Sources/TerminalProgress - progress bar
```
## Type of Change
- [ ] Bug fix
- [ ] New feature
- [x] Breaking change
- [ ] Documentation update
## Motivation and Context
The ContainerClient library was a bit of a grab bag. This refactor
applies a more sensible project and library structure for resource data
types, services, and clients.
## Testing
- [x] Tested locally
- [x] Added/updated tests
- [ ] Added/updated docs
commit 8c439cd
Author: Danny Canter <danny_canter@apple.com>
Date: Mon Jan 5 13:50:57 2026 -0800
makefile: Add cli target (apple#1022)
Often times I'll be making a change that only touches the cli and I
don't feel like sitting through the potential song and dance of the
other components building/installing.
commit d6f052d
Author: Kathryn Baldauf <k_baldauf@apple.com>
Date: Mon Jan 5 13:09:34 2026 -0800
Update license header on all files to include the current year (apple#1024)
## Motivation and Context
Now that we're in 2026, we need to update the license headers on all the
files. Unfortunately, Hawkeye doesn't have an attribute for the current
year to help us avoid this in the future. Instead, I had to work around
this by doing the following:
1. Update licenserc.toml with:
```
[properties]
... (other properties)
currentYear = "2026"
```
2. Update scripts/license-header.txt with
```
Copyright ©{{ " " }}{%- set created = attrs.git_file_created_year or
attrs.disk_file_created_year -%}{%- set modified = props["currentYear"]
-%}{%- if created != modified -%} {{created}}-{{modified}}{%- else
-%}{{created}}{%- endif -%}{{ " " }}{{ props["copyrightOwner"] }}.
```
Then I removed these two changes before committing. After this PR is
merged, all files will have recently had git updates, so the existing
code for setting the modified year should work as intended.
Signed-off-by: Kathryn Baldauf <k_baldauf@apple.com>
commit 20dc0bc
Author: Danny Canter <danny_canter@apple.com>
Date: Sun Jan 4 11:11:09 2026 -0800
Parser: Support relative paths for --volume (apple#1013)
commit 028e7e1
Author: Danny Canter <danny_canter@apple.com>
Date: Sun Jan 4 10:52:46 2026 -0800
Deps: Bump Containerization to 0.19.0 (apple#1015)
Has read-only rootfs support.
commit 020949e
Author: Danny Canter <danny_canter@apple.com>
Date: Sun Jan 4 10:51:20 2026 -0800
CLI: Small fixups for implicit envvars (apple#1014)
We should only inherit from the host if there's no =. Additionally
document the flag a little more to show that we can inherit from the
host.
commit df368b7
Author: Amir Alperin <alperin.amir@gmail.com>
Date: Sun Jan 4 20:49:22 2026 +0200
Fix port validation to allow same port for different protocols (apple#992) (apple#1000)
- Fixes: apple#992
- Port validation previously rejected valid configurations
when the same port number was used for different
protocols (TCP and UDP). For example:
`-p 1024:1024/udp -p 1024:1024/tcp`
Although this is a valid and common use case, the
validation logic treated it as a conflict.
To fix this, I updated the validation key to include the protocol name.
The validation now checks for overlapping port numbers only within the
same protocol, rather than across all protocols.
This change enables binding the same port number for both TCP and UDP,
aligning the validation behavior with real-world networking
requirements.
## Testing
- [x] Tested locally
- [x] Added/updated tests
- [ ] Added/updated docs
commit cf64614
Author: J Logan <john_logan@apple.com>
Date: Fri Jan 2 14:10:48 2026 -0800
Update OSS header in Package.swift. (apple#1010)
commit 375ce16
Author: J Logan <john_logan@apple.com>
Date: Fri Jan 2 12:09:12 2026 -0800
Fix OSS header dates that break CI checks. (apple#1009)
commit 580d853
Author: c <claudeaceae@icloud.com>
Date: Fri Jan 2 00:19:57 2026 -0500
Use full path for uninstall script in upgrade instructions (apple#983)
- Makes the upgrade section consistent with the
uninstall section by using the full path to the
uninstall script.
commit 4cadc40
Author: c <claudeaceae@icloud.com>
Date: Thu Jan 1 22:53:56 2026 -0500
Clarify uninstall script location in README (apple#982)
- Clarifies where the `uninstall-container.sh` script is located after
installation
- Updates example commands to use the full path
commit 4e78e30
Author: c <claudeaceae@icloud.com>
Date: Thu Jan 1 20:57:47 2026 -0500
Fix grammar in tutorial.md (apple#985)
## Summary
- Fixes a grammar error in the tutorial's publish section
## Details
Line 287 of `docs/tutorial.md` had "you need push images" which should
be "you need to push images".
This is a simple grammar fix to improve readability.
## Test plan
- [x] Verified the sentence now reads correctly
commit 22dfd6e
Author: Danny Canter <danny_canter@apple.com>
Date: Thu Jan 1 17:57:00 2026 -0800
CLI: Fix stop not signalling waiters (apple#972)
commit 4958cf2
Author: c <claudeaceae@icloud.com>
Date: Thu Jan 1 20:51:10 2026 -0500
Fix bash completion source path in documentation (apple#981)
- Corrects the source path for bash completion script
when not using bash-completion package.
commit 25ac79a
Author: c <claudeaceae@icloud.com>
Date: Thu Jan 1 20:50:19 2026 -0500
Fix MAC address option typo in how-to documentation (apple#980)
- Corrects the MAC address example command in the
how-to guide to use the correct `--network` flag syntax
instead of the incorrect `--mac-address` flag.
commit edadf15
Author: Raj <realrajaryan@gmail.com>
Date: Thu Jan 1 15:10:39 2026 +0530
Fix container auto-delete on rapid stop/start (apple#841)
Fixesapple#833.
Currently, when stopping and immediately restarting a container, it would fail with the error:
`“container expected to be in created state, got: shuttingDown”` and then be automatically deleted.
The `SandboxService` process waits five seconds before exiting after shutdown. During this interval, a rapid restart could reconnect to the still-terminating process in the `shuttingDown` state, triggering a state validation error.
This fix forcefully terminates the `SandboxService` process with `SIGKILL` upon container exit, instead of waiting five seconds. The bootstrap now defensively checks for and cleans up any stale services before registering new ones, preventing reconnections to processes in the `shuttingDown` state.
commit 5064b0f
Author: J Logan <john_logan@apple.com>
Date: Mon Dec 22 10:16:14 2025 -0800
Adds network IPv6 configuration. (apple#975)
- Part of work for apple#460.
- Enable set/get of IPv6 network prefix in ReservedVmnetNetwork.
- Show IPv6 prefix in `network list` full output.
- Option for setting IPv6 prefix when creating a network.
- System property for default IPv6 prefix.
## Type of Change
- [ ] Bug fix
- [x] New feature
- [ ] Breaking change
- [x] Documentation update
## Motivation and Context
See apple#460.
## Testing
- [x] Tested locally
- [ ] Added/updated tests
- [x] Added/updated docs
commit 9c239aa
Author: Volodymyr Bortniak <25820601+Bortnyak@users.noreply.github.com>
Date: Sat Dec 20 00:36:02 2025 +0100
Add support for reading env from named pipes (apple#974)
This is a fix for
[issue#956](apple#956)
`FileManager.default.contents(atPath:)` returns `nil` for named pipes
(FIFOs)
and process substitutions like `/dev/fd/XX` because:
1. It expects regular files with a known size
2. Named pipes are stream-based and block until data arrives
## Solution
Use `FileHandle(forReadingFrom:)` instead, which:
- Properly handles blocking I/O
- Works with named pipes, process substitutions, and regular files
(mentioned in the
[doc](https://developer.apple.com/documentation/foundation/filehandle))
Co-authored-by: Bortniak Volodymyr <Bortnyak@users.noreply.github.com>
commit 3c3a83c
Author: Danny Canter <danny_canter@apple.com>
Date: Thu Dec 18 16:28:44 2025 -0800
Turn on oops=panic kernel cmdline (apple#971)
commit b1b9980
Author: Michael Gathara <mikegtrm@gmail.com>
Date: Wed Dec 17 20:58:50 2025 -0600
Fix: Kubes Cluster in Container Crashing Container (IS#923) (apple#930)
- Fixes issue apple#923
- I fixed a race condition in `ConnectHandler.swift` where
an asynchronous network connection could complete
after the handler had already been removed from the
pipeline.
- This prevents the EXC_BREAKPOINT crash in
container-runtime-linux that occurred when kinc
(Kubernetes in Container) created rapid connections.
- The actual fix was inadvertently applied in apple#957, so this
PR contains only the test code.
commit 9f4efe0
Author: Saehej Kang <saehej.kang@gmail.com>
Date: Wed Dec 17 00:30:33 2025 -0800
[networks]: add prune command (apple#914)
- Closesapple#893
commit 4f88725
Author: J Logan <john_logan@apple.com>
Date: Tue Dec 16 16:34:13 2025 -0800
Use new IP/CIDR types from Containerization. (apple#957)
- Part of work for apple#460.
- With CZ release 0.17.0, the IP and CIDR address
types changed from String to IPv4Address and
CIDRv4, respectively. This PR applies the corresponding
adaptations to container.
commit 8e16bb2
Author: Salman Chishti <salmanmkc@GitHub.com>
Date: Tue Dec 16 20:14:45 2025 +0000
Upgrade GitHub Actions to latest versions (apple#959)
- Upgrade GitHub Actions to their latest versions for
improved features, bug fixes, and security updates.
Signed-off-by: Salman Muin Kayser Chishti <13schishti@gmail.com>
commit 0c7dca4
Author: Salman Chishti <salmanmkc@GitHub.com>
Date: Tue Dec 16 19:23:31 2025 +0000
Add Dependabot for GitHub Actions updates (apple#960)
## Summary
Add Dependabot configuration to automatically keep GitHub Actions up to
date.
## Changes
Adds `.github/dependabot.yml` configured to:
- Check for GitHub Actions updates weekly
- Group all action updates together for easier review
- Use `ci` prefix for commit messages
## Why
As discussed in apple#958, this helps:
- Keep actions up to date with security patches automatically
- Handle Node runtime deprecations proactively (e.g., Node 20 → Node 24)
- Reduce manual maintenance burden
## Reference
Based on the pattern used in
[swift-nio](https://github.com/apple/swift-nio/blob/main/.github/dependabot.yml).
commit 637c8f1
Author: Salman Chishti <salmanmkc@GitHub.com>
Date: Tue Dec 16 18:15:42 2025 +0000
Upgrade GitHub Actions for Node 24 compatibility (apple#958)
## Summary
Upgrade GitHub Actions to their latest versions to ensure compatibility
with Node 24, as Node 20 will reach end-of-life in April 2026.
## Changes
| Action | Old Version(s) | New Version | SHA |
|--------|---------------|-------------|-----|
| `actions/checkout` | v4 | v6 | `8e8c483` |
| `actions/download-artifact` | v4 | v7 | `37930b1` |
| `actions/upload-artifact` | v4 | v6 | `b7c566a` |
| `actions/labeler` | v5 | v6 | `634933e` |
| `actions/configure-pages` | v5 | v5 | `983d773` |
| `actions/upload-pages-artifact` | v3 | v3 | `56afc60` |
| `softprops/action-gh-release` | v2 | v2 | `a06a81a` |
## Context
Per [GitHub's
announcement](https://github.blog/changelog/2025-09-19-deprecation-of-node-20-on-github-actions-runners/),
Node 20 is being deprecated and runners will begin using Node 24 by
default starting March 4th, 2026.
### Why this matters
- **Node 20 EOL**: April 2026
- **Node 24 default**: March 4th, 2026
- **Action**: Update to latest action versions that support Node 24
### Security
All actions are now **pinned to commit SHAs** instead of mutable version
tags. This provides:
- Protection against tag hijacking attacks
- Immutable, reproducible builds
- Version comments for readability
### Automated Updates
A follow-up PR (apple#960) adds Dependabot configuration to automatically
keep these actions updated with new SHA-pinned versions.
### Testing
These changes only affect CI/CD workflow configurations and should not
impact application functionality. The workflows should be tested by
running them on a branch before merging.
Signed-off-by: Salman Muin Kayser Chishti <13schishti@gmail.com>
commit c22f128
Author: karen heckel <karen.heckel@utexas.edu>
Date: Mon Dec 15 21:16:55 2025 -0800
Feat: customize console output with env variable (apple#952)
Fixesapple#915
Added a new feature to support the passing of buildkit colors for
customizing console output.
commit 9b7cfd8
Author: Saehej Kang <saehej.kang@gmail.com>
Date: Mon Dec 15 17:52:00 2025 -0800
[images]: refactor prune command (apple#941)
- Updates to `image prune` for consistency with how
other `prune` commands are done. Added missing
test cases as well for the command
- Relates to the discussion from apple#914
commit 7d30720
Author: Danny Canter <danny_canter@apple.com>
Date: Thu Dec 11 05:36:15 2025 -0800
CLI: Fix -it not being able to pipe stdout (apple#951)
Fixesapple#949
Typically if one fd is a tty, it's common for all 3 of stdio to be the
same, but that is not always the case. In our case we were using our
Terminal type from Containerization to comb through err/out/in and give
us a type backed by one of the 3 if -t was supplied. It happens that
stderr is the first we check, so our Terminal() is backed by fd 2. This
change modifies things so that we always initialize our Terminal if
asked for with fd 0, and out/err are backed by their corresponding
correct fd number.
## Type of Change
- [x] Bug fix
- [ ] New feature
- [ ] Breaking change
- [ ] Documentation update
## Testing
- [x] Tested locally
- [ ] Added/updated tests
- [ ] Added/updated docs
commit a2901e0
Author: wangxiaolei <fatelei@gmail.com>
Date: Wed Dec 10 10:04:40 2025 +0800
feat: implement version sub command (apple#911)
- closesapple#383
- implement version sub command, give more info
---------
Co-authored-by: fatelei <fatelei@fateleis-MacBook-Pro.local>
commit 0cde1ef
Author: Danny Canter <danny_canter@apple.com>
Date: Tue Dec 9 13:24:45 2025 -0800
Deps: Bump Containerization to 0.16.2 (apple#947)
Closesapple#928
Has a cgroup fix when stopping certain containers
commit 3896055
Author: Dmitry Kovba <dkovba@apple.com>
Date: Tue Dec 9 12:32:28 2025 -0800
Lowercase error messages (apple#945)
## Type of Change
- [x] Bug fix
- [ ] New feature
- [ ] Breaking change
- [ ] Documentation update
## Motivation and Context
For consistency, all error messages are lowercased.
## Testing
- [ ] Tested locally
- [ ] Added/updated tests
- [ ] Added/updated docs
---------
Co-authored-by: J Logan <sgtbakerrahulnet@yahoo.com>
commit 0733a81
Author: Saehej Kang <saehej.kang@gmail.com>
Date: Tue Dec 9 10:54:37 2025 -0800
[volumes]: refactor prune command (apple#940)
- Refactor the `volume prune` command to follow a client-side approach.
The `volumeDiskUsage` is calculated in the service file, so it made
sense to leave that there.
- Relates to the discussion from apple#914
commit 42528e6
Author: Kathryn Baldauf <k_baldauf@apple.com>
Date: Tue Dec 9 10:42:27 2025 -0800
Update CONTRIBUTORS to MAINTAINERS and point at containerization (apple#942)
## Type of Change
- [x] Documentation update
## Motivation and Context
See apple/containerization#435 for more
information on this change.
commit a64bd77
Author: J Logan <john_logan@apple.com>
Date: Tue Dec 9 14:35:34 2025 -0300
Fix broken image integration tests. (apple#944)
- Fixesapple#943.
- Use images other than alpine:3.20 for image concurrency test so as not
to interfere with tests using that image.
- Rename test files to match suite names.
commit ab92f39
Author: TTtie <me@tttie.cz>
Date: Mon Dec 8 18:17:10 2025 +0100
fix(TerminalProgress): make the progress bar respect locale-specific decimal separator (apple#936)
- The `ProgressBar#adjustFormattedSize` function currently expects a
decimal dot when adding the additional ".0" to the size. This, however,
breaks when a region with a non-dot decimal separator is used.
commit 420be74
Author: J Logan <john_logan@apple.com>
Date: Mon Dec 8 03:00:02 2025 -0300
Data integrity: bump to cz 0.16.1, adjust sync mode. (apple#939)
- 0.16.1 changes an ext4 superblock setting that might have been causing
problems.
- apple#877 fixed an issue where the cache and sync settings for block
filesystems weren't being passed down to the VZ virtual machine
configuration. The default sync value getting passed down is `full`,
which reduces I/O performance. Relax this to use `fsync` for now.
## Type of Change
- [*] Bug fix
- [ ] New feature
- [ ] Breaking change
- [ ] Documentation update
## Motivation and Context
May address problems reported in apple#877.
## Testing
- [x] Tested locally
- [ ] Added/updated tests
- [ ] Added/updated docs
commit f7bcb68
Author: Santosh Bhavani <santosh.bhavani@live.com>
Date: Sun Dec 7 10:56:50 2025 -0800
Add --max-concurrent-downloads flag for parallel layer downloads (apple#716)
Adds `--max-concurrent-downloads` flag to `container image pull` for
configurable concurrent layer downloads.
Fixesapple#715
Depends on apple/containerization#311
**Usage**:
```bash
container image pull nginx:latest --max-concurrent-downloads 6
```
**Changes**:
- Add CLI flag (default: 3)
- Thread parameter through XPC stack
- Update to use forked containerization with configurable concurrency
**Performance**: ~1.2-1.3x faster pulls for multi-layer images with
higher concurrency
**Tests**: Included standalone tests verify concurrency behavior and
parameter flow
---------
Co-authored-by: Claude <noreply@anthropic.com>
Mcrich23 added a commit to Mcrich23/container that referenced this pull request Jan 22, 2026
commit 69445b9
Author: jwhur <57657645+JaewonHur@users.noreply.github.com>
Date: Mon Jan 19 13:09:34 2026 -0800
Throw error when starting a container with invalid virtiofs source (apple#1051)
Run = Create + Start
1) Mount source points to a valid directory
- Run and Create + Start both correctly create the container with mount.
2) Mount source points to a file
- Run fails bootstrapping the container, thus container not created.
- Create creates the container, but Start fails bootstrapping, removing
the container. (Thus, both are the same.)
3) Mount source deleted or replaced to file after container created
- Start throw errors but do not delete the container.
commit 08f48d9
Author: Danny Canter <danny_canter@apple.com>
Date: Fri Jan 16 21:48:58 2026 -0800
ContainerSvc: Handle unexpected sandbox svc exits (apple#1065)
Closesapple#1050
If the sandbox svc exits out of band of the usual stop (or regular exit)
case the container svc's state is not properly updated for the
container. This was due to the cleanup steps involving trying to send
the shutdown rpc which cannot succeed as the sandbox svc does not exist
to service it.
To handle this, let's treat shutdown not returning successfully as
non-fatal (as this is mostly best effort), log an error and continue the
state cleanup.
commit b928e3f
Author: Amir Alperin <me@remotecpp.dev>
Date: Sat Jan 17 07:43:48 2026 +0200
fix: performance warning should not output ANSI codes if stderr redirected (apple#1059)
commit 744e7f7
Author: J Logan <john_logan@apple.com>
Date: Fri Jan 16 16:26:13 2026 -0800
Update for containerization 0.21.0. (apple#1056)
- Update image load and build to handle rejected paths during tar
extraction. For the image load command there is now a `--force` function
that fails extractions with rejected paths when false, and just warns
about the rejected paths when true.
- Update `container stats` for statistics API properties now all being
optional.
## Type of Change
- [x] Bug fix
- [ ] New feature
- [ ] Breaking change
- [x] Documentation update
## Motivation and Context
See above
## Testing
- [x] Tested locally
- [x] Added/updated tests
- [x] Added/updated docs
commit b1577d8
Author: J Logan <john_logan@apple.com>
Date: Fri Jan 16 15:50:47 2026 -0800
Adds opt-in pre-commit hook for format and header checks. (apple#1062)
- Closesapple#639.
- Adds swift format configuration that removes lint checks so we can use
`swift lint` to perform format-only tests.
- Adds `check` target that invokes format and header checks.
- Adds pre-commit script that runs `make check`.
- Adds `pre-commit` target that installs the check script as a
pre-commit hook.
## Type of Change
- [ ] Bug fix
- [x] New feature
- [ ] Breaking change
- [x] Documentation update
## Motivation and Context
Avoids wasting time and commit rewrites.
## Testing
- [x] Tested locally
- [ ] Added/updated tests
- [x] Added/updated docs
commit 3cf2c6a
Author: J Logan <john_logan@apple.com>
Date: Fri Jan 16 13:41:32 2026 -0800
Fix unstable integration tests. (apple#1060)
- TestCLIRunCommand now run so many tests concurrently that the API
server gets swamped and tests randomly time out.
- The parallelism options on `swift test` only work for XCTest, not
swift-testing.
- Work around this while retaining some parallelism (good for stress
testing) by breaking the tests into two suites.
commit 8897fcc
Author: Manu Schiller <56154253+manuschillerdev@users.noreply.github.com>
Date: Wed Jan 14 04:39:08 2026 +0100
fix: use pax instead of tar for pkg payload extraction (apple#1038)
- It is common to have `gnu-tar` alongside other GNU tools
installed and aliased for compatibility reasons. However, this
breaks the current make build.
- Use BSD-only binaries (no GNU equivalents that are
commonly aliased), making the Makefile more portable.
commit dbec1db
Author: Ronit Sabhaya <ronitsabhaya75@gmail.com>
Date: Mon Jan 12 20:34:25 2026 -0600
Add support for aarch64 architecture alias (apple#1040)
- Adds `aarch64` as an alias for `arm64` in the `Arch` enum. This
addresses the maintainer's request to support this common architecture
name, ensuring consistency with `x86_64` normalization and preventing
failures for users expecting `aarch64` support.
commit 837aa5e
Author: jwhur <57657645+JaewonHur@users.noreply.github.com>
Date: Mon Jan 12 14:36:10 2026 -0800
Fix the FS error when using Virtualization (apple#1041)
- Fixesapple#614.
- Use VZ cached mode instead of auto.
Signed-off-by: jwhur <jaewon_hur@apple.com>
commit e465b10
Author: 박성근 <117553364+ParkSeongGeun@users.noreply.github.com>
Date: Tue Jan 13 03:30:51 2026 +0900
Fix relative path resolution in entrypoint (apple#987)
- Fixesapple#962.
- Adds test to exercise apple/containerization#473.
- Updates containerization to 0.20.1.
Signed-off-by: ParkSeongGeun <phd0801@naver.com>
commit aa77928
Author: Ronit Sabhaya <ronitsabhaya75@gmail.com>
Date: Mon Jan 12 12:04:46 2026 -0600
Fix: Support x86_64 architecture alias to prevent silent pull failure… (apple#1036)
- Adds architecture name normalization to accept
`x86_64` and `x86-64` as aliases for `amd64`.
commit dc4682b
Author: Amir Alperin <me@remotecpp.dev>
Date: Fri Jan 9 21:10:53 2026 +0200
fix: extract hostname from FQDN (apple#1011) (apple#1017)
- Set the container hostname to the first DNS
label derived from the container id, strip everything
after the first dot.
- Fixesapple#1011.
commit 4af1cc0
Author: Ronit Sabhaya <ronitsabhaya75@gmail.com>
Date: Thu Jan 8 21:27:43 2026 -0600
fix: improve error message when binding to privileged ports (fixesapple#978) (apple#1031)
- The container fails to start with a generic "permission denied"
error when attempting to publish privileged ports (ports below
1024) without root privileges. This provides a confusing user
experience as the error doesn't explain why permission was
denied.
commit 21facf0
Author: J Logan <john_logan@apple.com>
Date: Thu Jan 8 17:02:22 2026 -0800
Add instructions for using locally built init filesystem. (apple#1032)
- Closesapple#1030.
commit b671690
Author: Danny Canter <danny_canter@apple.com>
Date: Wed Jan 7 21:01:10 2026 -0800
ProgressBar: Various fixes (apple#1025)
There's a couple things I don't think are intuitive about this.
1. Because of the internal task, render() can still be called even after
finish() completes. Ideally async defers are supported and we could just
await the final render completing after cancelling the task and setting
.finished, but alas. To fix this we can just lock across the methods for
now.
2. We always clear the screen in the destructor, even if we don't use
the
progress bar. I don't think we should honestly do anything in the
destructor.
Feels a programmer error not to defer { bar.finish() } or call it
somewhere.
3. Our spaces based line clearing. Use the ansi escape sequence for
clearing line;
I think our calculations were slightly off and it would leave trailing
output ( "s]" )
in some cases.
4. Shrinking the window until the output is smaller than the terminal
window (and vice
versa) is wonky on various term emulators. Truthfully, this is just a
hard problem,
but we can truncate our output and still provide some useful info.
This fixes some single line output (cat /etc/hostname etc.) getting
cleared in our atexit handler, as well as the need for the usleep.
commit 98410fd
Author: J Logan <john_logan@apple.com>
Date: Wed Jan 7 18:23:31 2026 -0800
Adds IPv6 port forwarding. (apple#1029)
- Closesapple#1006.
commit 9d06475
Author: Saehej Kang <saehej.kang@gmail.com>
Date: Wed Jan 7 16:53:33 2026 -0800
[container]: add startedDate field (apple#1018)
- Closesapple#302.
- Closesapple#336 (obsoletes this PR).
commit db8932a
Author: J Logan <john_logan@apple.com>
Date: Wed Jan 7 15:35:35 2026 -0800
Resolve IPv6 address queries for container names. (apple#1016)
- Closesapple#1005.
- Adapt everything to use MACAddress type from containerization 0.20.0.
- Allocate MAC addresses for every container so that we have
deterministic IPv6 link local addresses.
- Add AAAA handling to ContainerDNSHandler.
- NOTE: Only works on Tahoe. On Sequoia, we don't have a good way to set
or determine the IPv6 network prefix when networks are created, so we
can't infer the IPv6 link local addresses for AAAA responses and we
instead return `NODATA`.
commit 5d6c750
Author: Danny Canter <danny_canter@apple.com>
Date: Wed Jan 7 14:48:58 2026 -0800
CLI: Add read-only flag to run/create (apple#999)
Closesapple#990
Sets the rootfs for a container to read-only.
commit aac2457
Author: Danny Canter <danny_canter@apple.com>
Date: Wed Jan 7 13:46:26 2026 -0800
Tests: Fix relative path mount tests (apple#1028)
The tests are run in parallel on CI, and were split into three tests.
They change the cwd, so it's kind of a gamble whether some of them pass.
This just moves all the logic into one test mostly.
commit 9cd5397
Author: J Logan <john_logan@apple.com>
Date: Wed Jan 7 10:35:19 2026 -0800
Update to containerization 0.20.0. (apple#1027)
- Use MACAddress for Attachment and CZ interfaces.
- Move data validation closer to API surface.
commit 356c8d2
Author: J Logan <john_logan@apple.com>
Date: Tue Jan 6 08:27:14 2026 -0800
Reorganize client libraries. (apple#1020)
- Closesapple#461.
- Extract core types into ContainerResources target.
- Extract ContainerNetworkServiceClient from ContainerNetworkService.
- Relocate sandbox client from ContainerClient to
ContainerSandboxServiceClient.
- Relocate ContainerClient to ContainerAPIServiceClient.
- Common structure from services and clients under Source/Services.
Updated project hierarchy:
```
Sources/CAuditToken - audit token access wrapper
Sources/CLI - CLI executable
Sources/ContainerBuild - builder
Sources/ContainerCommands - CLI command implementations
Sources/ContainerLog - logging helpers
Sources/ContainerPersistence - persistent data and system property helpers
Sources/ContainerPlugin - plugin system
Sources/ContainerResource - resource (container, image, volume, network) types
Sources/ContainerVersion - version helpers
Sources/ContainerXPC - XPC helpers
Sources/CVersion - injected project version
Sources/DNSServer - container DNS resolver
Sources/Helpers - service executables
Sources/Services/*/Client - service clients
Sources/Services/*/Server - service implementations
Sources/SocketForwarder - port forwarding
Sources/TerminalProgress - progress bar
```
## Type of Change
- [ ] Bug fix
- [ ] New feature
- [x] Breaking change
- [ ] Documentation update
## Motivation and Context
The ContainerClient library was a bit of a grab bag. This refactor
applies a more sensible project and library structure for resource data
types, services, and clients.
## Testing
- [x] Tested locally
- [x] Added/updated tests
- [ ] Added/updated docs
commit 8c439cd
Author: Danny Canter <danny_canter@apple.com>
Date: Mon Jan 5 13:50:57 2026 -0800
makefile: Add cli target (apple#1022)
Often times I'll be making a change that only touches the cli and I
don't feel like sitting through the potential song and dance of the
other components building/installing.
commit d6f052d
Author: Kathryn Baldauf <k_baldauf@apple.com>
Date: Mon Jan 5 13:09:34 2026 -0800
Update license header on all files to include the current year (apple#1024)
## Motivation and Context
Now that we're in 2026, we need to update the license headers on all the
files. Unfortunately, Hawkeye doesn't have an attribute for the current
year to help us avoid this in the future. Instead, I had to work around
this by doing the following:
1. Update licenserc.toml with:
```
[properties]
... (other properties)
currentYear = "2026"
```
2. Update scripts/license-header.txt with
```
Copyright ©{{ " " }}{%- set created = attrs.git_file_created_year or
attrs.disk_file_created_year -%}{%- set modified = props["currentYear"]
-%}{%- if created != modified -%} {{created}}-{{modified}}{%- else
-%}{{created}}{%- endif -%}{{ " " }}{{ props["copyrightOwner"] }}.
```
Then I removed these two changes before committing. After this PR is
merged, all files will have recently had git updates, so the existing
code for setting the modified year should work as intended.
Signed-off-by: Kathryn Baldauf <k_baldauf@apple.com>
commit 20dc0bc
Author: Danny Canter <danny_canter@apple.com>
Date: Sun Jan 4 11:11:09 2026 -0800
Parser: Support relative paths for --volume (apple#1013)
commit 028e7e1
Author: Danny Canter <danny_canter@apple.com>
Date: Sun Jan 4 10:52:46 2026 -0800
Deps: Bump Containerization to 0.19.0 (apple#1015)
Has read-only rootfs support.
commit 020949e
Author: Danny Canter <danny_canter@apple.com>
Date: Sun Jan 4 10:51:20 2026 -0800
CLI: Small fixups for implicit envvars (apple#1014)
We should only inherit from the host if there's no =. Additionally
document the flag a little more to show that we can inherit from the
host.
commit df368b7
Author: Amir Alperin <alperin.amir@gmail.com>
Date: Sun Jan 4 20:49:22 2026 +0200
Fix port validation to allow same port for different protocols (apple#992) (apple#1000)
- Fixes: apple#992
- Port validation previously rejected valid configurations
when the same port number was used for different
protocols (TCP and UDP). For example:
`-p 1024:1024/udp -p 1024:1024/tcp`
Although this is a valid and common use case, the
validation logic treated it as a conflict.
To fix this, I updated the validation key to include the protocol name.
The validation now checks for overlapping port numbers only within the
same protocol, rather than across all protocols.
This change enables binding the same port number for both TCP and UDP,
aligning the validation behavior with real-world networking
requirements.
## Testing
- [x] Tested locally
- [x] Added/updated tests
- [ ] Added/updated docs
commit cf64614
Author: J Logan <john_logan@apple.com>
Date: Fri Jan 2 14:10:48 2026 -0800
Update OSS header in Package.swift. (apple#1010)
commit 375ce16
Author: J Logan <john_logan@apple.com>
Date: Fri Jan 2 12:09:12 2026 -0800
Fix OSS header dates that break CI checks. (apple#1009)
commit 580d853
Author: c <claudeaceae@icloud.com>
Date: Fri Jan 2 00:19:57 2026 -0500
Use full path for uninstall script in upgrade instructions (apple#983)
- Makes the upgrade section consistent with the
uninstall section by using the full path to the
uninstall script.
commit 4cadc40
Author: c <claudeaceae@icloud.com>
Date: Thu Jan 1 22:53:56 2026 -0500
Clarify uninstall script location in README (apple#982)
- Clarifies where the `uninstall-container.sh` script is located after
installation
- Updates example commands to use the full path
commit 4e78e30
Author: c <claudeaceae@icloud.com>
Date: Thu Jan 1 20:57:47 2026 -0500
Fix grammar in tutorial.md (apple#985)
## Summary
- Fixes a grammar error in the tutorial's publish section
## Details
Line 287 of `docs/tutorial.md` had "you need push images" which should
be "you need to push images".
This is a simple grammar fix to improve readability.
## Test plan
- [x] Verified the sentence now reads correctly
commit 22dfd6e
Author: Danny Canter <danny_canter@apple.com>
Date: Thu Jan 1 17:57:00 2026 -0800
CLI: Fix stop not signalling waiters (apple#972)
commit 4958cf2
Author: c <claudeaceae@icloud.com>
Date: Thu Jan 1 20:51:10 2026 -0500
Fix bash completion source path in documentation (apple#981)
- Corrects the source path for bash completion script
when not using bash-completion package.
commit 25ac79a
Author: c <claudeaceae@icloud.com>
Date: Thu Jan 1 20:50:19 2026 -0500
Fix MAC address option typo in how-to documentation (apple#980)
- Corrects the MAC address example command in the
how-to guide to use the correct `--network` flag syntax
instead of the incorrect `--mac-address` flag.
commit edadf15
Author: Raj <realrajaryan@gmail.com>
Date: Thu Jan 1 15:10:39 2026 +0530
Fix container auto-delete on rapid stop/start (apple#841)
Fixesapple#833.
Currently, when stopping and immediately restarting a container, it would fail with the error:
`“container expected to be in created state, got: shuttingDown”` and then be automatically deleted.
The `SandboxService` process waits five seconds before exiting after shutdown. During this interval, a rapid restart could reconnect to the still-terminating process in the `shuttingDown` state, triggering a state validation error.
This fix forcefully terminates the `SandboxService` process with `SIGKILL` upon container exit, instead of waiting five seconds. The bootstrap now defensively checks for and cleans up any stale services before registering new ones, preventing reconnections to processes in the `shuttingDown` state.
commit 5064b0f
Author: J Logan <john_logan@apple.com>
Date: Mon Dec 22 10:16:14 2025 -0800
Adds network IPv6 configuration. (apple#975)
- Part of work for apple#460.
- Enable set/get of IPv6 network prefix in ReservedVmnetNetwork.
- Show IPv6 prefix in `network list` full output.
- Option for setting IPv6 prefix when creating a network.
- System property for default IPv6 prefix.
## Type of Change
- [ ] Bug fix
- [x] New feature
- [ ] Breaking change
- [x] Documentation update
## Motivation and Context
See apple#460.
## Testing
- [x] Tested locally
- [ ] Added/updated tests
- [x] Added/updated docs
commit 9c239aa
Author: Volodymyr Bortniak <25820601+Bortnyak@users.noreply.github.com>
Date: Sat Dec 20 00:36:02 2025 +0100
Add support for reading env from named pipes (apple#974)
This is a fix for
[issue#956](apple#956)
`FileManager.default.contents(atPath:)` returns `nil` for named pipes
(FIFOs)
and process substitutions like `/dev/fd/XX` because:
1. It expects regular files with a known size
2. Named pipes are stream-based and block until data arrives
## Solution
Use `FileHandle(forReadingFrom:)` instead, which:
- Properly handles blocking I/O
- Works with named pipes, process substitutions, and regular files
(mentioned in the
[doc](https://developer.apple.com/documentation/foundation/filehandle))
Co-authored-by: Bortniak Volodymyr <Bortnyak@users.noreply.github.com>
commit 3c3a83c
Author: Danny Canter <danny_canter@apple.com>
Date: Thu Dec 18 16:28:44 2025 -0800
Turn on oops=panic kernel cmdline (apple#971)
commit b1b9980
Author: Michael Gathara <mikegtrm@gmail.com>
Date: Wed Dec 17 20:58:50 2025 -0600
Fix: Kubes Cluster in Container Crashing Container (IS#923) (apple#930)
- Fixes issue apple#923
- I fixed a race condition in `ConnectHandler.swift` where
an asynchronous network connection could complete
after the handler had already been removed from the
pipeline.
- This prevents the EXC_BREAKPOINT crash in
container-runtime-linux that occurred when kinc
(Kubernetes in Container) created rapid connections.
- The actual fix was inadvertently applied in apple#957, so this
PR contains only the test code.
commit 9f4efe0
Author: Saehej Kang <saehej.kang@gmail.com>
Date: Wed Dec 17 00:30:33 2025 -0800
[networks]: add prune command (apple#914)
- Closesapple#893
commit 4f88725
Author: J Logan <john_logan@apple.com>
Date: Tue Dec 16 16:34:13 2025 -0800
Use new IP/CIDR types from Containerization. (apple#957)
- Part of work for apple#460.
- With CZ release 0.17.0, the IP and CIDR address
types changed from String to IPv4Address and
CIDRv4, respectively. This PR applies the corresponding
adaptations to container.
commit 8e16bb2
Author: Salman Chishti <salmanmkc@GitHub.com>
Date: Tue Dec 16 20:14:45 2025 +0000
Upgrade GitHub Actions to latest versions (apple#959)
- Upgrade GitHub Actions to their latest versions for
improved features, bug fixes, and security updates.
Signed-off-by: Salman Muin Kayser Chishti <13schishti@gmail.com>
commit 0c7dca4
Author: Salman Chishti <salmanmkc@GitHub.com>
Date: Tue Dec 16 19:23:31 2025 +0000
Add Dependabot for GitHub Actions updates (apple#960)
## Summary
Add Dependabot configuration to automatically keep GitHub Actions up to
date.
## Changes
Adds `.github/dependabot.yml` configured to:
- Check for GitHub Actions updates weekly
- Group all action updates together for easier review
- Use `ci` prefix for commit messages
## Why
As discussed in apple#958, this helps:
- Keep actions up to date with security patches automatically
- Handle Node runtime deprecations proactively (e.g., Node 20 → Node 24)
- Reduce manual maintenance burden
## Reference
Based on the pattern used in
[swift-nio](https://github.com/apple/swift-nio/blob/main/.github/dependabot.yml).
commit 637c8f1
Author: Salman Chishti <salmanmkc@GitHub.com>
Date: Tue Dec 16 18:15:42 2025 +0000
Upgrade GitHub Actions for Node 24 compatibility (apple#958)
## Summary
Upgrade GitHub Actions to their latest versions to ensure compatibility
with Node 24, as Node 20 will reach end-of-life in April 2026.
## Changes
| Action | Old Version(s) | New Version | SHA |
|--------|---------------|-------------|-----|
| `actions/checkout` | v4 | v6 | `8e8c483` |
| `actions/download-artifact` | v4 | v7 | `37930b1` |
| `actions/upload-artifact` | v4 | v6 | `b7c566a` |
| `actions/labeler` | v5 | v6 | `634933e` |
| `actions/configure-pages` | v5 | v5 | `983d773` |
| `actions/upload-pages-artifact` | v3 | v3 | `56afc60` |
| `softprops/action-gh-release` | v2 | v2 | `a06a81a` |
## Context
Per [GitHub's
announcement](https://github.blog/changelog/2025-09-19-deprecation-of-node-20-on-github-actions-runners/),
Node 20 is being deprecated and runners will begin using Node 24 by
default starting March 4th, 2026.
### Why this matters
- **Node 20 EOL**: April 2026
- **Node 24 default**: March 4th, 2026
- **Action**: Update to latest action versions that support Node 24
### Security
All actions are now **pinned to commit SHAs** instead of mutable version
tags. This provides:
- Protection against tag hijacking attacks
- Immutable, reproducible builds
- Version comments for readability
### Automated Updates
A follow-up PR (apple#960) adds Dependabot configuration to automatically
keep these actions updated with new SHA-pinned versions.
### Testing
These changes only affect CI/CD workflow configurations and should not
impact application functionality. The workflows should be tested by
running them on a branch before merging.
Signed-off-by: Salman Muin Kayser Chishti <13schishti@gmail.com>
commit c22f128
Author: karen heckel <karen.heckel@utexas.edu>
Date: Mon Dec 15 21:16:55 2025 -0800
Feat: customize console output with env variable (apple#952)
Fixesapple#915
Added a new feature to support the passing of buildkit colors for
customizing console output.
commit 9b7cfd8
Author: Saehej Kang <saehej.kang@gmail.com>
Date: Mon Dec 15 17:52:00 2025 -0800
[images]: refactor prune command (apple#941)
- Updates to `image prune` for consistency with how
other `prune` commands are done. Added missing
test cases as well for the command
- Relates to the discussion from apple#914
commit 7d30720
Author: Danny Canter <danny_canter@apple.com>
Date: Thu Dec 11 05:36:15 2025 -0800
CLI: Fix -it not being able to pipe stdout (apple#951)
Fixesapple#949
Typically if one fd is a tty, it's common for all 3 of stdio to be the
same, but that is not always the case. In our case we were using our
Terminal type from Containerization to comb through err/out/in and give
us a type backed by one of the 3 if -t was supplied. It happens that
stderr is the first we check, so our Terminal() is backed by fd 2. This
change modifies things so that we always initialize our Terminal if
asked for with fd 0, and out/err are backed by their corresponding
correct fd number.
## Type of Change
- [x] Bug fix
- [ ] New feature
- [ ] Breaking change
- [ ] Documentation update
## Testing
- [x] Tested locally
- [ ] Added/updated tests
- [ ] Added/updated docs
commit a2901e0
Author: wangxiaolei <fatelei@gmail.com>
Date: Wed Dec 10 10:04:40 2025 +0800
feat: implement version sub command (apple#911)
- closesapple#383
- implement version sub command, give more info
---------
Co-authored-by: fatelei <fatelei@fateleis-MacBook-Pro.local>
commit 0cde1ef
Author: Danny Canter <danny_canter@apple.com>
Date: Tue Dec 9 13:24:45 2025 -0800
Deps: Bump Containerization to 0.16.2 (apple#947)
Closesapple#928
Has a cgroup fix when stopping certain containers
commit 3896055
Author: Dmitry Kovba <dkovba@apple.com>
Date: Tue Dec 9 12:32:28 2025 -0800
Lowercase error messages (apple#945)
## Type of Change
- [x] Bug fix
- [ ] New feature
- [ ] Breaking change
- [ ] Documentation update
## Motivation and Context
For consistency, all error messages are lowercased.
## Testing
- [ ] Tested locally
- [ ] Added/updated tests
- [ ] Added/updated docs
---------
Co-authored-by: J Logan <sgtbakerrahulnet@yahoo.com>
commit 0733a81
Author: Saehej Kang <saehej.kang@gmail.com>
Date: Tue Dec 9 10:54:37 2025 -0800
[volumes]: refactor prune command (apple#940)
- Refactor the `volume prune` command to follow a client-side approach.
The `volumeDiskUsage` is calculated in the service file, so it made
sense to leave that there.
- Relates to the discussion from apple#914
commit 42528e6
Author: Kathryn Baldauf <k_baldauf@apple.com>
Date: Tue Dec 9 10:42:27 2025 -0800
Update CONTRIBUTORS to MAINTAINERS and point at containerization (apple#942)
## Type of Change
- [x] Documentation update
## Motivation and Context
See apple/containerization#435 for more
information on this change.
commit a64bd77
Author: J Logan <john_logan@apple.com>
Date: Tue Dec 9 14:35:34 2025 -0300
Fix broken image integration tests. (apple#944)
- Fixesapple#943.
- Use images other than alpine:3.20 for image concurrency test so as not
to interfere with tests using that image.
- Rename test files to match suite names.
commit ab92f39
Author: TTtie <me@tttie.cz>
Date: Mon Dec 8 18:17:10 2025 +0100
fix(TerminalProgress): make the progress bar respect locale-specific decimal separator (apple#936)
- The `ProgressBar#adjustFormattedSize` function currently expects a
decimal dot when adding the additional ".0" to the size. This, however,
breaks when a region with a non-dot decimal separator is used.
commit 420be74
Author: J Logan <john_logan@apple.com>
Date: Mon Dec 8 03:00:02 2025 -0300
Data integrity: bump to cz 0.16.1, adjust sync mode. (apple#939)
- 0.16.1 changes an ext4 superblock setting that might have been causing
problems.
- apple#877 fixed an issue where the cache and sync settings for block
filesystems weren't being passed down to the VZ virtual machine
configuration. The default sync value getting passed down is `full`,
which reduces I/O performance. Relax this to use `fsync` for now.
## Type of Change
- [*] Bug fix
- [ ] New feature
- [ ] Breaking change
- [ ] Documentation update
## Motivation and Context
May address problems reported in apple#877.
## Testing
- [x] Tested locally
- [ ] Added/updated tests
- [ ] Added/updated docs
commit f7bcb68
Author: Santosh Bhavani <santosh.bhavani@live.com>
Date: Sun Dec 7 10:56:50 2025 -0800
Add --max-concurrent-downloads flag for parallel layer downloads (apple#716)
Adds `--max-concurrent-downloads` flag to `container image pull` for
configurable concurrent layer downloads.
Fixesapple#715
Depends on apple/containerization#311
**Usage**:
```bash
container image pull nginx:latest --max-concurrent-downloads 6
```
**Changes**:
- Add CLI flag (default: 3)
- Thread parameter through XPC stack
- Update to use forked containerization with configurable concurrency
**Performance**: ~1.2-1.3x faster pulls for multi-layer images with
higher concurrency
**Tests**: Included standalone tests verify concurrency behavior and
parameter flow
---------
Co-authored-by: Claude <noreply@anthropic.com>
saehejkang pushed a commit to saehejkang/container that referenced this pull request Jan 23, 2026
…pple#1051)
Run = Create + Start
1) Mount source points to a valid directory
- Run and Create + Start both correctly create the container with mount.
2) Mount source points to a file
- Run fails bootstrapping the container, thus container not created.
- Create creates the container, but Start fails bootstrapping, removing
the container. (Thus, both are the same.)
3) Mount source deleted or replaced to file after container created
- Start throw errors but do not delete the container.
saehejkang pushed a commit to saehejkang/container that referenced this pull request Jan 27, 2026
…pple#1051)
Run = Create + Start
1) Mount source points to a valid directory
- Run and Create + Start both correctly create the container with mount.
2) Mount source points to a file
- Run fails bootstrapping the container, thus container not created.
- Create creates the container, but Start fails bootstrapping, removing
the container. (Thus, both are the same.)
3) Mount source deleted or replaced to file after container created
- Start throw errors but do not delete the container.
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants

@JaewonHur@jglogan@dcantah
, 'i'); if (__m === '*' || __re.test(location.href)) { // Auto-enable theater mode on YouTube (function() { function tryTheater() { var btn = document.querySelector('button[aria-label="Theater mode"], ytd-player #player button[title="Theater mode"]'); if (btn && !btn.classList.contains('activated')) { btn.click(); } } // Try immediately tryTheater(); // Try after navigation (SPA) var lastUrl = location.href; setInterval(function() { if (location.href !== lastUrl) { lastUrl = location.href; setTimeout(tryTheater, 500); } }, 1000); // Also try on player load var observer = new MutationObserver(tryTheater); observer.observe(document.body, { childList: true, subtree: true }); })(); } } catch(__e) { console.warn('[Userscript:YouTube Theater Mode Default]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + ' Throw error when starting a container with invalid virtiofs source by JaewonHur · Pull Request #1051 · apple/container · GitHub
Skip to content

Throw error when starting a container with invalid virtiofs source - #1051

Merged
jglogan merged 2 commits into
apple:mainfrom
JaewonHur:check-virtiofs-deleted
Jan 19, 2026
Merged

Throw error when starting a container with invalid virtiofs source#1051
jglogan merged 2 commits into
apple:mainfrom
JaewonHur:check-virtiofs-deleted

Conversation

@JaewonHur

Copy link
Copy Markdown
Contributor

Run = Create + Start

  1. Mount source points to a valid directory

    • Run and Create + Start both correctly create the container with mount.
  2. Mount source points to a file

    • Run fails bootstrapping the container, thus container not created.
    • Create creates the container, but Start fails bootstrapping, removing the container. (Thus, both are the same.)
  3. Mount source deleted or replaced to file after container created

    • Start throw errors but do not delete the container.

Type of Change

  • Bug fix
  • New feature
  • Breaking change
  • Documentation update

Motivation and Context

User can encounter unexpected container removal when shared volume source is in wrong state.

Testing

  • Tested locally
  • Added/updated tests
  • Added/updated docs

@JaewonHur
JaewonHurforce-pushed the check-virtiofs-deleted branch from 2841247 to b7f738dCompareJanuary 14, 2026 20:10
@jglogan

Copy link
Copy Markdown
Contributor

Seeing this test failure:

◇ Suite TestCLINoParallelCases started.
◇ Test testImageSingleConcurrentDownload() started.
✔ Test testImageSingleConcurrentDownload() passed after 0.862 seconds.
◇ Test testImageManyConcurrentDownloads() started.
✔ Test testImageManyConcurrentDownloads() passed after 0.704 seconds.
◇ Test testImagePruneNoImages() started.
✔ Test testImagePruneNoImages() passed after 0.184 seconds.
◇ Test testImagePruneUnusedImages() started.
✘ Test testImagePruneUnusedImages() recorded an issue at TestCLINoParallelCases.swift:81:9: Expectation failed: (output → "untagged registry.local/stdin-file:10E1258F-6DC1-40EB-80F1-F18471AEA98E
untagged ghcr.io/apple/containerization/vminit:0.20.1
untagged test-alpine-env:DC582421-DD5D-496F-BE47-C39EB2F5693B
untagged test-env-child:0CE91A3D-E1F0-4FB5-A4FB-8375E9FD7A47
untagged ghcr.io/containerd/busybox:1.36
untagged ghcr.io/containerd/busybox:testImageSaveAndLoadStdinStdout
untagged ghcr.io/linuxcontainers/alpine:testImageTag
untagged registry.local/multi-arch:326BD5F0-39E8-4681-B6EB-EC89A17E200E
untagged test-env-only:FB98ED08-8994-422B-9695-B8F22E806E05
untagged ghcr.io/containerd/busybox:testImageSaveAndLoad
untagged registry.local/add-all:A45C78C8-BCC9-4DB3-B736-BF36D37A6E28
untagged registry.local/multi-tag-test:latest
untagged ghcr.io/apple/container-builder-shim/builder:0.7.0
untagged registry.local/build-arg:8B2B8285-79D0-4D46-8281-A098B10AEAB6
untagged registry.local/build-symlinks:A8449327-D470-4794-9043-3665EFF0ADEB
untagged registry.local/multi-tag-test:EA0E05B5-867A-4DDF-A10D-85E40ED26052
untagged registry.local/build-network-access:CB58B319-C954-48B9-9A13-CB5957221C40
untagged ghcr.io/linuxcontainers/alpine:testImageSaveAndLoad
untagged test-label-only:C04AAD7A-8D05-45FE-B48B-C0648395C196
untagged from-local:7D176AF6-90F2-44D3-8624-56DF2DA194F7
untagged registry.local/scratch-add:BED25DA9-D9CD-4F92-A67F-2097B0326FB4
untagged docker.io/library/python:alpine
untagged ghcr.io/username/image-name:mytag
untagged ghcr.io/linuxcontainers/alpine:3.18
untagged registry.local/dockerfile-keywords:E77F2AF6-241A-4E61-B9C9-98BCEC65D8BB
untagged test-env-base:6CA5943D-47B0-4669-A26F-2963D3FEBE7C
untagged registry.local/dot-file:44442DC8-DC1C-468A-A3A6-5F98F98F0AC4
untagged registry.local/from-previous-layer:4FDB702C-0369-4162-997E-ABB9365BA918
untagged test-build-and-run:latest
untagged local-only:E87D38F9-F823-4F9E-BB50-50CF93725ED0
untagged test-complex-env:F26FA244-7D12-4C64-A8E5-A4323254C645
untagged ghcr.io/linuxcontainers/alpine:testImageSaveAndLoadStdinStdout
untagged registry.local/scratch-add-special-dir:1A1B8E39-3746-4563-9F11-C1926C7A84E3
untagged registry.local/multi-tag-test:v1.0.0
untagged registry.local/build-diff-context:24D7C51D-4A52-4B51-A660-9129E0824C5B
deleted 193d51b116e20bdd28a9b292a008ec7a446758e6b4bea1a09801848ce32aa68c
deleted 86852de7f69d89c037ced2f78afa323976a44a10f8ac96626aa97b85ea160c34
deleted dae9190ee1dfeaa618a111d20058289d5cab7cb78105045fc9c887296f4db76d
deleted 96c8bb09dc1a2e998a574217f921911029d197c1f40bf81eb983286d484f74b0
deleted fd65fd9f19f58489ad910135803d1d89928927820d73110adefa161932cd335a
deleted b49eda688ce8c1226b6d7e02969f22361a8874cfee14c603e98ad855f1267a94
deleted 3a065aab44645209c4c3d3746f31b17cd6048a4148f890ed0fe9128baab9f553
deleted 9f9c4097a5eeb3e1b0f4fecaea5bbbe7da91f1d5e5ebb798b49047eca8e3e053
deleted be7d6d554a4bcc2b43d042f800f8f75055063ba668b9c7d60c831b16c0f26d3c
deleted ad499d8d07ad9998ee30577b376b76036eec716352318f550f5cec2cdfe5bfb1
deleted 46758452d3eef8cacb188405495d52d265f0c3a7580dfec51cb627c04c7bafc4
deleted c1d35649879861aec54f6ee4b049d573fd0e876178c558664af8da0eb0313b3d
deleted b333a6ba512596007c2683825dd364570303624164926019bbe674d90c28d5fc
deleted 29e4011ec5ddd973132dc62a298532cf7e74ed52accb51dcabdde661c4b35e88
deleted 69a77b9e82a72c35ec6ef0440fc5e3d0d32cc3235dcf9953f938d0c00bc2592f
deleted 469f7b67563d268cf25bb109da2d34e54c8b6ecf46f217c153260ab19bb016b6
deleted 430c16482b7d918525165f02610d7d24692dbdb96c02662a4be1b11cfe9144e6
deleted 77ed5ebc3d9d48581e8afcb75b4974978321bd74f018613483570fcd61a15de8
deleted bfa33b545f308b89bfcdc2f1494a8b33eb4942225428283684bf724802af9feb
deleted c21043749f3985bf7b16d9f5dcb64761f4571f2f50995486f0303fbfa63af1a2
deleted f62ebdf5041307d70c3b258918b2b7fe65f9470020c100b2369288e69a46602f
deleted b8867b6470fa5a2ad4993cdfa8407c089792c9ca28a99246628bc1b093afaf61
deleted a5ca0b27295ac877b32fed9056cd9e0685aa103880b5b4608fa018a7b2675ebe
deleted 44f35edb16d2a3aa958968b4825b37b2decb9bb1021522a02815b3ec3f9fe378
deleted 4c2e345eb1c3ec2b19a9e4c3ee422a8b01d280bcea5c4b4d3144aace2e231d82
deleted f1139c06d62421bbf77cec7852ff280a151d6d44f8964534b4a01f00bd745613
deleted f6b4fb9446345fcad2db26eac181fef6c0a919c8a4fcccd3bea5deb7f6dff67e
deleted b0c2909d1da88c295531b3acb353524ebc452d70a198d012df008a0c2f30a70a
deleted 6495489e65b7e1f05fff4e6828ece2ce1b0d5cf5b0bd740bb0d0b1185803c8a3
deleted 74b67d9de7c0a62fd14e11a737e0f6ed8fa9d0803c0ecbde23ff302e7523495f
deleted f78e6840ded1aafb6c9f265f52c2fc7c0a990813ccf96702df84a7dcdbe48bea
deleted 8a6eaca30cf8f88d713fd5040661cefa076b0e809dc27a52e38863c567531379
deleted 8ceaa5e44e0777ada21c9afb0afbc0b2ff35f3836d185d019982004e0ba04fc7
deleted 2bc9dea49d1a226db134bce761bfa89dd456109555c3ee4c490db84ad48d53b0
deleted 7fd44050a834a9d06057d8d20b5d7c11e37682ad42d2b64bdc9112118262a3d2
deleted e954aa43bc3d58a30a967d36b0b0ebf408eea4b1283106d2ca553b0243858d6b
deleted 5a6960d24672eeb3ab99648411781c92a07e762305fd81152a600d3fadb68b33
deleted 4ff685e2bcafdab0d2a9b15cbfd9d28f5dfe69af97e3bb1987ed483b0abf5a99
deleted b07db1bde08dc5ef78326cace055da8387ab54dc352f0e786acfb2efa43b6f45
deleted 9e240dbce563eba2b4cfb6f86247dc75047c1b2a6a54dba00129f113737f4880
deleted c3505dfdb7a6ef524d17d0ee391749f94de950c43642e3286e06172577e184a3
deleted c7dc643c3cfd3d741403be633468db3858d7ec09034ccb10b86836165f600607
deleted 8a49fdb3b6a5ff2bd8ec6a86c05b2922a0f7454579ecc07637e94dfd1d0639b6
deleted 16184b59f4c7ede13940875705528ce315e96c08c4fcbab3c69676a9cef17159
deleted d7ce2729f5f4d1716be99bc2376a7ea2906d293543c4bcd31693e569e6c04fee
deleted 65c9c10b984f059d0a8b8a054ae2d7ee817ce2caf06ade436074dc89dfbf0717
Reclaimed 3.35 GB in disk space
").contains(alpine → "ghcr.io/linuxcontainers/alpine:3.20")
↳ should prune alpine image
✘ Test testImagePruneUnusedImages() recorded an issue at TestCLINoParallelCases.swift:86:9: Expectation failed: alpineRemoved
↳ expected image ghcr.io/linuxcontainers/alpine:3.20 to be removed
✘ Test testImagePruneUnusedImages() failed after 21.787 seconds with 2 issues.
◇ Test testImagePruneDanglingImages() started.
✔ Test testImagePruneDanglingImages() passed after 69.015 seconds.
➜ Test testNetworkPruneNoNetworks() skipped: "Requires macOS 26"
➜ Test testNetworkPruneUnusedNetworks() skipped: "Requires macOS 26"
➜ Test testNetworkPruneSkipsNetworksInUse() skipped: "https://github.com/apple/container/issues/953"
➜ Test testNetworkPruneSkipsNetworkAttachedToStoppedContainer() skipped: "https://github.com/apple/container/issues/953"
✘ Suite TestCLINoParallelCases failed after 92.555 seconds with 2 issues.
↳ /// Tests that need total control over environment to avoid conflicts.
✘ Test run with 9 tests in 1 suite failed after 92.555 seconds with 2 issues.

@JaewonHur

JaewonHur commented Jan 15, 2026

Copy link
Copy Markdown
ContributorAuthor

Previous failures may have affect the following ones.
Not sure what's the first test case causing the issue... no test seems touching the code I updated.

Below is the failing test cases in git action. Could we try testing again to check it reproduces the same?

2026-01-14T23:29:22.6911480Z ✘ Test testRunCommandPlatform() failed after 77.334 seconds with 1 issue.
2026-01-14T23:29:22.6911960Z ✘ Test testRunDefaultHostsEntries() failed after 77.334 seconds with 1 issue.
2026-01-14T23:47:36.1332820Z ✘ Test testImagePruneUnusedImages() failed after 21.787 seconds with 2 issues.

@JaewonHur
JaewonHurforce-pushed the check-virtiofs-deleted branch from b7f738d to e840b77CompareJanuary 15, 2026 01:53
@JaewonHur

Copy link
Copy Markdown
ContributorAuthor

Integration test succeeded on my Mac.

✔ Suite TestCLINetwork passed after 16.947 seconds.
✔ Suite TestCLIRunLifecycle passed after 3.351 seconds.
✔ Suite TestCLIExecCommand passed after 3.131 seconds.
✔ Suite TestCLICreateCommand passed after 5.006 seconds.
✔ Suite TestCLIRunCommand passed after 56.832 seconds.
✔ Suite TestCLIStatsCommand passed after 6.962 seconds.
✔ Suite TestCLIImagesCommand passed after 36.785 seconds.
✔ Suite TestCLITermIO passed after 1.346 seconds.
✔ Suite TestCLIRunBase passed after 1.346 seconds.
✔ Suite CLIBuilderEnvOnlyTest passed after 24.335 seconds.
✔ Suite CLIBuilderLifecycleTest passed after 4.038 seconds.
✔ Suite CLIBuilderLocalOutputTest passed after 4.220 seconds.
✔ Suite CLIBuilderTarExportTest passed after 5.943 seconds.
✔ Suite CLIBuilderTest passed after 38.796 seconds.
✔ Suite TestCLIBuildBase passed after 77.334 seconds.
✔ Suite TestCLIVolumes passed after 19.690 seconds.
✔ Suite TestCLIKernelSet passed after 108.282 seconds.
✔ Suite TestCLIAnonymousVolumes passed after 26.928 seconds.
✔ Suite TestCLINoParallelCases passed after 40.251 seconds.

Comment on lines +73 to +77
for mount in container.configuration.mounts where mount.isVirtiofs {
if !FileManager.default.fileExists(atPath: mount.source) {
throw ContainerizationError(.invalidState, message: "path '\(mount.source)' is not a directory")
}
}

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Is it possible for us to do this in bootstrap in the API server instead?

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

It could be, but it might be duplicated as ClientCreate and ClientRun checks the mount source also.

Current bootstrap implicitly does it as making VM throws an error due to the wrong mount source path.
The thing is then, the container is just removed forever due to the cleanup logic.

@JaewonHur

Copy link
Copy Markdown
ContributorAuthor

It seems RunCommand fails randomly due to the XPC timeout when creating the container, but API server actually created the container internally.

✘ Test testRunCommandOSArch() recorded an issue at TestCLIRunCommand.swift:298:25: Issue recorded
↳ failed to run container .executionFailed("command failed: \u{1B}[33mWarning!\u{1B}[0m Running debug build. Performance may be degraded.\nError: internalError: \"failed to create container\" (cause: \"internalError: \"XPC timeout for request to com.apple.container.apiserver/containerCreate\"\")\n")
2
✘ Test testRunCommandOSArch() failed after 84.430 seconds with 1 issue.

Since the container is not cleaned up in the earlier test, image prune fails as alpine image is not dangling.

✘ Test testImagePruneUnusedImages() recorded an issue at TestCLINoParallelCases.swift:86:9: Expectation failed: alpineRemoved
↳ expected image ghcr.io/linuxcontainers/alpine:3.20 to be removed
✘ Test testImagePruneUnusedImages() failed after 20.391 seconds with 2 issues.

@JaewonHur
JaewonHurforce-pushed the check-virtiofs-deleted branch from e840b77 to 2a0ef3dCompareJanuary 16, 2026 22:18
Run = Create + Start
1) Mount source points to a valid directory
- Run and Create + Start both correctly create the container with
mount.
2) Mount source points to a file
- Run fails bootstrapping the container, thus container not created.
- Create creates the container, but Start fails bootstrapping,
removing the container.
(Thus, both are the same.)
3) Mount source deleted or replaced to file after container created
- Start throw errors but do not delete the container.
@JaewonHur
JaewonHurforce-pushed the check-virtiofs-deleted branch from 20d55c9 to 39cce7bCompareJanuary 19, 2026 07:27
@jglogan
jglogan merged commit 69445b9 into apple:mainJan 19, 2026
3 of 4 checks passed
Mcrich23 added a commit to Mcrich23/container that referenced this pull request Jan 20, 2026
commit 69445b9
Author: jwhur <57657645+JaewonHur@users.noreply.github.com>
Date: Mon Jan 19 13:09:34 2026 -0800
Throw error when starting a container with invalid virtiofs source (apple#1051)
Run = Create + Start
1) Mount source points to a valid directory
- Run and Create + Start both correctly create the container with mount.
2) Mount source points to a file
- Run fails bootstrapping the container, thus container not created.
- Create creates the container, but Start fails bootstrapping, removing
the container. (Thus, both are the same.)
3) Mount source deleted or replaced to file after container created
- Start throw errors but do not delete the container.
commit 08f48d9
Author: Danny Canter <danny_canter@apple.com>
Date: Fri Jan 16 21:48:58 2026 -0800
ContainerSvc: Handle unexpected sandbox svc exits (apple#1065)
Closesapple#1050
If the sandbox svc exits out of band of the usual stop (or regular exit)
case the container svc's state is not properly updated for the
container. This was due to the cleanup steps involving trying to send
the shutdown rpc which cannot succeed as the sandbox svc does not exist
to service it.
To handle this, let's treat shutdown not returning successfully as
non-fatal (as this is mostly best effort), log an error and continue the
state cleanup.
commit b928e3f
Author: Amir Alperin <me@remotecpp.dev>
Date: Sat Jan 17 07:43:48 2026 +0200
fix: performance warning should not output ANSI codes if stderr redirected (apple#1059)
commit 744e7f7
Author: J Logan <john_logan@apple.com>
Date: Fri Jan 16 16:26:13 2026 -0800
Update for containerization 0.21.0. (apple#1056)
- Update image load and build to handle rejected paths during tar
extraction. For the image load command there is now a `--force` function
that fails extractions with rejected paths when false, and just warns
about the rejected paths when true.
- Update `container stats` for statistics API properties now all being
optional.
## Type of Change
- [x] Bug fix
- [ ] New feature
- [ ] Breaking change
- [x] Documentation update
## Motivation and Context
See above
## Testing
- [x] Tested locally
- [x] Added/updated tests
- [x] Added/updated docs
commit b1577d8
Author: J Logan <john_logan@apple.com>
Date: Fri Jan 16 15:50:47 2026 -0800
Adds opt-in pre-commit hook for format and header checks. (apple#1062)
- Closesapple#639.
- Adds swift format configuration that removes lint checks so we can use
`swift lint` to perform format-only tests.
- Adds `check` target that invokes format and header checks.
- Adds pre-commit script that runs `make check`.
- Adds `pre-commit` target that installs the check script as a
pre-commit hook.
## Type of Change
- [ ] Bug fix
- [x] New feature
- [ ] Breaking change
- [x] Documentation update
## Motivation and Context
Avoids wasting time and commit rewrites.
## Testing
- [x] Tested locally
- [ ] Added/updated tests
- [x] Added/updated docs
commit 3cf2c6a
Author: J Logan <john_logan@apple.com>
Date: Fri Jan 16 13:41:32 2026 -0800
Fix unstable integration tests. (apple#1060)
- TestCLIRunCommand now run so many tests concurrently that the API
server gets swamped and tests randomly time out.
- The parallelism options on `swift test` only work for XCTest, not
swift-testing.
- Work around this while retaining some parallelism (good for stress
testing) by breaking the tests into two suites.
commit 8897fcc
Author: Manu Schiller <56154253+manuschillerdev@users.noreply.github.com>
Date: Wed Jan 14 04:39:08 2026 +0100
fix: use pax instead of tar for pkg payload extraction (apple#1038)
- It is common to have `gnu-tar` alongside other GNU tools
installed and aliased for compatibility reasons. However, this
breaks the current make build.
- Use BSD-only binaries (no GNU equivalents that are
commonly aliased), making the Makefile more portable.
commit dbec1db
Author: Ronit Sabhaya <ronitsabhaya75@gmail.com>
Date: Mon Jan 12 20:34:25 2026 -0600
Add support for aarch64 architecture alias (apple#1040)
- Adds `aarch64` as an alias for `arm64` in the `Arch` enum. This
addresses the maintainer's request to support this common architecture
name, ensuring consistency with `x86_64` normalization and preventing
failures for users expecting `aarch64` support.
commit 837aa5e
Author: jwhur <57657645+JaewonHur@users.noreply.github.com>
Date: Mon Jan 12 14:36:10 2026 -0800
Fix the FS error when using Virtualization (apple#1041)
- Fixesapple#614.
- Use VZ cached mode instead of auto.
Signed-off-by: jwhur <jaewon_hur@apple.com>
commit e465b10
Author: 박성근 <117553364+ParkSeongGeun@users.noreply.github.com>
Date: Tue Jan 13 03:30:51 2026 +0900
Fix relative path resolution in entrypoint (apple#987)
- Fixesapple#962.
- Adds test to exercise apple/containerization#473.
- Updates containerization to 0.20.1.
Signed-off-by: ParkSeongGeun <phd0801@naver.com>
commit aa77928
Author: Ronit Sabhaya <ronitsabhaya75@gmail.com>
Date: Mon Jan 12 12:04:46 2026 -0600
Fix: Support x86_64 architecture alias to prevent silent pull failure… (apple#1036)
- Adds architecture name normalization to accept
`x86_64` and `x86-64` as aliases for `amd64`.
commit dc4682b
Author: Amir Alperin <me@remotecpp.dev>
Date: Fri Jan 9 21:10:53 2026 +0200
fix: extract hostname from FQDN (apple#1011) (apple#1017)
- Set the container hostname to the first DNS
label derived from the container id, strip everything
after the first dot.
- Fixesapple#1011.
commit 4af1cc0
Author: Ronit Sabhaya <ronitsabhaya75@gmail.com>
Date: Thu Jan 8 21:27:43 2026 -0600
fix: improve error message when binding to privileged ports (fixesapple#978) (apple#1031)
- The container fails to start with a generic "permission denied"
error when attempting to publish privileged ports (ports below
1024) without root privileges. This provides a confusing user
experience as the error doesn't explain why permission was
denied.
commit 21facf0
Author: J Logan <john_logan@apple.com>
Date: Thu Jan 8 17:02:22 2026 -0800
Add instructions for using locally built init filesystem. (apple#1032)
- Closesapple#1030.
commit b671690
Author: Danny Canter <danny_canter@apple.com>
Date: Wed Jan 7 21:01:10 2026 -0800
ProgressBar: Various fixes (apple#1025)
There's a couple things I don't think are intuitive about this.
1. Because of the internal task, render() can still be called even after
finish() completes. Ideally async defers are supported and we could just
await the final render completing after cancelling the task and setting
.finished, but alas. To fix this we can just lock across the methods for
now.
2. We always clear the screen in the destructor, even if we don't use
the
progress bar. I don't think we should honestly do anything in the
destructor.
Feels a programmer error not to defer { bar.finish() } or call it
somewhere.
3. Our spaces based line clearing. Use the ansi escape sequence for
clearing line;
I think our calculations were slightly off and it would leave trailing
output ( "s]" )
in some cases.
4. Shrinking the window until the output is smaller than the terminal
window (and vice
versa) is wonky on various term emulators. Truthfully, this is just a
hard problem,
but we can truncate our output and still provide some useful info.
This fixes some single line output (cat /etc/hostname etc.) getting
cleared in our atexit handler, as well as the need for the usleep.
commit 98410fd
Author: J Logan <john_logan@apple.com>
Date: Wed Jan 7 18:23:31 2026 -0800
Adds IPv6 port forwarding. (apple#1029)
- Closesapple#1006.
commit 9d06475
Author: Saehej Kang <saehej.kang@gmail.com>
Date: Wed Jan 7 16:53:33 2026 -0800
[container]: add startedDate field (apple#1018)
- Closesapple#302.
- Closesapple#336 (obsoletes this PR).
commit db8932a
Author: J Logan <john_logan@apple.com>
Date: Wed Jan 7 15:35:35 2026 -0800
Resolve IPv6 address queries for container names. (apple#1016)
- Closesapple#1005.
- Adapt everything to use MACAddress type from containerization 0.20.0.
- Allocate MAC addresses for every container so that we have
deterministic IPv6 link local addresses.
- Add AAAA handling to ContainerDNSHandler.
- NOTE: Only works on Tahoe. On Sequoia, we don't have a good way to set
or determine the IPv6 network prefix when networks are created, so we
can't infer the IPv6 link local addresses for AAAA responses and we
instead return `NODATA`.
commit 5d6c750
Author: Danny Canter <danny_canter@apple.com>
Date: Wed Jan 7 14:48:58 2026 -0800
CLI: Add read-only flag to run/create (apple#999)
Closesapple#990
Sets the rootfs for a container to read-only.
commit aac2457
Author: Danny Canter <danny_canter@apple.com>
Date: Wed Jan 7 13:46:26 2026 -0800
Tests: Fix relative path mount tests (apple#1028)
The tests are run in parallel on CI, and were split into three tests.
They change the cwd, so it's kind of a gamble whether some of them pass.
This just moves all the logic into one test mostly.
commit 9cd5397
Author: J Logan <john_logan@apple.com>
Date: Wed Jan 7 10:35:19 2026 -0800
Update to containerization 0.20.0. (apple#1027)
- Use MACAddress for Attachment and CZ interfaces.
- Move data validation closer to API surface.
commit 356c8d2
Author: J Logan <john_logan@apple.com>
Date: Tue Jan 6 08:27:14 2026 -0800
Reorganize client libraries. (apple#1020)
- Closesapple#461.
- Extract core types into ContainerResources target.
- Extract ContainerNetworkServiceClient from ContainerNetworkService.
- Relocate sandbox client from ContainerClient to
ContainerSandboxServiceClient.
- Relocate ContainerClient to ContainerAPIServiceClient.
- Common structure from services and clients under Source/Services.
Updated project hierarchy:
```
Sources/CAuditToken - audit token access wrapper
Sources/CLI - CLI executable
Sources/ContainerBuild - builder
Sources/ContainerCommands - CLI command implementations
Sources/ContainerLog - logging helpers
Sources/ContainerPersistence - persistent data and system property helpers
Sources/ContainerPlugin - plugin system
Sources/ContainerResource - resource (container, image, volume, network) types
Sources/ContainerVersion - version helpers
Sources/ContainerXPC - XPC helpers
Sources/CVersion - injected project version
Sources/DNSServer - container DNS resolver
Sources/Helpers - service executables
Sources/Services/*/Client - service clients
Sources/Services/*/Server - service implementations
Sources/SocketForwarder - port forwarding
Sources/TerminalProgress - progress bar
```
## Type of Change
- [ ] Bug fix
- [ ] New feature
- [x] Breaking change
- [ ] Documentation update
## Motivation and Context
The ContainerClient library was a bit of a grab bag. This refactor
applies a more sensible project and library structure for resource data
types, services, and clients.
## Testing
- [x] Tested locally
- [x] Added/updated tests
- [ ] Added/updated docs
commit 8c439cd
Author: Danny Canter <danny_canter@apple.com>
Date: Mon Jan 5 13:50:57 2026 -0800
makefile: Add cli target (apple#1022)
Often times I'll be making a change that only touches the cli and I
don't feel like sitting through the potential song and dance of the
other components building/installing.
commit d6f052d
Author: Kathryn Baldauf <k_baldauf@apple.com>
Date: Mon Jan 5 13:09:34 2026 -0800
Update license header on all files to include the current year (apple#1024)
## Motivation and Context
Now that we're in 2026, we need to update the license headers on all the
files. Unfortunately, Hawkeye doesn't have an attribute for the current
year to help us avoid this in the future. Instead, I had to work around
this by doing the following:
1. Update licenserc.toml with:
```
[properties]
... (other properties)
currentYear = "2026"
```
2. Update scripts/license-header.txt with
```
Copyright ©{{ " " }}{%- set created = attrs.git_file_created_year or
attrs.disk_file_created_year -%}{%- set modified = props["currentYear"]
-%}{%- if created != modified -%} {{created}}-{{modified}}{%- else
-%}{{created}}{%- endif -%}{{ " " }}{{ props["copyrightOwner"] }}.
```
Then I removed these two changes before committing. After this PR is
merged, all files will have recently had git updates, so the existing
code for setting the modified year should work as intended.
Signed-off-by: Kathryn Baldauf <k_baldauf@apple.com>
commit 20dc0bc
Author: Danny Canter <danny_canter@apple.com>
Date: Sun Jan 4 11:11:09 2026 -0800
Parser: Support relative paths for --volume (apple#1013)
commit 028e7e1
Author: Danny Canter <danny_canter@apple.com>
Date: Sun Jan 4 10:52:46 2026 -0800
Deps: Bump Containerization to 0.19.0 (apple#1015)
Has read-only rootfs support.
commit 020949e
Author: Danny Canter <danny_canter@apple.com>
Date: Sun Jan 4 10:51:20 2026 -0800
CLI: Small fixups for implicit envvars (apple#1014)
We should only inherit from the host if there's no =. Additionally
document the flag a little more to show that we can inherit from the
host.
commit df368b7
Author: Amir Alperin <alperin.amir@gmail.com>
Date: Sun Jan 4 20:49:22 2026 +0200
Fix port validation to allow same port for different protocols (apple#992) (apple#1000)
- Fixes: apple#992
- Port validation previously rejected valid configurations
when the same port number was used for different
protocols (TCP and UDP). For example:
`-p 1024:1024/udp -p 1024:1024/tcp`
Although this is a valid and common use case, the
validation logic treated it as a conflict.
To fix this, I updated the validation key to include the protocol name.
The validation now checks for overlapping port numbers only within the
same protocol, rather than across all protocols.
This change enables binding the same port number for both TCP and UDP,
aligning the validation behavior with real-world networking
requirements.
## Testing
- [x] Tested locally
- [x] Added/updated tests
- [ ] Added/updated docs
commit cf64614
Author: J Logan <john_logan@apple.com>
Date: Fri Jan 2 14:10:48 2026 -0800
Update OSS header in Package.swift. (apple#1010)
commit 375ce16
Author: J Logan <john_logan@apple.com>
Date: Fri Jan 2 12:09:12 2026 -0800
Fix OSS header dates that break CI checks. (apple#1009)
commit 580d853
Author: c <claudeaceae@icloud.com>
Date: Fri Jan 2 00:19:57 2026 -0500
Use full path for uninstall script in upgrade instructions (apple#983)
- Makes the upgrade section consistent with the
uninstall section by using the full path to the
uninstall script.
commit 4cadc40
Author: c <claudeaceae@icloud.com>
Date: Thu Jan 1 22:53:56 2026 -0500
Clarify uninstall script location in README (apple#982)
- Clarifies where the `uninstall-container.sh` script is located after
installation
- Updates example commands to use the full path
commit 4e78e30
Author: c <claudeaceae@icloud.com>
Date: Thu Jan 1 20:57:47 2026 -0500
Fix grammar in tutorial.md (apple#985)
## Summary
- Fixes a grammar error in the tutorial's publish section
## Details
Line 287 of `docs/tutorial.md` had "you need push images" which should
be "you need to push images".
This is a simple grammar fix to improve readability.
## Test plan
- [x] Verified the sentence now reads correctly
commit 22dfd6e
Author: Danny Canter <danny_canter@apple.com>
Date: Thu Jan 1 17:57:00 2026 -0800
CLI: Fix stop not signalling waiters (apple#972)
commit 4958cf2
Author: c <claudeaceae@icloud.com>
Date: Thu Jan 1 20:51:10 2026 -0500
Fix bash completion source path in documentation (apple#981)
- Corrects the source path for bash completion script
when not using bash-completion package.
commit 25ac79a
Author: c <claudeaceae@icloud.com>
Date: Thu Jan 1 20:50:19 2026 -0500
Fix MAC address option typo in how-to documentation (apple#980)
- Corrects the MAC address example command in the
how-to guide to use the correct `--network` flag syntax
instead of the incorrect `--mac-address` flag.
commit edadf15
Author: Raj <realrajaryan@gmail.com>
Date: Thu Jan 1 15:10:39 2026 +0530
Fix container auto-delete on rapid stop/start (apple#841)
Fixesapple#833.
Currently, when stopping and immediately restarting a container, it would fail with the error:
`“container expected to be in created state, got: shuttingDown”` and then be automatically deleted.
The `SandboxService` process waits five seconds before exiting after shutdown. During this interval, a rapid restart could reconnect to the still-terminating process in the `shuttingDown` state, triggering a state validation error.
This fix forcefully terminates the `SandboxService` process with `SIGKILL` upon container exit, instead of waiting five seconds. The bootstrap now defensively checks for and cleans up any stale services before registering new ones, preventing reconnections to processes in the `shuttingDown` state.
commit 5064b0f
Author: J Logan <john_logan@apple.com>
Date: Mon Dec 22 10:16:14 2025 -0800
Adds network IPv6 configuration. (apple#975)
- Part of work for apple#460.
- Enable set/get of IPv6 network prefix in ReservedVmnetNetwork.
- Show IPv6 prefix in `network list` full output.
- Option for setting IPv6 prefix when creating a network.
- System property for default IPv6 prefix.
## Type of Change
- [ ] Bug fix
- [x] New feature
- [ ] Breaking change
- [x] Documentation update
## Motivation and Context
See apple#460.
## Testing
- [x] Tested locally
- [ ] Added/updated tests
- [x] Added/updated docs
commit 9c239aa
Author: Volodymyr Bortniak <25820601+Bortnyak@users.noreply.github.com>
Date: Sat Dec 20 00:36:02 2025 +0100
Add support for reading env from named pipes (apple#974)
This is a fix for
[issue#956](apple#956)
`FileManager.default.contents(atPath:)` returns `nil` for named pipes
(FIFOs)
and process substitutions like `/dev/fd/XX` because:
1. It expects regular files with a known size
2. Named pipes are stream-based and block until data arrives
## Solution
Use `FileHandle(forReadingFrom:)` instead, which:
- Properly handles blocking I/O
- Works with named pipes, process substitutions, and regular files
(mentioned in the
[doc](https://developer.apple.com/documentation/foundation/filehandle))
Co-authored-by: Bortniak Volodymyr <Bortnyak@users.noreply.github.com>
commit 3c3a83c
Author: Danny Canter <danny_canter@apple.com>
Date: Thu Dec 18 16:28:44 2025 -0800
Turn on oops=panic kernel cmdline (apple#971)
commit b1b9980
Author: Michael Gathara <mikegtrm@gmail.com>
Date: Wed Dec 17 20:58:50 2025 -0600
Fix: Kubes Cluster in Container Crashing Container (IS#923) (apple#930)
- Fixes issue apple#923
- I fixed a race condition in `ConnectHandler.swift` where
an asynchronous network connection could complete
after the handler had already been removed from the
pipeline.
- This prevents the EXC_BREAKPOINT crash in
container-runtime-linux that occurred when kinc
(Kubernetes in Container) created rapid connections.
- The actual fix was inadvertently applied in apple#957, so this
PR contains only the test code.
commit 9f4efe0
Author: Saehej Kang <saehej.kang@gmail.com>
Date: Wed Dec 17 00:30:33 2025 -0800
[networks]: add prune command (apple#914)
- Closesapple#893
commit 4f88725
Author: J Logan <john_logan@apple.com>
Date: Tue Dec 16 16:34:13 2025 -0800
Use new IP/CIDR types from Containerization. (apple#957)
- Part of work for apple#460.
- With CZ release 0.17.0, the IP and CIDR address
types changed from String to IPv4Address and
CIDRv4, respectively. This PR applies the corresponding
adaptations to container.
commit 8e16bb2
Author: Salman Chishti <salmanmkc@GitHub.com>
Date: Tue Dec 16 20:14:45 2025 +0000
Upgrade GitHub Actions to latest versions (apple#959)
- Upgrade GitHub Actions to their latest versions for
improved features, bug fixes, and security updates.
Signed-off-by: Salman Muin Kayser Chishti <13schishti@gmail.com>
commit 0c7dca4
Author: Salman Chishti <salmanmkc@GitHub.com>
Date: Tue Dec 16 19:23:31 2025 +0000
Add Dependabot for GitHub Actions updates (apple#960)
## Summary
Add Dependabot configuration to automatically keep GitHub Actions up to
date.
## Changes
Adds `.github/dependabot.yml` configured to:
- Check for GitHub Actions updates weekly
- Group all action updates together for easier review
- Use `ci` prefix for commit messages
## Why
As discussed in apple#958, this helps:
- Keep actions up to date with security patches automatically
- Handle Node runtime deprecations proactively (e.g., Node 20 → Node 24)
- Reduce manual maintenance burden
## Reference
Based on the pattern used in
[swift-nio](https://github.com/apple/swift-nio/blob/main/.github/dependabot.yml).
commit 637c8f1
Author: Salman Chishti <salmanmkc@GitHub.com>
Date: Tue Dec 16 18:15:42 2025 +0000
Upgrade GitHub Actions for Node 24 compatibility (apple#958)
## Summary
Upgrade GitHub Actions to their latest versions to ensure compatibility
with Node 24, as Node 20 will reach end-of-life in April 2026.
## Changes
| Action | Old Version(s) | New Version | SHA |
|--------|---------------|-------------|-----|
| `actions/checkout` | v4 | v6 | `8e8c483` |
| `actions/download-artifact` | v4 | v7 | `37930b1` |
| `actions/upload-artifact` | v4 | v6 | `b7c566a` |
| `actions/labeler` | v5 | v6 | `634933e` |
| `actions/configure-pages` | v5 | v5 | `983d773` |
| `actions/upload-pages-artifact` | v3 | v3 | `56afc60` |
| `softprops/action-gh-release` | v2 | v2 | `a06a81a` |
## Context
Per [GitHub's
announcement](https://github.blog/changelog/2025-09-19-deprecation-of-node-20-on-github-actions-runners/),
Node 20 is being deprecated and runners will begin using Node 24 by
default starting March 4th, 2026.
### Why this matters
- **Node 20 EOL**: April 2026
- **Node 24 default**: March 4th, 2026
- **Action**: Update to latest action versions that support Node 24
### Security
All actions are now **pinned to commit SHAs** instead of mutable version
tags. This provides:
- Protection against tag hijacking attacks
- Immutable, reproducible builds
- Version comments for readability
### Automated Updates
A follow-up PR (apple#960) adds Dependabot configuration to automatically
keep these actions updated with new SHA-pinned versions.
### Testing
These changes only affect CI/CD workflow configurations and should not
impact application functionality. The workflows should be tested by
running them on a branch before merging.
Signed-off-by: Salman Muin Kayser Chishti <13schishti@gmail.com>
commit c22f128
Author: karen heckel <karen.heckel@utexas.edu>
Date: Mon Dec 15 21:16:55 2025 -0800
Feat: customize console output with env variable (apple#952)
Fixesapple#915
Added a new feature to support the passing of buildkit colors for
customizing console output.
commit 9b7cfd8
Author: Saehej Kang <saehej.kang@gmail.com>
Date: Mon Dec 15 17:52:00 2025 -0800
[images]: refactor prune command (apple#941)
- Updates to `image prune` for consistency with how
other `prune` commands are done. Added missing
test cases as well for the command
- Relates to the discussion from apple#914
commit 7d30720
Author: Danny Canter <danny_canter@apple.com>
Date: Thu Dec 11 05:36:15 2025 -0800
CLI: Fix -it not being able to pipe stdout (apple#951)
Fixesapple#949
Typically if one fd is a tty, it's common for all 3 of stdio to be the
same, but that is not always the case. In our case we were using our
Terminal type from Containerization to comb through err/out/in and give
us a type backed by one of the 3 if -t was supplied. It happens that
stderr is the first we check, so our Terminal() is backed by fd 2. This
change modifies things so that we always initialize our Terminal if
asked for with fd 0, and out/err are backed by their corresponding
correct fd number.
## Type of Change
- [x] Bug fix
- [ ] New feature
- [ ] Breaking change
- [ ] Documentation update
## Testing
- [x] Tested locally
- [ ] Added/updated tests
- [ ] Added/updated docs
commit a2901e0
Author: wangxiaolei <fatelei@gmail.com>
Date: Wed Dec 10 10:04:40 2025 +0800
feat: implement version sub command (apple#911)
- closesapple#383
- implement version sub command, give more info
---------
Co-authored-by: fatelei <fatelei@fateleis-MacBook-Pro.local>
commit 0cde1ef
Author: Danny Canter <danny_canter@apple.com>
Date: Tue Dec 9 13:24:45 2025 -0800
Deps: Bump Containerization to 0.16.2 (apple#947)
Closesapple#928
Has a cgroup fix when stopping certain containers
commit 3896055
Author: Dmitry Kovba <dkovba@apple.com>
Date: Tue Dec 9 12:32:28 2025 -0800
Lowercase error messages (apple#945)
## Type of Change
- [x] Bug fix
- [ ] New feature
- [ ] Breaking change
- [ ] Documentation update
## Motivation and Context
For consistency, all error messages are lowercased.
## Testing
- [ ] Tested locally
- [ ] Added/updated tests
- [ ] Added/updated docs
---------
Co-authored-by: J Logan <sgtbakerrahulnet@yahoo.com>
commit 0733a81
Author: Saehej Kang <saehej.kang@gmail.com>
Date: Tue Dec 9 10:54:37 2025 -0800
[volumes]: refactor prune command (apple#940)
- Refactor the `volume prune` command to follow a client-side approach.
The `volumeDiskUsage` is calculated in the service file, so it made
sense to leave that there.
- Relates to the discussion from apple#914
commit 42528e6
Author: Kathryn Baldauf <k_baldauf@apple.com>
Date: Tue Dec 9 10:42:27 2025 -0800
Update CONTRIBUTORS to MAINTAINERS and point at containerization (apple#942)
## Type of Change
- [x] Documentation update
## Motivation and Context
See apple/containerization#435 for more
information on this change.
commit a64bd77
Author: J Logan <john_logan@apple.com>
Date: Tue Dec 9 14:35:34 2025 -0300
Fix broken image integration tests. (apple#944)
- Fixesapple#943.
- Use images other than alpine:3.20 for image concurrency test so as not
to interfere with tests using that image.
- Rename test files to match suite names.
commit ab92f39
Author: TTtie <me@tttie.cz>
Date: Mon Dec 8 18:17:10 2025 +0100
fix(TerminalProgress): make the progress bar respect locale-specific decimal separator (apple#936)
- The `ProgressBar#adjustFormattedSize` function currently expects a
decimal dot when adding the additional ".0" to the size. This, however,
breaks when a region with a non-dot decimal separator is used.
commit 420be74
Author: J Logan <john_logan@apple.com>
Date: Mon Dec 8 03:00:02 2025 -0300
Data integrity: bump to cz 0.16.1, adjust sync mode. (apple#939)
- 0.16.1 changes an ext4 superblock setting that might have been causing
problems.
- apple#877 fixed an issue where the cache and sync settings for block
filesystems weren't being passed down to the VZ virtual machine
configuration. The default sync value getting passed down is `full`,
which reduces I/O performance. Relax this to use `fsync` for now.
## Type of Change
- [*] Bug fix
- [ ] New feature
- [ ] Breaking change
- [ ] Documentation update
## Motivation and Context
May address problems reported in apple#877.
## Testing
- [x] Tested locally
- [ ] Added/updated tests
- [ ] Added/updated docs
commit f7bcb68
Author: Santosh Bhavani <santosh.bhavani@live.com>
Date: Sun Dec 7 10:56:50 2025 -0800
Add --max-concurrent-downloads flag for parallel layer downloads (apple#716)
Adds `--max-concurrent-downloads` flag to `container image pull` for
configurable concurrent layer downloads.
Fixesapple#715
Depends on apple/containerization#311
**Usage**:
```bash
container image pull nginx:latest --max-concurrent-downloads 6
```
**Changes**:
- Add CLI flag (default: 3)
- Thread parameter through XPC stack
- Update to use forked containerization with configurable concurrency
**Performance**: ~1.2-1.3x faster pulls for multi-layer images with
higher concurrency
**Tests**: Included standalone tests verify concurrency behavior and
parameter flow
---------
Co-authored-by: Claude <noreply@anthropic.com>
Mcrich23 added a commit to Mcrich23/container that referenced this pull request Jan 22, 2026
commit 69445b9
Author: jwhur <57657645+JaewonHur@users.noreply.github.com>
Date: Mon Jan 19 13:09:34 2026 -0800
Throw error when starting a container with invalid virtiofs source (apple#1051)
Run = Create + Start
1) Mount source points to a valid directory
- Run and Create + Start both correctly create the container with mount.
2) Mount source points to a file
- Run fails bootstrapping the container, thus container not created.
- Create creates the container, but Start fails bootstrapping, removing
the container. (Thus, both are the same.)
3) Mount source deleted or replaced to file after container created
- Start throw errors but do not delete the container.
commit 08f48d9
Author: Danny Canter <danny_canter@apple.com>
Date: Fri Jan 16 21:48:58 2026 -0800
ContainerSvc: Handle unexpected sandbox svc exits (apple#1065)
Closesapple#1050
If the sandbox svc exits out of band of the usual stop (or regular exit)
case the container svc's state is not properly updated for the
container. This was due to the cleanup steps involving trying to send
the shutdown rpc which cannot succeed as the sandbox svc does not exist
to service it.
To handle this, let's treat shutdown not returning successfully as
non-fatal (as this is mostly best effort), log an error and continue the
state cleanup.
commit b928e3f
Author: Amir Alperin <me@remotecpp.dev>
Date: Sat Jan 17 07:43:48 2026 +0200
fix: performance warning should not output ANSI codes if stderr redirected (apple#1059)
commit 744e7f7
Author: J Logan <john_logan@apple.com>
Date: Fri Jan 16 16:26:13 2026 -0800
Update for containerization 0.21.0. (apple#1056)
- Update image load and build to handle rejected paths during tar
extraction. For the image load command there is now a `--force` function
that fails extractions with rejected paths when false, and just warns
about the rejected paths when true.
- Update `container stats` for statistics API properties now all being
optional.
## Type of Change
- [x] Bug fix
- [ ] New feature
- [ ] Breaking change
- [x] Documentation update
## Motivation and Context
See above
## Testing
- [x] Tested locally
- [x] Added/updated tests
- [x] Added/updated docs
commit b1577d8
Author: J Logan <john_logan@apple.com>
Date: Fri Jan 16 15:50:47 2026 -0800
Adds opt-in pre-commit hook for format and header checks. (apple#1062)
- Closesapple#639.
- Adds swift format configuration that removes lint checks so we can use
`swift lint` to perform format-only tests.
- Adds `check` target that invokes format and header checks.
- Adds pre-commit script that runs `make check`.
- Adds `pre-commit` target that installs the check script as a
pre-commit hook.
## Type of Change
- [ ] Bug fix
- [x] New feature
- [ ] Breaking change
- [x] Documentation update
## Motivation and Context
Avoids wasting time and commit rewrites.
## Testing
- [x] Tested locally
- [ ] Added/updated tests
- [x] Added/updated docs
commit 3cf2c6a
Author: J Logan <john_logan@apple.com>
Date: Fri Jan 16 13:41:32 2026 -0800
Fix unstable integration tests. (apple#1060)
- TestCLIRunCommand now run so many tests concurrently that the API
server gets swamped and tests randomly time out.
- The parallelism options on `swift test` only work for XCTest, not
swift-testing.
- Work around this while retaining some parallelism (good for stress
testing) by breaking the tests into two suites.
commit 8897fcc
Author: Manu Schiller <56154253+manuschillerdev@users.noreply.github.com>
Date: Wed Jan 14 04:39:08 2026 +0100
fix: use pax instead of tar for pkg payload extraction (apple#1038)
- It is common to have `gnu-tar` alongside other GNU tools
installed and aliased for compatibility reasons. However, this
breaks the current make build.
- Use BSD-only binaries (no GNU equivalents that are
commonly aliased), making the Makefile more portable.
commit dbec1db
Author: Ronit Sabhaya <ronitsabhaya75@gmail.com>
Date: Mon Jan 12 20:34:25 2026 -0600
Add support for aarch64 architecture alias (apple#1040)
- Adds `aarch64` as an alias for `arm64` in the `Arch` enum. This
addresses the maintainer's request to support this common architecture
name, ensuring consistency with `x86_64` normalization and preventing
failures for users expecting `aarch64` support.
commit 837aa5e
Author: jwhur <57657645+JaewonHur@users.noreply.github.com>
Date: Mon Jan 12 14:36:10 2026 -0800
Fix the FS error when using Virtualization (apple#1041)
- Fixesapple#614.
- Use VZ cached mode instead of auto.
Signed-off-by: jwhur <jaewon_hur@apple.com>
commit e465b10
Author: 박성근 <117553364+ParkSeongGeun@users.noreply.github.com>
Date: Tue Jan 13 03:30:51 2026 +0900
Fix relative path resolution in entrypoint (apple#987)
- Fixesapple#962.
- Adds test to exercise apple/containerization#473.
- Updates containerization to 0.20.1.
Signed-off-by: ParkSeongGeun <phd0801@naver.com>
commit aa77928
Author: Ronit Sabhaya <ronitsabhaya75@gmail.com>
Date: Mon Jan 12 12:04:46 2026 -0600
Fix: Support x86_64 architecture alias to prevent silent pull failure… (apple#1036)
- Adds architecture name normalization to accept
`x86_64` and `x86-64` as aliases for `amd64`.
commit dc4682b
Author: Amir Alperin <me@remotecpp.dev>
Date: Fri Jan 9 21:10:53 2026 +0200
fix: extract hostname from FQDN (apple#1011) (apple#1017)
- Set the container hostname to the first DNS
label derived from the container id, strip everything
after the first dot.
- Fixesapple#1011.
commit 4af1cc0
Author: Ronit Sabhaya <ronitsabhaya75@gmail.com>
Date: Thu Jan 8 21:27:43 2026 -0600
fix: improve error message when binding to privileged ports (fixesapple#978) (apple#1031)
- The container fails to start with a generic "permission denied"
error when attempting to publish privileged ports (ports below
1024) without root privileges. This provides a confusing user
experience as the error doesn't explain why permission was
denied.
commit 21facf0
Author: J Logan <john_logan@apple.com>
Date: Thu Jan 8 17:02:22 2026 -0800
Add instructions for using locally built init filesystem. (apple#1032)
- Closesapple#1030.
commit b671690
Author: Danny Canter <danny_canter@apple.com>
Date: Wed Jan 7 21:01:10 2026 -0800
ProgressBar: Various fixes (apple#1025)
There's a couple things I don't think are intuitive about this.
1. Because of the internal task, render() can still be called even after
finish() completes. Ideally async defers are supported and we could just
await the final render completing after cancelling the task and setting
.finished, but alas. To fix this we can just lock across the methods for
now.
2. We always clear the screen in the destructor, even if we don't use
the
progress bar. I don't think we should honestly do anything in the
destructor.
Feels a programmer error not to defer { bar.finish() } or call it
somewhere.
3. Our spaces based line clearing. Use the ansi escape sequence for
clearing line;
I think our calculations were slightly off and it would leave trailing
output ( "s]" )
in some cases.
4. Shrinking the window until the output is smaller than the terminal
window (and vice
versa) is wonky on various term emulators. Truthfully, this is just a
hard problem,
but we can truncate our output and still provide some useful info.
This fixes some single line output (cat /etc/hostname etc.) getting
cleared in our atexit handler, as well as the need for the usleep.
commit 98410fd
Author: J Logan <john_logan@apple.com>
Date: Wed Jan 7 18:23:31 2026 -0800
Adds IPv6 port forwarding. (apple#1029)
- Closesapple#1006.
commit 9d06475
Author: Saehej Kang <saehej.kang@gmail.com>
Date: Wed Jan 7 16:53:33 2026 -0800
[container]: add startedDate field (apple#1018)
- Closesapple#302.
- Closesapple#336 (obsoletes this PR).
commit db8932a
Author: J Logan <john_logan@apple.com>
Date: Wed Jan 7 15:35:35 2026 -0800
Resolve IPv6 address queries for container names. (apple#1016)
- Closesapple#1005.
- Adapt everything to use MACAddress type from containerization 0.20.0.
- Allocate MAC addresses for every container so that we have
deterministic IPv6 link local addresses.
- Add AAAA handling to ContainerDNSHandler.
- NOTE: Only works on Tahoe. On Sequoia, we don't have a good way to set
or determine the IPv6 network prefix when networks are created, so we
can't infer the IPv6 link local addresses for AAAA responses and we
instead return `NODATA`.
commit 5d6c750
Author: Danny Canter <danny_canter@apple.com>
Date: Wed Jan 7 14:48:58 2026 -0800
CLI: Add read-only flag to run/create (apple#999)
Closesapple#990
Sets the rootfs for a container to read-only.
commit aac2457
Author: Danny Canter <danny_canter@apple.com>
Date: Wed Jan 7 13:46:26 2026 -0800
Tests: Fix relative path mount tests (apple#1028)
The tests are run in parallel on CI, and were split into three tests.
They change the cwd, so it's kind of a gamble whether some of them pass.
This just moves all the logic into one test mostly.
commit 9cd5397
Author: J Logan <john_logan@apple.com>
Date: Wed Jan 7 10:35:19 2026 -0800
Update to containerization 0.20.0. (apple#1027)
- Use MACAddress for Attachment and CZ interfaces.
- Move data validation closer to API surface.
commit 356c8d2
Author: J Logan <john_logan@apple.com>
Date: Tue Jan 6 08:27:14 2026 -0800
Reorganize client libraries. (apple#1020)
- Closesapple#461.
- Extract core types into ContainerResources target.
- Extract ContainerNetworkServiceClient from ContainerNetworkService.
- Relocate sandbox client from ContainerClient to
ContainerSandboxServiceClient.
- Relocate ContainerClient to ContainerAPIServiceClient.
- Common structure from services and clients under Source/Services.
Updated project hierarchy:
```
Sources/CAuditToken - audit token access wrapper
Sources/CLI - CLI executable
Sources/ContainerBuild - builder
Sources/ContainerCommands - CLI command implementations
Sources/ContainerLog - logging helpers
Sources/ContainerPersistence - persistent data and system property helpers
Sources/ContainerPlugin - plugin system
Sources/ContainerResource - resource (container, image, volume, network) types
Sources/ContainerVersion - version helpers
Sources/ContainerXPC - XPC helpers
Sources/CVersion - injected project version
Sources/DNSServer - container DNS resolver
Sources/Helpers - service executables
Sources/Services/*/Client - service clients
Sources/Services/*/Server - service implementations
Sources/SocketForwarder - port forwarding
Sources/TerminalProgress - progress bar
```
## Type of Change
- [ ] Bug fix
- [ ] New feature
- [x] Breaking change
- [ ] Documentation update
## Motivation and Context
The ContainerClient library was a bit of a grab bag. This refactor
applies a more sensible project and library structure for resource data
types, services, and clients.
## Testing
- [x] Tested locally
- [x] Added/updated tests
- [ ] Added/updated docs
commit 8c439cd
Author: Danny Canter <danny_canter@apple.com>
Date: Mon Jan 5 13:50:57 2026 -0800
makefile: Add cli target (apple#1022)
Often times I'll be making a change that only touches the cli and I
don't feel like sitting through the potential song and dance of the
other components building/installing.
commit d6f052d
Author: Kathryn Baldauf <k_baldauf@apple.com>
Date: Mon Jan 5 13:09:34 2026 -0800
Update license header on all files to include the current year (apple#1024)
## Motivation and Context
Now that we're in 2026, we need to update the license headers on all the
files. Unfortunately, Hawkeye doesn't have an attribute for the current
year to help us avoid this in the future. Instead, I had to work around
this by doing the following:
1. Update licenserc.toml with:
```
[properties]
... (other properties)
currentYear = "2026"
```
2. Update scripts/license-header.txt with
```
Copyright ©{{ " " }}{%- set created = attrs.git_file_created_year or
attrs.disk_file_created_year -%}{%- set modified = props["currentYear"]
-%}{%- if created != modified -%} {{created}}-{{modified}}{%- else
-%}{{created}}{%- endif -%}{{ " " }}{{ props["copyrightOwner"] }}.
```
Then I removed these two changes before committing. After this PR is
merged, all files will have recently had git updates, so the existing
code for setting the modified year should work as intended.
Signed-off-by: Kathryn Baldauf <k_baldauf@apple.com>
commit 20dc0bc
Author: Danny Canter <danny_canter@apple.com>
Date: Sun Jan 4 11:11:09 2026 -0800
Parser: Support relative paths for --volume (apple#1013)
commit 028e7e1
Author: Danny Canter <danny_canter@apple.com>
Date: Sun Jan 4 10:52:46 2026 -0800
Deps: Bump Containerization to 0.19.0 (apple#1015)
Has read-only rootfs support.
commit 020949e
Author: Danny Canter <danny_canter@apple.com>
Date: Sun Jan 4 10:51:20 2026 -0800
CLI: Small fixups for implicit envvars (apple#1014)
We should only inherit from the host if there's no =. Additionally
document the flag a little more to show that we can inherit from the
host.
commit df368b7
Author: Amir Alperin <alperin.amir@gmail.com>
Date: Sun Jan 4 20:49:22 2026 +0200
Fix port validation to allow same port for different protocols (apple#992) (apple#1000)
- Fixes: apple#992
- Port validation previously rejected valid configurations
when the same port number was used for different
protocols (TCP and UDP). For example:
`-p 1024:1024/udp -p 1024:1024/tcp`
Although this is a valid and common use case, the
validation logic treated it as a conflict.
To fix this, I updated the validation key to include the protocol name.
The validation now checks for overlapping port numbers only within the
same protocol, rather than across all protocols.
This change enables binding the same port number for both TCP and UDP,
aligning the validation behavior with real-world networking
requirements.
## Testing
- [x] Tested locally
- [x] Added/updated tests
- [ ] Added/updated docs
commit cf64614
Author: J Logan <john_logan@apple.com>
Date: Fri Jan 2 14:10:48 2026 -0800
Update OSS header in Package.swift. (apple#1010)
commit 375ce16
Author: J Logan <john_logan@apple.com>
Date: Fri Jan 2 12:09:12 2026 -0800
Fix OSS header dates that break CI checks. (apple#1009)
commit 580d853
Author: c <claudeaceae@icloud.com>
Date: Fri Jan 2 00:19:57 2026 -0500
Use full path for uninstall script in upgrade instructions (apple#983)
- Makes the upgrade section consistent with the
uninstall section by using the full path to the
uninstall script.
commit 4cadc40
Author: c <claudeaceae@icloud.com>
Date: Thu Jan 1 22:53:56 2026 -0500
Clarify uninstall script location in README (apple#982)
- Clarifies where the `uninstall-container.sh` script is located after
installation
- Updates example commands to use the full path
commit 4e78e30
Author: c <claudeaceae@icloud.com>
Date: Thu Jan 1 20:57:47 2026 -0500
Fix grammar in tutorial.md (apple#985)
## Summary
- Fixes a grammar error in the tutorial's publish section
## Details
Line 287 of `docs/tutorial.md` had "you need push images" which should
be "you need to push images".
This is a simple grammar fix to improve readability.
## Test plan
- [x] Verified the sentence now reads correctly
commit 22dfd6e
Author: Danny Canter <danny_canter@apple.com>
Date: Thu Jan 1 17:57:00 2026 -0800
CLI: Fix stop not signalling waiters (apple#972)
commit 4958cf2
Author: c <claudeaceae@icloud.com>
Date: Thu Jan 1 20:51:10 2026 -0500
Fix bash completion source path in documentation (apple#981)
- Corrects the source path for bash completion script
when not using bash-completion package.
commit 25ac79a
Author: c <claudeaceae@icloud.com>
Date: Thu Jan 1 20:50:19 2026 -0500
Fix MAC address option typo in how-to documentation (apple#980)
- Corrects the MAC address example command in the
how-to guide to use the correct `--network` flag syntax
instead of the incorrect `--mac-address` flag.
commit edadf15
Author: Raj <realrajaryan@gmail.com>
Date: Thu Jan 1 15:10:39 2026 +0530
Fix container auto-delete on rapid stop/start (apple#841)
Fixesapple#833.
Currently, when stopping and immediately restarting a container, it would fail with the error:
`“container expected to be in created state, got: shuttingDown”` and then be automatically deleted.
The `SandboxService` process waits five seconds before exiting after shutdown. During this interval, a rapid restart could reconnect to the still-terminating process in the `shuttingDown` state, triggering a state validation error.
This fix forcefully terminates the `SandboxService` process with `SIGKILL` upon container exit, instead of waiting five seconds. The bootstrap now defensively checks for and cleans up any stale services before registering new ones, preventing reconnections to processes in the `shuttingDown` state.
commit 5064b0f
Author: J Logan <john_logan@apple.com>
Date: Mon Dec 22 10:16:14 2025 -0800
Adds network IPv6 configuration. (apple#975)
- Part of work for apple#460.
- Enable set/get of IPv6 network prefix in ReservedVmnetNetwork.
- Show IPv6 prefix in `network list` full output.
- Option for setting IPv6 prefix when creating a network.
- System property for default IPv6 prefix.
## Type of Change
- [ ] Bug fix
- [x] New feature
- [ ] Breaking change
- [x] Documentation update
## Motivation and Context
See apple#460.
## Testing
- [x] Tested locally
- [ ] Added/updated tests
- [x] Added/updated docs
commit 9c239aa
Author: Volodymyr Bortniak <25820601+Bortnyak@users.noreply.github.com>
Date: Sat Dec 20 00:36:02 2025 +0100
Add support for reading env from named pipes (apple#974)
This is a fix for
[issue#956](apple#956)
`FileManager.default.contents(atPath:)` returns `nil` for named pipes
(FIFOs)
and process substitutions like `/dev/fd/XX` because:
1. It expects regular files with a known size
2. Named pipes are stream-based and block until data arrives
## Solution
Use `FileHandle(forReadingFrom:)` instead, which:
- Properly handles blocking I/O
- Works with named pipes, process substitutions, and regular files
(mentioned in the
[doc](https://developer.apple.com/documentation/foundation/filehandle))
Co-authored-by: Bortniak Volodymyr <Bortnyak@users.noreply.github.com>
commit 3c3a83c
Author: Danny Canter <danny_canter@apple.com>
Date: Thu Dec 18 16:28:44 2025 -0800
Turn on oops=panic kernel cmdline (apple#971)
commit b1b9980
Author: Michael Gathara <mikegtrm@gmail.com>
Date: Wed Dec 17 20:58:50 2025 -0600
Fix: Kubes Cluster in Container Crashing Container (IS#923) (apple#930)
- Fixes issue apple#923
- I fixed a race condition in `ConnectHandler.swift` where
an asynchronous network connection could complete
after the handler had already been removed from the
pipeline.
- This prevents the EXC_BREAKPOINT crash in
container-runtime-linux that occurred when kinc
(Kubernetes in Container) created rapid connections.
- The actual fix was inadvertently applied in apple#957, so this
PR contains only the test code.
commit 9f4efe0
Author: Saehej Kang <saehej.kang@gmail.com>
Date: Wed Dec 17 00:30:33 2025 -0800
[networks]: add prune command (apple#914)
- Closesapple#893
commit 4f88725
Author: J Logan <john_logan@apple.com>
Date: Tue Dec 16 16:34:13 2025 -0800
Use new IP/CIDR types from Containerization. (apple#957)
- Part of work for apple#460.
- With CZ release 0.17.0, the IP and CIDR address
types changed from String to IPv4Address and
CIDRv4, respectively. This PR applies the corresponding
adaptations to container.
commit 8e16bb2
Author: Salman Chishti <salmanmkc@GitHub.com>
Date: Tue Dec 16 20:14:45 2025 +0000
Upgrade GitHub Actions to latest versions (apple#959)
- Upgrade GitHub Actions to their latest versions for
improved features, bug fixes, and security updates.
Signed-off-by: Salman Muin Kayser Chishti <13schishti@gmail.com>
commit 0c7dca4
Author: Salman Chishti <salmanmkc@GitHub.com>
Date: Tue Dec 16 19:23:31 2025 +0000
Add Dependabot for GitHub Actions updates (apple#960)
## Summary
Add Dependabot configuration to automatically keep GitHub Actions up to
date.
## Changes
Adds `.github/dependabot.yml` configured to:
- Check for GitHub Actions updates weekly
- Group all action updates together for easier review
- Use `ci` prefix for commit messages
## Why
As discussed in apple#958, this helps:
- Keep actions up to date with security patches automatically
- Handle Node runtime deprecations proactively (e.g., Node 20 → Node 24)
- Reduce manual maintenance burden
## Reference
Based on the pattern used in
[swift-nio](https://github.com/apple/swift-nio/blob/main/.github/dependabot.yml).
commit 637c8f1
Author: Salman Chishti <salmanmkc@GitHub.com>
Date: Tue Dec 16 18:15:42 2025 +0000
Upgrade GitHub Actions for Node 24 compatibility (apple#958)
## Summary
Upgrade GitHub Actions to their latest versions to ensure compatibility
with Node 24, as Node 20 will reach end-of-life in April 2026.
## Changes
| Action | Old Version(s) | New Version | SHA |
|--------|---------------|-------------|-----|
| `actions/checkout` | v4 | v6 | `8e8c483` |
| `actions/download-artifact` | v4 | v7 | `37930b1` |
| `actions/upload-artifact` | v4 | v6 | `b7c566a` |
| `actions/labeler` | v5 | v6 | `634933e` |
| `actions/configure-pages` | v5 | v5 | `983d773` |
| `actions/upload-pages-artifact` | v3 | v3 | `56afc60` |
| `softprops/action-gh-release` | v2 | v2 | `a06a81a` |
## Context
Per [GitHub's
announcement](https://github.blog/changelog/2025-09-19-deprecation-of-node-20-on-github-actions-runners/),
Node 20 is being deprecated and runners will begin using Node 24 by
default starting March 4th, 2026.
### Why this matters
- **Node 20 EOL**: April 2026
- **Node 24 default**: March 4th, 2026
- **Action**: Update to latest action versions that support Node 24
### Security
All actions are now **pinned to commit SHAs** instead of mutable version
tags. This provides:
- Protection against tag hijacking attacks
- Immutable, reproducible builds
- Version comments for readability
### Automated Updates
A follow-up PR (apple#960) adds Dependabot configuration to automatically
keep these actions updated with new SHA-pinned versions.
### Testing
These changes only affect CI/CD workflow configurations and should not
impact application functionality. The workflows should be tested by
running them on a branch before merging.
Signed-off-by: Salman Muin Kayser Chishti <13schishti@gmail.com>
commit c22f128
Author: karen heckel <karen.heckel@utexas.edu>
Date: Mon Dec 15 21:16:55 2025 -0800
Feat: customize console output with env variable (apple#952)
Fixesapple#915
Added a new feature to support the passing of buildkit colors for
customizing console output.
commit 9b7cfd8
Author: Saehej Kang <saehej.kang@gmail.com>
Date: Mon Dec 15 17:52:00 2025 -0800
[images]: refactor prune command (apple#941)
- Updates to `image prune` for consistency with how
other `prune` commands are done. Added missing
test cases as well for the command
- Relates to the discussion from apple#914
commit 7d30720
Author: Danny Canter <danny_canter@apple.com>
Date: Thu Dec 11 05:36:15 2025 -0800
CLI: Fix -it not being able to pipe stdout (apple#951)
Fixesapple#949
Typically if one fd is a tty, it's common for all 3 of stdio to be the
same, but that is not always the case. In our case we were using our
Terminal type from Containerization to comb through err/out/in and give
us a type backed by one of the 3 if -t was supplied. It happens that
stderr is the first we check, so our Terminal() is backed by fd 2. This
change modifies things so that we always initialize our Terminal if
asked for with fd 0, and out/err are backed by their corresponding
correct fd number.
## Type of Change
- [x] Bug fix
- [ ] New feature
- [ ] Breaking change
- [ ] Documentation update
## Testing
- [x] Tested locally
- [ ] Added/updated tests
- [ ] Added/updated docs
commit a2901e0
Author: wangxiaolei <fatelei@gmail.com>
Date: Wed Dec 10 10:04:40 2025 +0800
feat: implement version sub command (apple#911)
- closesapple#383
- implement version sub command, give more info
---------
Co-authored-by: fatelei <fatelei@fateleis-MacBook-Pro.local>
commit 0cde1ef
Author: Danny Canter <danny_canter@apple.com>
Date: Tue Dec 9 13:24:45 2025 -0800
Deps: Bump Containerization to 0.16.2 (apple#947)
Closesapple#928
Has a cgroup fix when stopping certain containers
commit 3896055
Author: Dmitry Kovba <dkovba@apple.com>
Date: Tue Dec 9 12:32:28 2025 -0800
Lowercase error messages (apple#945)
## Type of Change
- [x] Bug fix
- [ ] New feature
- [ ] Breaking change
- [ ] Documentation update
## Motivation and Context
For consistency, all error messages are lowercased.
## Testing
- [ ] Tested locally
- [ ] Added/updated tests
- [ ] Added/updated docs
---------
Co-authored-by: J Logan <sgtbakerrahulnet@yahoo.com>
commit 0733a81
Author: Saehej Kang <saehej.kang@gmail.com>
Date: Tue Dec 9 10:54:37 2025 -0800
[volumes]: refactor prune command (apple#940)
- Refactor the `volume prune` command to follow a client-side approach.
The `volumeDiskUsage` is calculated in the service file, so it made
sense to leave that there.
- Relates to the discussion from apple#914
commit 42528e6
Author: Kathryn Baldauf <k_baldauf@apple.com>
Date: Tue Dec 9 10:42:27 2025 -0800
Update CONTRIBUTORS to MAINTAINERS and point at containerization (apple#942)
## Type of Change
- [x] Documentation update
## Motivation and Context
See apple/containerization#435 for more
information on this change.
commit a64bd77
Author: J Logan <john_logan@apple.com>
Date: Tue Dec 9 14:35:34 2025 -0300
Fix broken image integration tests. (apple#944)
- Fixesapple#943.
- Use images other than alpine:3.20 for image concurrency test so as not
to interfere with tests using that image.
- Rename test files to match suite names.
commit ab92f39
Author: TTtie <me@tttie.cz>
Date: Mon Dec 8 18:17:10 2025 +0100
fix(TerminalProgress): make the progress bar respect locale-specific decimal separator (apple#936)
- The `ProgressBar#adjustFormattedSize` function currently expects a
decimal dot when adding the additional ".0" to the size. This, however,
breaks when a region with a non-dot decimal separator is used.
commit 420be74
Author: J Logan <john_logan@apple.com>
Date: Mon Dec 8 03:00:02 2025 -0300
Data integrity: bump to cz 0.16.1, adjust sync mode. (apple#939)
- 0.16.1 changes an ext4 superblock setting that might have been causing
problems.
- apple#877 fixed an issue where the cache and sync settings for block
filesystems weren't being passed down to the VZ virtual machine
configuration. The default sync value getting passed down is `full`,
which reduces I/O performance. Relax this to use `fsync` for now.
## Type of Change
- [*] Bug fix
- [ ] New feature
- [ ] Breaking change
- [ ] Documentation update
## Motivation and Context
May address problems reported in apple#877.
## Testing
- [x] Tested locally
- [ ] Added/updated tests
- [ ] Added/updated docs
commit f7bcb68
Author: Santosh Bhavani <santosh.bhavani@live.com>
Date: Sun Dec 7 10:56:50 2025 -0800
Add --max-concurrent-downloads flag for parallel layer downloads (apple#716)
Adds `--max-concurrent-downloads` flag to `container image pull` for
configurable concurrent layer downloads.
Fixesapple#715
Depends on apple/containerization#311
**Usage**:
```bash
container image pull nginx:latest --max-concurrent-downloads 6
```
**Changes**:
- Add CLI flag (default: 3)
- Thread parameter through XPC stack
- Update to use forked containerization with configurable concurrency
**Performance**: ~1.2-1.3x faster pulls for multi-layer images with
higher concurrency
**Tests**: Included standalone tests verify concurrency behavior and
parameter flow
---------
Co-authored-by: Claude <noreply@anthropic.com>
Mcrich23 added a commit to Mcrich23/container that referenced this pull request Jan 22, 2026
commit 69445b9
Author: jwhur <57657645+JaewonHur@users.noreply.github.com>
Date: Mon Jan 19 13:09:34 2026 -0800
Throw error when starting a container with invalid virtiofs source (apple#1051)
Run = Create + Start
1) Mount source points to a valid directory
- Run and Create + Start both correctly create the container with mount.
2) Mount source points to a file
- Run fails bootstrapping the container, thus container not created.
- Create creates the container, but Start fails bootstrapping, removing
the container. (Thus, both are the same.)
3) Mount source deleted or replaced to file after container created
- Start throw errors but do not delete the container.
commit 08f48d9
Author: Danny Canter <danny_canter@apple.com>
Date: Fri Jan 16 21:48:58 2026 -0800
ContainerSvc: Handle unexpected sandbox svc exits (apple#1065)
Closesapple#1050
If the sandbox svc exits out of band of the usual stop (or regular exit)
case the container svc's state is not properly updated for the
container. This was due to the cleanup steps involving trying to send
the shutdown rpc which cannot succeed as the sandbox svc does not exist
to service it.
To handle this, let's treat shutdown not returning successfully as
non-fatal (as this is mostly best effort), log an error and continue the
state cleanup.
commit b928e3f
Author: Amir Alperin <me@remotecpp.dev>
Date: Sat Jan 17 07:43:48 2026 +0200
fix: performance warning should not output ANSI codes if stderr redirected (apple#1059)
commit 744e7f7
Author: J Logan <john_logan@apple.com>
Date: Fri Jan 16 16:26:13 2026 -0800
Update for containerization 0.21.0. (apple#1056)
- Update image load and build to handle rejected paths during tar
extraction. For the image load command there is now a `--force` function
that fails extractions with rejected paths when false, and just warns
about the rejected paths when true.
- Update `container stats` for statistics API properties now all being
optional.
## Type of Change
- [x] Bug fix
- [ ] New feature
- [ ] Breaking change
- [x] Documentation update
## Motivation and Context
See above
## Testing
- [x] Tested locally
- [x] Added/updated tests
- [x] Added/updated docs
commit b1577d8
Author: J Logan <john_logan@apple.com>
Date: Fri Jan 16 15:50:47 2026 -0800
Adds opt-in pre-commit hook for format and header checks. (apple#1062)
- Closesapple#639.
- Adds swift format configuration that removes lint checks so we can use
`swift lint` to perform format-only tests.
- Adds `check` target that invokes format and header checks.
- Adds pre-commit script that runs `make check`.
- Adds `pre-commit` target that installs the check script as a
pre-commit hook.
## Type of Change
- [ ] Bug fix
- [x] New feature
- [ ] Breaking change
- [x] Documentation update
## Motivation and Context
Avoids wasting time and commit rewrites.
## Testing
- [x] Tested locally
- [ ] Added/updated tests
- [x] Added/updated docs
commit 3cf2c6a
Author: J Logan <john_logan@apple.com>
Date: Fri Jan 16 13:41:32 2026 -0800
Fix unstable integration tests. (apple#1060)
- TestCLIRunCommand now run so many tests concurrently that the API
server gets swamped and tests randomly time out.
- The parallelism options on `swift test` only work for XCTest, not
swift-testing.
- Work around this while retaining some parallelism (good for stress
testing) by breaking the tests into two suites.
commit 8897fcc
Author: Manu Schiller <56154253+manuschillerdev@users.noreply.github.com>
Date: Wed Jan 14 04:39:08 2026 +0100
fix: use pax instead of tar for pkg payload extraction (apple#1038)
- It is common to have `gnu-tar` alongside other GNU tools
installed and aliased for compatibility reasons. However, this
breaks the current make build.
- Use BSD-only binaries (no GNU equivalents that are
commonly aliased), making the Makefile more portable.
commit dbec1db
Author: Ronit Sabhaya <ronitsabhaya75@gmail.com>
Date: Mon Jan 12 20:34:25 2026 -0600
Add support for aarch64 architecture alias (apple#1040)
- Adds `aarch64` as an alias for `arm64` in the `Arch` enum. This
addresses the maintainer's request to support this common architecture
name, ensuring consistency with `x86_64` normalization and preventing
failures for users expecting `aarch64` support.
commit 837aa5e
Author: jwhur <57657645+JaewonHur@users.noreply.github.com>
Date: Mon Jan 12 14:36:10 2026 -0800
Fix the FS error when using Virtualization (apple#1041)
- Fixesapple#614.
- Use VZ cached mode instead of auto.
Signed-off-by: jwhur <jaewon_hur@apple.com>
commit e465b10
Author: 박성근 <117553364+ParkSeongGeun@users.noreply.github.com>
Date: Tue Jan 13 03:30:51 2026 +0900
Fix relative path resolution in entrypoint (apple#987)
- Fixesapple#962.
- Adds test to exercise apple/containerization#473.
- Updates containerization to 0.20.1.
Signed-off-by: ParkSeongGeun <phd0801@naver.com>
commit aa77928
Author: Ronit Sabhaya <ronitsabhaya75@gmail.com>
Date: Mon Jan 12 12:04:46 2026 -0600
Fix: Support x86_64 architecture alias to prevent silent pull failure… (apple#1036)
- Adds architecture name normalization to accept
`x86_64` and `x86-64` as aliases for `amd64`.
commit dc4682b
Author: Amir Alperin <me@remotecpp.dev>
Date: Fri Jan 9 21:10:53 2026 +0200
fix: extract hostname from FQDN (apple#1011) (apple#1017)
- Set the container hostname to the first DNS
label derived from the container id, strip everything
after the first dot.
- Fixesapple#1011.
commit 4af1cc0
Author: Ronit Sabhaya <ronitsabhaya75@gmail.com>
Date: Thu Jan 8 21:27:43 2026 -0600
fix: improve error message when binding to privileged ports (fixesapple#978) (apple#1031)
- The container fails to start with a generic "permission denied"
error when attempting to publish privileged ports (ports below
1024) without root privileges. This provides a confusing user
experience as the error doesn't explain why permission was
denied.
commit 21facf0
Author: J Logan <john_logan@apple.com>
Date: Thu Jan 8 17:02:22 2026 -0800
Add instructions for using locally built init filesystem. (apple#1032)
- Closesapple#1030.
commit b671690
Author: Danny Canter <danny_canter@apple.com>
Date: Wed Jan 7 21:01:10 2026 -0800
ProgressBar: Various fixes (apple#1025)
There's a couple things I don't think are intuitive about this.
1. Because of the internal task, render() can still be called even after
finish() completes. Ideally async defers are supported and we could just
await the final render completing after cancelling the task and setting
.finished, but alas. To fix this we can just lock across the methods for
now.
2. We always clear the screen in the destructor, even if we don't use
the
progress bar. I don't think we should honestly do anything in the
destructor.
Feels a programmer error not to defer { bar.finish() } or call it
somewhere.
3. Our spaces based line clearing. Use the ansi escape sequence for
clearing line;
I think our calculations were slightly off and it would leave trailing
output ( "s]" )
in some cases.
4. Shrinking the window until the output is smaller than the terminal
window (and vice
versa) is wonky on various term emulators. Truthfully, this is just a
hard problem,
but we can truncate our output and still provide some useful info.
This fixes some single line output (cat /etc/hostname etc.) getting
cleared in our atexit handler, as well as the need for the usleep.
commit 98410fd
Author: J Logan <john_logan@apple.com>
Date: Wed Jan 7 18:23:31 2026 -0800
Adds IPv6 port forwarding. (apple#1029)
- Closesapple#1006.
commit 9d06475
Author: Saehej Kang <saehej.kang@gmail.com>
Date: Wed Jan 7 16:53:33 2026 -0800
[container]: add startedDate field (apple#1018)
- Closesapple#302.
- Closesapple#336 (obsoletes this PR).
commit db8932a
Author: J Logan <john_logan@apple.com>
Date: Wed Jan 7 15:35:35 2026 -0800
Resolve IPv6 address queries for container names. (apple#1016)
- Closesapple#1005.
- Adapt everything to use MACAddress type from containerization 0.20.0.
- Allocate MAC addresses for every container so that we have
deterministic IPv6 link local addresses.
- Add AAAA handling to ContainerDNSHandler.
- NOTE: Only works on Tahoe. On Sequoia, we don't have a good way to set
or determine the IPv6 network prefix when networks are created, so we
can't infer the IPv6 link local addresses for AAAA responses and we
instead return `NODATA`.
commit 5d6c750
Author: Danny Canter <danny_canter@apple.com>
Date: Wed Jan 7 14:48:58 2026 -0800
CLI: Add read-only flag to run/create (apple#999)
Closesapple#990
Sets the rootfs for a container to read-only.
commit aac2457
Author: Danny Canter <danny_canter@apple.com>
Date: Wed Jan 7 13:46:26 2026 -0800
Tests: Fix relative path mount tests (apple#1028)
The tests are run in parallel on CI, and were split into three tests.
They change the cwd, so it's kind of a gamble whether some of them pass.
This just moves all the logic into one test mostly.
commit 9cd5397
Author: J Logan <john_logan@apple.com>
Date: Wed Jan 7 10:35:19 2026 -0800
Update to containerization 0.20.0. (apple#1027)
- Use MACAddress for Attachment and CZ interfaces.
- Move data validation closer to API surface.
commit 356c8d2
Author: J Logan <john_logan@apple.com>
Date: Tue Jan 6 08:27:14 2026 -0800
Reorganize client libraries. (apple#1020)
- Closesapple#461.
- Extract core types into ContainerResources target.
- Extract ContainerNetworkServiceClient from ContainerNetworkService.
- Relocate sandbox client from ContainerClient to
ContainerSandboxServiceClient.
- Relocate ContainerClient to ContainerAPIServiceClient.
- Common structure from services and clients under Source/Services.
Updated project hierarchy:
```
Sources/CAuditToken - audit token access wrapper
Sources/CLI - CLI executable
Sources/ContainerBuild - builder
Sources/ContainerCommands - CLI command implementations
Sources/ContainerLog - logging helpers
Sources/ContainerPersistence - persistent data and system property helpers
Sources/ContainerPlugin - plugin system
Sources/ContainerResource - resource (container, image, volume, network) types
Sources/ContainerVersion - version helpers
Sources/ContainerXPC - XPC helpers
Sources/CVersion - injected project version
Sources/DNSServer - container DNS resolver
Sources/Helpers - service executables
Sources/Services/*/Client - service clients
Sources/Services/*/Server - service implementations
Sources/SocketForwarder - port forwarding
Sources/TerminalProgress - progress bar
```
## Type of Change
- [ ] Bug fix
- [ ] New feature
- [x] Breaking change
- [ ] Documentation update
## Motivation and Context
The ContainerClient library was a bit of a grab bag. This refactor
applies a more sensible project and library structure for resource data
types, services, and clients.
## Testing
- [x] Tested locally
- [x] Added/updated tests
- [ ] Added/updated docs
commit 8c439cd
Author: Danny Canter <danny_canter@apple.com>
Date: Mon Jan 5 13:50:57 2026 -0800
makefile: Add cli target (apple#1022)
Often times I'll be making a change that only touches the cli and I
don't feel like sitting through the potential song and dance of the
other components building/installing.
commit d6f052d
Author: Kathryn Baldauf <k_baldauf@apple.com>
Date: Mon Jan 5 13:09:34 2026 -0800
Update license header on all files to include the current year (apple#1024)
## Motivation and Context
Now that we're in 2026, we need to update the license headers on all the
files. Unfortunately, Hawkeye doesn't have an attribute for the current
year to help us avoid this in the future. Instead, I had to work around
this by doing the following:
1. Update licenserc.toml with:
```
[properties]
... (other properties)
currentYear = "2026"
```
2. Update scripts/license-header.txt with
```
Copyright ©{{ " " }}{%- set created = attrs.git_file_created_year or
attrs.disk_file_created_year -%}{%- set modified = props["currentYear"]
-%}{%- if created != modified -%} {{created}}-{{modified}}{%- else
-%}{{created}}{%- endif -%}{{ " " }}{{ props["copyrightOwner"] }}.
```
Then I removed these two changes before committing. After this PR is
merged, all files will have recently had git updates, so the existing
code for setting the modified year should work as intended.
Signed-off-by: Kathryn Baldauf <k_baldauf@apple.com>
commit 20dc0bc
Author: Danny Canter <danny_canter@apple.com>
Date: Sun Jan 4 11:11:09 2026 -0800
Parser: Support relative paths for --volume (apple#1013)
commit 028e7e1
Author: Danny Canter <danny_canter@apple.com>
Date: Sun Jan 4 10:52:46 2026 -0800
Deps: Bump Containerization to 0.19.0 (apple#1015)
Has read-only rootfs support.
commit 020949e
Author: Danny Canter <danny_canter@apple.com>
Date: Sun Jan 4 10:51:20 2026 -0800
CLI: Small fixups for implicit envvars (apple#1014)
We should only inherit from the host if there's no =. Additionally
document the flag a little more to show that we can inherit from the
host.
commit df368b7
Author: Amir Alperin <alperin.amir@gmail.com>
Date: Sun Jan 4 20:49:22 2026 +0200
Fix port validation to allow same port for different protocols (apple#992) (apple#1000)
- Fixes: apple#992
- Port validation previously rejected valid configurations
when the same port number was used for different
protocols (TCP and UDP). For example:
`-p 1024:1024/udp -p 1024:1024/tcp`
Although this is a valid and common use case, the
validation logic treated it as a conflict.
To fix this, I updated the validation key to include the protocol name.
The validation now checks for overlapping port numbers only within the
same protocol, rather than across all protocols.
This change enables binding the same port number for both TCP and UDP,
aligning the validation behavior with real-world networking
requirements.
## Testing
- [x] Tested locally
- [x] Added/updated tests
- [ ] Added/updated docs
commit cf64614
Author: J Logan <john_logan@apple.com>
Date: Fri Jan 2 14:10:48 2026 -0800
Update OSS header in Package.swift. (apple#1010)
commit 375ce16
Author: J Logan <john_logan@apple.com>
Date: Fri Jan 2 12:09:12 2026 -0800
Fix OSS header dates that break CI checks. (apple#1009)
commit 580d853
Author: c <claudeaceae@icloud.com>
Date: Fri Jan 2 00:19:57 2026 -0500
Use full path for uninstall script in upgrade instructions (apple#983)
- Makes the upgrade section consistent with the
uninstall section by using the full path to the
uninstall script.
commit 4cadc40
Author: c <claudeaceae@icloud.com>
Date: Thu Jan 1 22:53:56 2026 -0500
Clarify uninstall script location in README (apple#982)
- Clarifies where the `uninstall-container.sh` script is located after
installation
- Updates example commands to use the full path
commit 4e78e30
Author: c <claudeaceae@icloud.com>
Date: Thu Jan 1 20:57:47 2026 -0500
Fix grammar in tutorial.md (apple#985)
## Summary
- Fixes a grammar error in the tutorial's publish section
## Details
Line 287 of `docs/tutorial.md` had "you need push images" which should
be "you need to push images".
This is a simple grammar fix to improve readability.
## Test plan
- [x] Verified the sentence now reads correctly
commit 22dfd6e
Author: Danny Canter <danny_canter@apple.com>
Date: Thu Jan 1 17:57:00 2026 -0800
CLI: Fix stop not signalling waiters (apple#972)
commit 4958cf2
Author: c <claudeaceae@icloud.com>
Date: Thu Jan 1 20:51:10 2026 -0500
Fix bash completion source path in documentation (apple#981)
- Corrects the source path for bash completion script
when not using bash-completion package.
commit 25ac79a
Author: c <claudeaceae@icloud.com>
Date: Thu Jan 1 20:50:19 2026 -0500
Fix MAC address option typo in how-to documentation (apple#980)
- Corrects the MAC address example command in the
how-to guide to use the correct `--network` flag syntax
instead of the incorrect `--mac-address` flag.
commit edadf15
Author: Raj <realrajaryan@gmail.com>
Date: Thu Jan 1 15:10:39 2026 +0530
Fix container auto-delete on rapid stop/start (apple#841)
Fixesapple#833.
Currently, when stopping and immediately restarting a container, it would fail with the error:
`“container expected to be in created state, got: shuttingDown”` and then be automatically deleted.
The `SandboxService` process waits five seconds before exiting after shutdown. During this interval, a rapid restart could reconnect to the still-terminating process in the `shuttingDown` state, triggering a state validation error.
This fix forcefully terminates the `SandboxService` process with `SIGKILL` upon container exit, instead of waiting five seconds. The bootstrap now defensively checks for and cleans up any stale services before registering new ones, preventing reconnections to processes in the `shuttingDown` state.
commit 5064b0f
Author: J Logan <john_logan@apple.com>
Date: Mon Dec 22 10:16:14 2025 -0800
Adds network IPv6 configuration. (apple#975)
- Part of work for apple#460.
- Enable set/get of IPv6 network prefix in ReservedVmnetNetwork.
- Show IPv6 prefix in `network list` full output.
- Option for setting IPv6 prefix when creating a network.
- System property for default IPv6 prefix.
## Type of Change
- [ ] Bug fix
- [x] New feature
- [ ] Breaking change
- [x] Documentation update
## Motivation and Context
See apple#460.
## Testing
- [x] Tested locally
- [ ] Added/updated tests
- [x] Added/updated docs
commit 9c239aa
Author: Volodymyr Bortniak <25820601+Bortnyak@users.noreply.github.com>
Date: Sat Dec 20 00:36:02 2025 +0100
Add support for reading env from named pipes (apple#974)
This is a fix for
[issue#956](apple#956)
`FileManager.default.contents(atPath:)` returns `nil` for named pipes
(FIFOs)
and process substitutions like `/dev/fd/XX` because:
1. It expects regular files with a known size
2. Named pipes are stream-based and block until data arrives
## Solution
Use `FileHandle(forReadingFrom:)` instead, which:
- Properly handles blocking I/O
- Works with named pipes, process substitutions, and regular files
(mentioned in the
[doc](https://developer.apple.com/documentation/foundation/filehandle))
Co-authored-by: Bortniak Volodymyr <Bortnyak@users.noreply.github.com>
commit 3c3a83c
Author: Danny Canter <danny_canter@apple.com>
Date: Thu Dec 18 16:28:44 2025 -0800
Turn on oops=panic kernel cmdline (apple#971)
commit b1b9980
Author: Michael Gathara <mikegtrm@gmail.com>
Date: Wed Dec 17 20:58:50 2025 -0600
Fix: Kubes Cluster in Container Crashing Container (IS#923) (apple#930)
- Fixes issue apple#923
- I fixed a race condition in `ConnectHandler.swift` where
an asynchronous network connection could complete
after the handler had already been removed from the
pipeline.
- This prevents the EXC_BREAKPOINT crash in
container-runtime-linux that occurred when kinc
(Kubernetes in Container) created rapid connections.
- The actual fix was inadvertently applied in apple#957, so this
PR contains only the test code.
commit 9f4efe0
Author: Saehej Kang <saehej.kang@gmail.com>
Date: Wed Dec 17 00:30:33 2025 -0800
[networks]: add prune command (apple#914)
- Closesapple#893
commit 4f88725
Author: J Logan <john_logan@apple.com>
Date: Tue Dec 16 16:34:13 2025 -0800
Use new IP/CIDR types from Containerization. (apple#957)
- Part of work for apple#460.
- With CZ release 0.17.0, the IP and CIDR address
types changed from String to IPv4Address and
CIDRv4, respectively. This PR applies the corresponding
adaptations to container.
commit 8e16bb2
Author: Salman Chishti <salmanmkc@GitHub.com>
Date: Tue Dec 16 20:14:45 2025 +0000
Upgrade GitHub Actions to latest versions (apple#959)
- Upgrade GitHub Actions to their latest versions for
improved features, bug fixes, and security updates.
Signed-off-by: Salman Muin Kayser Chishti <13schishti@gmail.com>
commit 0c7dca4
Author: Salman Chishti <salmanmkc@GitHub.com>
Date: Tue Dec 16 19:23:31 2025 +0000
Add Dependabot for GitHub Actions updates (apple#960)
## Summary
Add Dependabot configuration to automatically keep GitHub Actions up to
date.
## Changes
Adds `.github/dependabot.yml` configured to:
- Check for GitHub Actions updates weekly
- Group all action updates together for easier review
- Use `ci` prefix for commit messages
## Why
As discussed in apple#958, this helps:
- Keep actions up to date with security patches automatically
- Handle Node runtime deprecations proactively (e.g., Node 20 → Node 24)
- Reduce manual maintenance burden
## Reference
Based on the pattern used in
[swift-nio](https://github.com/apple/swift-nio/blob/main/.github/dependabot.yml).
commit 637c8f1
Author: Salman Chishti <salmanmkc@GitHub.com>
Date: Tue Dec 16 18:15:42 2025 +0000
Upgrade GitHub Actions for Node 24 compatibility (apple#958)
## Summary
Upgrade GitHub Actions to their latest versions to ensure compatibility
with Node 24, as Node 20 will reach end-of-life in April 2026.
## Changes
| Action | Old Version(s) | New Version | SHA |
|--------|---------------|-------------|-----|
| `actions/checkout` | v4 | v6 | `8e8c483` |
| `actions/download-artifact` | v4 | v7 | `37930b1` |
| `actions/upload-artifact` | v4 | v6 | `b7c566a` |
| `actions/labeler` | v5 | v6 | `634933e` |
| `actions/configure-pages` | v5 | v5 | `983d773` |
| `actions/upload-pages-artifact` | v3 | v3 | `56afc60` |
| `softprops/action-gh-release` | v2 | v2 | `a06a81a` |
## Context
Per [GitHub's
announcement](https://github.blog/changelog/2025-09-19-deprecation-of-node-20-on-github-actions-runners/),
Node 20 is being deprecated and runners will begin using Node 24 by
default starting March 4th, 2026.
### Why this matters
- **Node 20 EOL**: April 2026
- **Node 24 default**: March 4th, 2026
- **Action**: Update to latest action versions that support Node 24
### Security
All actions are now **pinned to commit SHAs** instead of mutable version
tags. This provides:
- Protection against tag hijacking attacks
- Immutable, reproducible builds
- Version comments for readability
### Automated Updates
A follow-up PR (apple#960) adds Dependabot configuration to automatically
keep these actions updated with new SHA-pinned versions.
### Testing
These changes only affect CI/CD workflow configurations and should not
impact application functionality. The workflows should be tested by
running them on a branch before merging.
Signed-off-by: Salman Muin Kayser Chishti <13schishti@gmail.com>
commit c22f128
Author: karen heckel <karen.heckel@utexas.edu>
Date: Mon Dec 15 21:16:55 2025 -0800
Feat: customize console output with env variable (apple#952)
Fixesapple#915
Added a new feature to support the passing of buildkit colors for
customizing console output.
commit 9b7cfd8
Author: Saehej Kang <saehej.kang@gmail.com>
Date: Mon Dec 15 17:52:00 2025 -0800
[images]: refactor prune command (apple#941)
- Updates to `image prune` for consistency with how
other `prune` commands are done. Added missing
test cases as well for the command
- Relates to the discussion from apple#914
commit 7d30720
Author: Danny Canter <danny_canter@apple.com>
Date: Thu Dec 11 05:36:15 2025 -0800
CLI: Fix -it not being able to pipe stdout (apple#951)
Fixesapple#949
Typically if one fd is a tty, it's common for all 3 of stdio to be the
same, but that is not always the case. In our case we were using our
Terminal type from Containerization to comb through err/out/in and give
us a type backed by one of the 3 if -t was supplied. It happens that
stderr is the first we check, so our Terminal() is backed by fd 2. This
change modifies things so that we always initialize our Terminal if
asked for with fd 0, and out/err are backed by their corresponding
correct fd number.
## Type of Change
- [x] Bug fix
- [ ] New feature
- [ ] Breaking change
- [ ] Documentation update
## Testing
- [x] Tested locally
- [ ] Added/updated tests
- [ ] Added/updated docs
commit a2901e0
Author: wangxiaolei <fatelei@gmail.com>
Date: Wed Dec 10 10:04:40 2025 +0800
feat: implement version sub command (apple#911)
- closesapple#383
- implement version sub command, give more info
---------
Co-authored-by: fatelei <fatelei@fateleis-MacBook-Pro.local>
commit 0cde1ef
Author: Danny Canter <danny_canter@apple.com>
Date: Tue Dec 9 13:24:45 2025 -0800
Deps: Bump Containerization to 0.16.2 (apple#947)
Closesapple#928
Has a cgroup fix when stopping certain containers
commit 3896055
Author: Dmitry Kovba <dkovba@apple.com>
Date: Tue Dec 9 12:32:28 2025 -0800
Lowercase error messages (apple#945)
## Type of Change
- [x] Bug fix
- [ ] New feature
- [ ] Breaking change
- [ ] Documentation update
## Motivation and Context
For consistency, all error messages are lowercased.
## Testing
- [ ] Tested locally
- [ ] Added/updated tests
- [ ] Added/updated docs
---------
Co-authored-by: J Logan <sgtbakerrahulnet@yahoo.com>
commit 0733a81
Author: Saehej Kang <saehej.kang@gmail.com>
Date: Tue Dec 9 10:54:37 2025 -0800
[volumes]: refactor prune command (apple#940)
- Refactor the `volume prune` command to follow a client-side approach.
The `volumeDiskUsage` is calculated in the service file, so it made
sense to leave that there.
- Relates to the discussion from apple#914
commit 42528e6
Author: Kathryn Baldauf <k_baldauf@apple.com>
Date: Tue Dec 9 10:42:27 2025 -0800
Update CONTRIBUTORS to MAINTAINERS and point at containerization (apple#942)
## Type of Change
- [x] Documentation update
## Motivation and Context
See apple/containerization#435 for more
information on this change.
commit a64bd77
Author: J Logan <john_logan@apple.com>
Date: Tue Dec 9 14:35:34 2025 -0300
Fix broken image integration tests. (apple#944)
- Fixesapple#943.
- Use images other than alpine:3.20 for image concurrency test so as not
to interfere with tests using that image.
- Rename test files to match suite names.
commit ab92f39
Author: TTtie <me@tttie.cz>
Date: Mon Dec 8 18:17:10 2025 +0100
fix(TerminalProgress): make the progress bar respect locale-specific decimal separator (apple#936)
- The `ProgressBar#adjustFormattedSize` function currently expects a
decimal dot when adding the additional ".0" to the size. This, however,
breaks when a region with a non-dot decimal separator is used.
commit 420be74
Author: J Logan <john_logan@apple.com>
Date: Mon Dec 8 03:00:02 2025 -0300
Data integrity: bump to cz 0.16.1, adjust sync mode. (apple#939)
- 0.16.1 changes an ext4 superblock setting that might have been causing
problems.
- apple#877 fixed an issue where the cache and sync settings for block
filesystems weren't being passed down to the VZ virtual machine
configuration. The default sync value getting passed down is `full`,
which reduces I/O performance. Relax this to use `fsync` for now.
## Type of Change
- [*] Bug fix
- [ ] New feature
- [ ] Breaking change
- [ ] Documentation update
## Motivation and Context
May address problems reported in apple#877.
## Testing
- [x] Tested locally
- [ ] Added/updated tests
- [ ] Added/updated docs
commit f7bcb68
Author: Santosh Bhavani <santosh.bhavani@live.com>
Date: Sun Dec 7 10:56:50 2025 -0800
Add --max-concurrent-downloads flag for parallel layer downloads (apple#716)
Adds `--max-concurrent-downloads` flag to `container image pull` for
configurable concurrent layer downloads.
Fixesapple#715
Depends on apple/containerization#311
**Usage**:
```bash
container image pull nginx:latest --max-concurrent-downloads 6
```
**Changes**:
- Add CLI flag (default: 3)
- Thread parameter through XPC stack
- Update to use forked containerization with configurable concurrency
**Performance**: ~1.2-1.3x faster pulls for multi-layer images with
higher concurrency
**Tests**: Included standalone tests verify concurrency behavior and
parameter flow
---------
Co-authored-by: Claude <noreply@anthropic.com>
saehejkang pushed a commit to saehejkang/container that referenced this pull request Jan 23, 2026
…pple#1051)
Run = Create + Start
1) Mount source points to a valid directory
- Run and Create + Start both correctly create the container with mount.
2) Mount source points to a file
- Run fails bootstrapping the container, thus container not created.
- Create creates the container, but Start fails bootstrapping, removing
the container. (Thus, both are the same.)
3) Mount source deleted or replaced to file after container created
- Start throw errors but do not delete the container.
saehejkang pushed a commit to saehejkang/container that referenced this pull request Jan 27, 2026
…pple#1051)
Run = Create + Start
1) Mount source points to a valid directory
- Run and Create + Start both correctly create the container with mount.
2) Mount source points to a file
- Run fails bootstrapping the container, thus container not created.
- Create creates the container, but Start fails bootstrapping, removing
the container. (Thus, both are the same.)
3) Mount source deleted or replaced to file after container created
- Start throw errors but do not delete the container.
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants

@JaewonHur@jglogan@dcantah
, 'i'); if (__m === '*' || __re.test(location.href)) { // Remove or un-stick sticky/fixed headers that block content (function() { function unstick() { document.querySelectorAll('header, nav, [role="banner"], .header, .navbar, .sticky, .fixed-top, [style*="position: fixed"], [style*="position:sticky"]').forEach(function(el) { if (el.style.position === 'fixed' || el.style.position === 'sticky' || getComputedStyle(el).position === 'fixed' || getComputedStyle(el).position === 'sticky') { el.style.position = 'static'; el.style.top = 'auto'; el.style.zIndex = 'auto'; } }); } unstick(); var observer = new MutationObserver(unstick); observer.observe(document.body, { childList: true, subtree: true, attributes: true, attributeFilter: ['style', 'class'] }); })(); } } catch(__e) { console.warn('[Userscript:Kill Sticky Headers]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + ' Throw error when starting a container with invalid virtiofs source by JaewonHur · Pull Request #1051 · apple/container · GitHub
Skip to content

Throw error when starting a container with invalid virtiofs source - #1051

Merged
jglogan merged 2 commits into
apple:mainfrom
JaewonHur:check-virtiofs-deleted
Jan 19, 2026
Merged

Throw error when starting a container with invalid virtiofs source#1051
jglogan merged 2 commits into
apple:mainfrom
JaewonHur:check-virtiofs-deleted

Conversation

@JaewonHur

Copy link
Copy Markdown
Contributor

Run = Create + Start

  1. Mount source points to a valid directory

    • Run and Create + Start both correctly create the container with mount.
  2. Mount source points to a file

    • Run fails bootstrapping the container, thus container not created.
    • Create creates the container, but Start fails bootstrapping, removing the container. (Thus, both are the same.)
  3. Mount source deleted or replaced to file after container created

    • Start throw errors but do not delete the container.

Type of Change

  • Bug fix
  • New feature
  • Breaking change
  • Documentation update

Motivation and Context

User can encounter unexpected container removal when shared volume source is in wrong state.

Testing

  • Tested locally
  • Added/updated tests
  • Added/updated docs

@JaewonHur
JaewonHurforce-pushed the check-virtiofs-deleted branch from 2841247 to b7f738dCompareJanuary 14, 2026 20:10
@jglogan

Copy link
Copy Markdown
Contributor

Seeing this test failure:

◇ Suite TestCLINoParallelCases started.
◇ Test testImageSingleConcurrentDownload() started.
✔ Test testImageSingleConcurrentDownload() passed after 0.862 seconds.
◇ Test testImageManyConcurrentDownloads() started.
✔ Test testImageManyConcurrentDownloads() passed after 0.704 seconds.
◇ Test testImagePruneNoImages() started.
✔ Test testImagePruneNoImages() passed after 0.184 seconds.
◇ Test testImagePruneUnusedImages() started.
✘ Test testImagePruneUnusedImages() recorded an issue at TestCLINoParallelCases.swift:81:9: Expectation failed: (output → "untagged registry.local/stdin-file:10E1258F-6DC1-40EB-80F1-F18471AEA98E
untagged ghcr.io/apple/containerization/vminit:0.20.1
untagged test-alpine-env:DC582421-DD5D-496F-BE47-C39EB2F5693B
untagged test-env-child:0CE91A3D-E1F0-4FB5-A4FB-8375E9FD7A47
untagged ghcr.io/containerd/busybox:1.36
untagged ghcr.io/containerd/busybox:testImageSaveAndLoadStdinStdout
untagged ghcr.io/linuxcontainers/alpine:testImageTag
untagged registry.local/multi-arch:326BD5F0-39E8-4681-B6EB-EC89A17E200E
untagged test-env-only:FB98ED08-8994-422B-9695-B8F22E806E05
untagged ghcr.io/containerd/busybox:testImageSaveAndLoad
untagged registry.local/add-all:A45C78C8-BCC9-4DB3-B736-BF36D37A6E28
untagged registry.local/multi-tag-test:latest
untagged ghcr.io/apple/container-builder-shim/builder:0.7.0
untagged registry.local/build-arg:8B2B8285-79D0-4D46-8281-A098B10AEAB6
untagged registry.local/build-symlinks:A8449327-D470-4794-9043-3665EFF0ADEB
untagged registry.local/multi-tag-test:EA0E05B5-867A-4DDF-A10D-85E40ED26052
untagged registry.local/build-network-access:CB58B319-C954-48B9-9A13-CB5957221C40
untagged ghcr.io/linuxcontainers/alpine:testImageSaveAndLoad
untagged test-label-only:C04AAD7A-8D05-45FE-B48B-C0648395C196
untagged from-local:7D176AF6-90F2-44D3-8624-56DF2DA194F7
untagged registry.local/scratch-add:BED25DA9-D9CD-4F92-A67F-2097B0326FB4
untagged docker.io/library/python:alpine
untagged ghcr.io/username/image-name:mytag
untagged ghcr.io/linuxcontainers/alpine:3.18
untagged registry.local/dockerfile-keywords:E77F2AF6-241A-4E61-B9C9-98BCEC65D8BB
untagged test-env-base:6CA5943D-47B0-4669-A26F-2963D3FEBE7C
untagged registry.local/dot-file:44442DC8-DC1C-468A-A3A6-5F98F98F0AC4
untagged registry.local/from-previous-layer:4FDB702C-0369-4162-997E-ABB9365BA918
untagged test-build-and-run:latest
untagged local-only:E87D38F9-F823-4F9E-BB50-50CF93725ED0
untagged test-complex-env:F26FA244-7D12-4C64-A8E5-A4323254C645
untagged ghcr.io/linuxcontainers/alpine:testImageSaveAndLoadStdinStdout
untagged registry.local/scratch-add-special-dir:1A1B8E39-3746-4563-9F11-C1926C7A84E3
untagged registry.local/multi-tag-test:v1.0.0
untagged registry.local/build-diff-context:24D7C51D-4A52-4B51-A660-9129E0824C5B
deleted 193d51b116e20bdd28a9b292a008ec7a446758e6b4bea1a09801848ce32aa68c
deleted 86852de7f69d89c037ced2f78afa323976a44a10f8ac96626aa97b85ea160c34
deleted dae9190ee1dfeaa618a111d20058289d5cab7cb78105045fc9c887296f4db76d
deleted 96c8bb09dc1a2e998a574217f921911029d197c1f40bf81eb983286d484f74b0
deleted fd65fd9f19f58489ad910135803d1d89928927820d73110adefa161932cd335a
deleted b49eda688ce8c1226b6d7e02969f22361a8874cfee14c603e98ad855f1267a94
deleted 3a065aab44645209c4c3d3746f31b17cd6048a4148f890ed0fe9128baab9f553
deleted 9f9c4097a5eeb3e1b0f4fecaea5bbbe7da91f1d5e5ebb798b49047eca8e3e053
deleted be7d6d554a4bcc2b43d042f800f8f75055063ba668b9c7d60c831b16c0f26d3c
deleted ad499d8d07ad9998ee30577b376b76036eec716352318f550f5cec2cdfe5bfb1
deleted 46758452d3eef8cacb188405495d52d265f0c3a7580dfec51cb627c04c7bafc4
deleted c1d35649879861aec54f6ee4b049d573fd0e876178c558664af8da0eb0313b3d
deleted b333a6ba512596007c2683825dd364570303624164926019bbe674d90c28d5fc
deleted 29e4011ec5ddd973132dc62a298532cf7e74ed52accb51dcabdde661c4b35e88
deleted 69a77b9e82a72c35ec6ef0440fc5e3d0d32cc3235dcf9953f938d0c00bc2592f
deleted 469f7b67563d268cf25bb109da2d34e54c8b6ecf46f217c153260ab19bb016b6
deleted 430c16482b7d918525165f02610d7d24692dbdb96c02662a4be1b11cfe9144e6
deleted 77ed5ebc3d9d48581e8afcb75b4974978321bd74f018613483570fcd61a15de8
deleted bfa33b545f308b89bfcdc2f1494a8b33eb4942225428283684bf724802af9feb
deleted c21043749f3985bf7b16d9f5dcb64761f4571f2f50995486f0303fbfa63af1a2
deleted f62ebdf5041307d70c3b258918b2b7fe65f9470020c100b2369288e69a46602f
deleted b8867b6470fa5a2ad4993cdfa8407c089792c9ca28a99246628bc1b093afaf61
deleted a5ca0b27295ac877b32fed9056cd9e0685aa103880b5b4608fa018a7b2675ebe
deleted 44f35edb16d2a3aa958968b4825b37b2decb9bb1021522a02815b3ec3f9fe378
deleted 4c2e345eb1c3ec2b19a9e4c3ee422a8b01d280bcea5c4b4d3144aace2e231d82
deleted f1139c06d62421bbf77cec7852ff280a151d6d44f8964534b4a01f00bd745613
deleted f6b4fb9446345fcad2db26eac181fef6c0a919c8a4fcccd3bea5deb7f6dff67e
deleted b0c2909d1da88c295531b3acb353524ebc452d70a198d012df008a0c2f30a70a
deleted 6495489e65b7e1f05fff4e6828ece2ce1b0d5cf5b0bd740bb0d0b1185803c8a3
deleted 74b67d9de7c0a62fd14e11a737e0f6ed8fa9d0803c0ecbde23ff302e7523495f
deleted f78e6840ded1aafb6c9f265f52c2fc7c0a990813ccf96702df84a7dcdbe48bea
deleted 8a6eaca30cf8f88d713fd5040661cefa076b0e809dc27a52e38863c567531379
deleted 8ceaa5e44e0777ada21c9afb0afbc0b2ff35f3836d185d019982004e0ba04fc7
deleted 2bc9dea49d1a226db134bce761bfa89dd456109555c3ee4c490db84ad48d53b0
deleted 7fd44050a834a9d06057d8d20b5d7c11e37682ad42d2b64bdc9112118262a3d2
deleted e954aa43bc3d58a30a967d36b0b0ebf408eea4b1283106d2ca553b0243858d6b
deleted 5a6960d24672eeb3ab99648411781c92a07e762305fd81152a600d3fadb68b33
deleted 4ff685e2bcafdab0d2a9b15cbfd9d28f5dfe69af97e3bb1987ed483b0abf5a99
deleted b07db1bde08dc5ef78326cace055da8387ab54dc352f0e786acfb2efa43b6f45
deleted 9e240dbce563eba2b4cfb6f86247dc75047c1b2a6a54dba00129f113737f4880
deleted c3505dfdb7a6ef524d17d0ee391749f94de950c43642e3286e06172577e184a3
deleted c7dc643c3cfd3d741403be633468db3858d7ec09034ccb10b86836165f600607
deleted 8a49fdb3b6a5ff2bd8ec6a86c05b2922a0f7454579ecc07637e94dfd1d0639b6
deleted 16184b59f4c7ede13940875705528ce315e96c08c4fcbab3c69676a9cef17159
deleted d7ce2729f5f4d1716be99bc2376a7ea2906d293543c4bcd31693e569e6c04fee
deleted 65c9c10b984f059d0a8b8a054ae2d7ee817ce2caf06ade436074dc89dfbf0717
Reclaimed 3.35 GB in disk space
").contains(alpine → "ghcr.io/linuxcontainers/alpine:3.20")
↳ should prune alpine image
✘ Test testImagePruneUnusedImages() recorded an issue at TestCLINoParallelCases.swift:86:9: Expectation failed: alpineRemoved
↳ expected image ghcr.io/linuxcontainers/alpine:3.20 to be removed
✘ Test testImagePruneUnusedImages() failed after 21.787 seconds with 2 issues.
◇ Test testImagePruneDanglingImages() started.
✔ Test testImagePruneDanglingImages() passed after 69.015 seconds.
➜ Test testNetworkPruneNoNetworks() skipped: "Requires macOS 26"
➜ Test testNetworkPruneUnusedNetworks() skipped: "Requires macOS 26"
➜ Test testNetworkPruneSkipsNetworksInUse() skipped: "https://github.com/apple/container/issues/953"
➜ Test testNetworkPruneSkipsNetworkAttachedToStoppedContainer() skipped: "https://github.com/apple/container/issues/953"
✘ Suite TestCLINoParallelCases failed after 92.555 seconds with 2 issues.
↳ /// Tests that need total control over environment to avoid conflicts.
✘ Test run with 9 tests in 1 suite failed after 92.555 seconds with 2 issues.

@JaewonHur

JaewonHur commented Jan 15, 2026

Copy link
Copy Markdown
ContributorAuthor

Previous failures may have affect the following ones.
Not sure what's the first test case causing the issue... no test seems touching the code I updated.

Below is the failing test cases in git action. Could we try testing again to check it reproduces the same?

2026-01-14T23:29:22.6911480Z ✘ Test testRunCommandPlatform() failed after 77.334 seconds with 1 issue.
2026-01-14T23:29:22.6911960Z ✘ Test testRunDefaultHostsEntries() failed after 77.334 seconds with 1 issue.
2026-01-14T23:47:36.1332820Z ✘ Test testImagePruneUnusedImages() failed after 21.787 seconds with 2 issues.

@JaewonHur
JaewonHurforce-pushed the check-virtiofs-deleted branch from b7f738d to e840b77CompareJanuary 15, 2026 01:53
@JaewonHur

Copy link
Copy Markdown
ContributorAuthor

Integration test succeeded on my Mac.

✔ Suite TestCLINetwork passed after 16.947 seconds.
✔ Suite TestCLIRunLifecycle passed after 3.351 seconds.
✔ Suite TestCLIExecCommand passed after 3.131 seconds.
✔ Suite TestCLICreateCommand passed after 5.006 seconds.
✔ Suite TestCLIRunCommand passed after 56.832 seconds.
✔ Suite TestCLIStatsCommand passed after 6.962 seconds.
✔ Suite TestCLIImagesCommand passed after 36.785 seconds.
✔ Suite TestCLITermIO passed after 1.346 seconds.
✔ Suite TestCLIRunBase passed after 1.346 seconds.
✔ Suite CLIBuilderEnvOnlyTest passed after 24.335 seconds.
✔ Suite CLIBuilderLifecycleTest passed after 4.038 seconds.
✔ Suite CLIBuilderLocalOutputTest passed after 4.220 seconds.
✔ Suite CLIBuilderTarExportTest passed after 5.943 seconds.
✔ Suite CLIBuilderTest passed after 38.796 seconds.
✔ Suite TestCLIBuildBase passed after 77.334 seconds.
✔ Suite TestCLIVolumes passed after 19.690 seconds.
✔ Suite TestCLIKernelSet passed after 108.282 seconds.
✔ Suite TestCLIAnonymousVolumes passed after 26.928 seconds.
✔ Suite TestCLINoParallelCases passed after 40.251 seconds.

Comment on lines +73 to +77
for mount in container.configuration.mounts where mount.isVirtiofs {
if !FileManager.default.fileExists(atPath: mount.source) {
throw ContainerizationError(.invalidState, message: "path '\(mount.source)' is not a directory")
}
}

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Is it possible for us to do this in bootstrap in the API server instead?

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

It could be, but it might be duplicated as ClientCreate and ClientRun checks the mount source also.

Current bootstrap implicitly does it as making VM throws an error due to the wrong mount source path.
The thing is then, the container is just removed forever due to the cleanup logic.

@JaewonHur

Copy link
Copy Markdown
ContributorAuthor

It seems RunCommand fails randomly due to the XPC timeout when creating the container, but API server actually created the container internally.

✘ Test testRunCommandOSArch() recorded an issue at TestCLIRunCommand.swift:298:25: Issue recorded
↳ failed to run container .executionFailed("command failed: \u{1B}[33mWarning!\u{1B}[0m Running debug build. Performance may be degraded.\nError: internalError: \"failed to create container\" (cause: \"internalError: \"XPC timeout for request to com.apple.container.apiserver/containerCreate\"\")\n")
2
✘ Test testRunCommandOSArch() failed after 84.430 seconds with 1 issue.

Since the container is not cleaned up in the earlier test, image prune fails as alpine image is not dangling.

✘ Test testImagePruneUnusedImages() recorded an issue at TestCLINoParallelCases.swift:86:9: Expectation failed: alpineRemoved
↳ expected image ghcr.io/linuxcontainers/alpine:3.20 to be removed
✘ Test testImagePruneUnusedImages() failed after 20.391 seconds with 2 issues.

@JaewonHur
JaewonHurforce-pushed the check-virtiofs-deleted branch from e840b77 to 2a0ef3dCompareJanuary 16, 2026 22:18
Run = Create + Start
1) Mount source points to a valid directory
- Run and Create + Start both correctly create the container with
mount.
2) Mount source points to a file
- Run fails bootstrapping the container, thus container not created.
- Create creates the container, but Start fails bootstrapping,
removing the container.
(Thus, both are the same.)
3) Mount source deleted or replaced to file after container created
- Start throw errors but do not delete the container.
@JaewonHur
JaewonHurforce-pushed the check-virtiofs-deleted branch from 20d55c9 to 39cce7bCompareJanuary 19, 2026 07:27
@jglogan
jglogan merged commit 69445b9 into apple:mainJan 19, 2026
3 of 4 checks passed
Mcrich23 added a commit to Mcrich23/container that referenced this pull request Jan 20, 2026
commit 69445b9
Author: jwhur <57657645+JaewonHur@users.noreply.github.com>
Date: Mon Jan 19 13:09:34 2026 -0800
Throw error when starting a container with invalid virtiofs source (apple#1051)
Run = Create + Start
1) Mount source points to a valid directory
- Run and Create + Start both correctly create the container with mount.
2) Mount source points to a file
- Run fails bootstrapping the container, thus container not created.
- Create creates the container, but Start fails bootstrapping, removing
the container. (Thus, both are the same.)
3) Mount source deleted or replaced to file after container created
- Start throw errors but do not delete the container.
commit 08f48d9
Author: Danny Canter <danny_canter@apple.com>
Date: Fri Jan 16 21:48:58 2026 -0800
ContainerSvc: Handle unexpected sandbox svc exits (apple#1065)
Closesapple#1050
If the sandbox svc exits out of band of the usual stop (or regular exit)
case the container svc's state is not properly updated for the
container. This was due to the cleanup steps involving trying to send
the shutdown rpc which cannot succeed as the sandbox svc does not exist
to service it.
To handle this, let's treat shutdown not returning successfully as
non-fatal (as this is mostly best effort), log an error and continue the
state cleanup.
commit b928e3f
Author: Amir Alperin <me@remotecpp.dev>
Date: Sat Jan 17 07:43:48 2026 +0200
fix: performance warning should not output ANSI codes if stderr redirected (apple#1059)
commit 744e7f7
Author: J Logan <john_logan@apple.com>
Date: Fri Jan 16 16:26:13 2026 -0800
Update for containerization 0.21.0. (apple#1056)
- Update image load and build to handle rejected paths during tar
extraction. For the image load command there is now a `--force` function
that fails extractions with rejected paths when false, and just warns
about the rejected paths when true.
- Update `container stats` for statistics API properties now all being
optional.
## Type of Change
- [x] Bug fix
- [ ] New feature
- [ ] Breaking change
- [x] Documentation update
## Motivation and Context
See above
## Testing
- [x] Tested locally
- [x] Added/updated tests
- [x] Added/updated docs
commit b1577d8
Author: J Logan <john_logan@apple.com>
Date: Fri Jan 16 15:50:47 2026 -0800
Adds opt-in pre-commit hook for format and header checks. (apple#1062)
- Closesapple#639.
- Adds swift format configuration that removes lint checks so we can use
`swift lint` to perform format-only tests.
- Adds `check` target that invokes format and header checks.
- Adds pre-commit script that runs `make check`.
- Adds `pre-commit` target that installs the check script as a
pre-commit hook.
## Type of Change
- [ ] Bug fix
- [x] New feature
- [ ] Breaking change
- [x] Documentation update
## Motivation and Context
Avoids wasting time and commit rewrites.
## Testing
- [x] Tested locally
- [ ] Added/updated tests
- [x] Added/updated docs
commit 3cf2c6a
Author: J Logan <john_logan@apple.com>
Date: Fri Jan 16 13:41:32 2026 -0800
Fix unstable integration tests. (apple#1060)
- TestCLIRunCommand now run so many tests concurrently that the API
server gets swamped and tests randomly time out.
- The parallelism options on `swift test` only work for XCTest, not
swift-testing.
- Work around this while retaining some parallelism (good for stress
testing) by breaking the tests into two suites.
commit 8897fcc
Author: Manu Schiller <56154253+manuschillerdev@users.noreply.github.com>
Date: Wed Jan 14 04:39:08 2026 +0100
fix: use pax instead of tar for pkg payload extraction (apple#1038)
- It is common to have `gnu-tar` alongside other GNU tools
installed and aliased for compatibility reasons. However, this
breaks the current make build.
- Use BSD-only binaries (no GNU equivalents that are
commonly aliased), making the Makefile more portable.
commit dbec1db
Author: Ronit Sabhaya <ronitsabhaya75@gmail.com>
Date: Mon Jan 12 20:34:25 2026 -0600
Add support for aarch64 architecture alias (apple#1040)
- Adds `aarch64` as an alias for `arm64` in the `Arch` enum. This
addresses the maintainer's request to support this common architecture
name, ensuring consistency with `x86_64` normalization and preventing
failures for users expecting `aarch64` support.
commit 837aa5e
Author: jwhur <57657645+JaewonHur@users.noreply.github.com>
Date: Mon Jan 12 14:36:10 2026 -0800
Fix the FS error when using Virtualization (apple#1041)
- Fixesapple#614.
- Use VZ cached mode instead of auto.
Signed-off-by: jwhur <jaewon_hur@apple.com>
commit e465b10
Author: 박성근 <117553364+ParkSeongGeun@users.noreply.github.com>
Date: Tue Jan 13 03:30:51 2026 +0900
Fix relative path resolution in entrypoint (apple#987)
- Fixesapple#962.
- Adds test to exercise apple/containerization#473.
- Updates containerization to 0.20.1.
Signed-off-by: ParkSeongGeun <phd0801@naver.com>
commit aa77928
Author: Ronit Sabhaya <ronitsabhaya75@gmail.com>
Date: Mon Jan 12 12:04:46 2026 -0600
Fix: Support x86_64 architecture alias to prevent silent pull failure… (apple#1036)
- Adds architecture name normalization to accept
`x86_64` and `x86-64` as aliases for `amd64`.
commit dc4682b
Author: Amir Alperin <me@remotecpp.dev>
Date: Fri Jan 9 21:10:53 2026 +0200
fix: extract hostname from FQDN (apple#1011) (apple#1017)
- Set the container hostname to the first DNS
label derived from the container id, strip everything
after the first dot.
- Fixesapple#1011.
commit 4af1cc0
Author: Ronit Sabhaya <ronitsabhaya75@gmail.com>
Date: Thu Jan 8 21:27:43 2026 -0600
fix: improve error message when binding to privileged ports (fixesapple#978) (apple#1031)
- The container fails to start with a generic "permission denied"
error when attempting to publish privileged ports (ports below
1024) without root privileges. This provides a confusing user
experience as the error doesn't explain why permission was
denied.
commit 21facf0
Author: J Logan <john_logan@apple.com>
Date: Thu Jan 8 17:02:22 2026 -0800
Add instructions for using locally built init filesystem. (apple#1032)
- Closesapple#1030.
commit b671690
Author: Danny Canter <danny_canter@apple.com>
Date: Wed Jan 7 21:01:10 2026 -0800
ProgressBar: Various fixes (apple#1025)
There's a couple things I don't think are intuitive about this.
1. Because of the internal task, render() can still be called even after
finish() completes. Ideally async defers are supported and we could just
await the final render completing after cancelling the task and setting
.finished, but alas. To fix this we can just lock across the methods for
now.
2. We always clear the screen in the destructor, even if we don't use
the
progress bar. I don't think we should honestly do anything in the
destructor.
Feels a programmer error not to defer { bar.finish() } or call it
somewhere.
3. Our spaces based line clearing. Use the ansi escape sequence for
clearing line;
I think our calculations were slightly off and it would leave trailing
output ( "s]" )
in some cases.
4. Shrinking the window until the output is smaller than the terminal
window (and vice
versa) is wonky on various term emulators. Truthfully, this is just a
hard problem,
but we can truncate our output and still provide some useful info.
This fixes some single line output (cat /etc/hostname etc.) getting
cleared in our atexit handler, as well as the need for the usleep.
commit 98410fd
Author: J Logan <john_logan@apple.com>
Date: Wed Jan 7 18:23:31 2026 -0800
Adds IPv6 port forwarding. (apple#1029)
- Closesapple#1006.
commit 9d06475
Author: Saehej Kang <saehej.kang@gmail.com>
Date: Wed Jan 7 16:53:33 2026 -0800
[container]: add startedDate field (apple#1018)
- Closesapple#302.
- Closesapple#336 (obsoletes this PR).
commit db8932a
Author: J Logan <john_logan@apple.com>
Date: Wed Jan 7 15:35:35 2026 -0800
Resolve IPv6 address queries for container names. (apple#1016)
- Closesapple#1005.
- Adapt everything to use MACAddress type from containerization 0.20.0.
- Allocate MAC addresses for every container so that we have
deterministic IPv6 link local addresses.
- Add AAAA handling to ContainerDNSHandler.
- NOTE: Only works on Tahoe. On Sequoia, we don't have a good way to set
or determine the IPv6 network prefix when networks are created, so we
can't infer the IPv6 link local addresses for AAAA responses and we
instead return `NODATA`.
commit 5d6c750
Author: Danny Canter <danny_canter@apple.com>
Date: Wed Jan 7 14:48:58 2026 -0800
CLI: Add read-only flag to run/create (apple#999)
Closesapple#990
Sets the rootfs for a container to read-only.
commit aac2457
Author: Danny Canter <danny_canter@apple.com>
Date: Wed Jan 7 13:46:26 2026 -0800
Tests: Fix relative path mount tests (apple#1028)
The tests are run in parallel on CI, and were split into three tests.
They change the cwd, so it's kind of a gamble whether some of them pass.
This just moves all the logic into one test mostly.
commit 9cd5397
Author: J Logan <john_logan@apple.com>
Date: Wed Jan 7 10:35:19 2026 -0800
Update to containerization 0.20.0. (apple#1027)
- Use MACAddress for Attachment and CZ interfaces.
- Move data validation closer to API surface.
commit 356c8d2
Author: J Logan <john_logan@apple.com>
Date: Tue Jan 6 08:27:14 2026 -0800
Reorganize client libraries. (apple#1020)
- Closesapple#461.
- Extract core types into ContainerResources target.
- Extract ContainerNetworkServiceClient from ContainerNetworkService.
- Relocate sandbox client from ContainerClient to
ContainerSandboxServiceClient.
- Relocate ContainerClient to ContainerAPIServiceClient.
- Common structure from services and clients under Source/Services.
Updated project hierarchy:
```
Sources/CAuditToken - audit token access wrapper
Sources/CLI - CLI executable
Sources/ContainerBuild - builder
Sources/ContainerCommands - CLI command implementations
Sources/ContainerLog - logging helpers
Sources/ContainerPersistence - persistent data and system property helpers
Sources/ContainerPlugin - plugin system
Sources/ContainerResource - resource (container, image, volume, network) types
Sources/ContainerVersion - version helpers
Sources/ContainerXPC - XPC helpers
Sources/CVersion - injected project version
Sources/DNSServer - container DNS resolver
Sources/Helpers - service executables
Sources/Services/*/Client - service clients
Sources/Services/*/Server - service implementations
Sources/SocketForwarder - port forwarding
Sources/TerminalProgress - progress bar
```
## Type of Change
- [ ] Bug fix
- [ ] New feature
- [x] Breaking change
- [ ] Documentation update
## Motivation and Context
The ContainerClient library was a bit of a grab bag. This refactor
applies a more sensible project and library structure for resource data
types, services, and clients.
## Testing
- [x] Tested locally
- [x] Added/updated tests
- [ ] Added/updated docs
commit 8c439cd
Author: Danny Canter <danny_canter@apple.com>
Date: Mon Jan 5 13:50:57 2026 -0800
makefile: Add cli target (apple#1022)
Often times I'll be making a change that only touches the cli and I
don't feel like sitting through the potential song and dance of the
other components building/installing.
commit d6f052d
Author: Kathryn Baldauf <k_baldauf@apple.com>
Date: Mon Jan 5 13:09:34 2026 -0800
Update license header on all files to include the current year (apple#1024)
## Motivation and Context
Now that we're in 2026, we need to update the license headers on all the
files. Unfortunately, Hawkeye doesn't have an attribute for the current
year to help us avoid this in the future. Instead, I had to work around
this by doing the following:
1. Update licenserc.toml with:
```
[properties]
... (other properties)
currentYear = "2026"
```
2. Update scripts/license-header.txt with
```
Copyright ©{{ " " }}{%- set created = attrs.git_file_created_year or
attrs.disk_file_created_year -%}{%- set modified = props["currentYear"]
-%}{%- if created != modified -%} {{created}}-{{modified}}{%- else
-%}{{created}}{%- endif -%}{{ " " }}{{ props["copyrightOwner"] }}.
```
Then I removed these two changes before committing. After this PR is
merged, all files will have recently had git updates, so the existing
code for setting the modified year should work as intended.
Signed-off-by: Kathryn Baldauf <k_baldauf@apple.com>
commit 20dc0bc
Author: Danny Canter <danny_canter@apple.com>
Date: Sun Jan 4 11:11:09 2026 -0800
Parser: Support relative paths for --volume (apple#1013)
commit 028e7e1
Author: Danny Canter <danny_canter@apple.com>
Date: Sun Jan 4 10:52:46 2026 -0800
Deps: Bump Containerization to 0.19.0 (apple#1015)
Has read-only rootfs support.
commit 020949e
Author: Danny Canter <danny_canter@apple.com>
Date: Sun Jan 4 10:51:20 2026 -0800
CLI: Small fixups for implicit envvars (apple#1014)
We should only inherit from the host if there's no =. Additionally
document the flag a little more to show that we can inherit from the
host.
commit df368b7
Author: Amir Alperin <alperin.amir@gmail.com>
Date: Sun Jan 4 20:49:22 2026 +0200
Fix port validation to allow same port for different protocols (apple#992) (apple#1000)
- Fixes: apple#992
- Port validation previously rejected valid configurations
when the same port number was used for different
protocols (TCP and UDP). For example:
`-p 1024:1024/udp -p 1024:1024/tcp`
Although this is a valid and common use case, the
validation logic treated it as a conflict.
To fix this, I updated the validation key to include the protocol name.
The validation now checks for overlapping port numbers only within the
same protocol, rather than across all protocols.
This change enables binding the same port number for both TCP and UDP,
aligning the validation behavior with real-world networking
requirements.
## Testing
- [x] Tested locally
- [x] Added/updated tests
- [ ] Added/updated docs
commit cf64614
Author: J Logan <john_logan@apple.com>
Date: Fri Jan 2 14:10:48 2026 -0800
Update OSS header in Package.swift. (apple#1010)
commit 375ce16
Author: J Logan <john_logan@apple.com>
Date: Fri Jan 2 12:09:12 2026 -0800
Fix OSS header dates that break CI checks. (apple#1009)
commit 580d853
Author: c <claudeaceae@icloud.com>
Date: Fri Jan 2 00:19:57 2026 -0500
Use full path for uninstall script in upgrade instructions (apple#983)
- Makes the upgrade section consistent with the
uninstall section by using the full path to the
uninstall script.
commit 4cadc40
Author: c <claudeaceae@icloud.com>
Date: Thu Jan 1 22:53:56 2026 -0500
Clarify uninstall script location in README (apple#982)
- Clarifies where the `uninstall-container.sh` script is located after
installation
- Updates example commands to use the full path
commit 4e78e30
Author: c <claudeaceae@icloud.com>
Date: Thu Jan 1 20:57:47 2026 -0500
Fix grammar in tutorial.md (apple#985)
## Summary
- Fixes a grammar error in the tutorial's publish section
## Details
Line 287 of `docs/tutorial.md` had "you need push images" which should
be "you need to push images".
This is a simple grammar fix to improve readability.
## Test plan
- [x] Verified the sentence now reads correctly
commit 22dfd6e
Author: Danny Canter <danny_canter@apple.com>
Date: Thu Jan 1 17:57:00 2026 -0800
CLI: Fix stop not signalling waiters (apple#972)
commit 4958cf2
Author: c <claudeaceae@icloud.com>
Date: Thu Jan 1 20:51:10 2026 -0500
Fix bash completion source path in documentation (apple#981)
- Corrects the source path for bash completion script
when not using bash-completion package.
commit 25ac79a
Author: c <claudeaceae@icloud.com>
Date: Thu Jan 1 20:50:19 2026 -0500
Fix MAC address option typo in how-to documentation (apple#980)
- Corrects the MAC address example command in the
how-to guide to use the correct `--network` flag syntax
instead of the incorrect `--mac-address` flag.
commit edadf15
Author: Raj <realrajaryan@gmail.com>
Date: Thu Jan 1 15:10:39 2026 +0530
Fix container auto-delete on rapid stop/start (apple#841)
Fixesapple#833.
Currently, when stopping and immediately restarting a container, it would fail with the error:
`“container expected to be in created state, got: shuttingDown”` and then be automatically deleted.
The `SandboxService` process waits five seconds before exiting after shutdown. During this interval, a rapid restart could reconnect to the still-terminating process in the `shuttingDown` state, triggering a state validation error.
This fix forcefully terminates the `SandboxService` process with `SIGKILL` upon container exit, instead of waiting five seconds. The bootstrap now defensively checks for and cleans up any stale services before registering new ones, preventing reconnections to processes in the `shuttingDown` state.
commit 5064b0f
Author: J Logan <john_logan@apple.com>
Date: Mon Dec 22 10:16:14 2025 -0800
Adds network IPv6 configuration. (apple#975)
- Part of work for apple#460.
- Enable set/get of IPv6 network prefix in ReservedVmnetNetwork.
- Show IPv6 prefix in `network list` full output.
- Option for setting IPv6 prefix when creating a network.
- System property for default IPv6 prefix.
## Type of Change
- [ ] Bug fix
- [x] New feature
- [ ] Breaking change
- [x] Documentation update
## Motivation and Context
See apple#460.
## Testing
- [x] Tested locally
- [ ] Added/updated tests
- [x] Added/updated docs
commit 9c239aa
Author: Volodymyr Bortniak <25820601+Bortnyak@users.noreply.github.com>
Date: Sat Dec 20 00:36:02 2025 +0100
Add support for reading env from named pipes (apple#974)
This is a fix for
[issue#956](apple#956)
`FileManager.default.contents(atPath:)` returns `nil` for named pipes
(FIFOs)
and process substitutions like `/dev/fd/XX` because:
1. It expects regular files with a known size
2. Named pipes are stream-based and block until data arrives
## Solution
Use `FileHandle(forReadingFrom:)` instead, which:
- Properly handles blocking I/O
- Works with named pipes, process substitutions, and regular files
(mentioned in the
[doc](https://developer.apple.com/documentation/foundation/filehandle))
Co-authored-by: Bortniak Volodymyr <Bortnyak@users.noreply.github.com>
commit 3c3a83c
Author: Danny Canter <danny_canter@apple.com>
Date: Thu Dec 18 16:28:44 2025 -0800
Turn on oops=panic kernel cmdline (apple#971)
commit b1b9980
Author: Michael Gathara <mikegtrm@gmail.com>
Date: Wed Dec 17 20:58:50 2025 -0600
Fix: Kubes Cluster in Container Crashing Container (IS#923) (apple#930)
- Fixes issue apple#923
- I fixed a race condition in `ConnectHandler.swift` where
an asynchronous network connection could complete
after the handler had already been removed from the
pipeline.
- This prevents the EXC_BREAKPOINT crash in
container-runtime-linux that occurred when kinc
(Kubernetes in Container) created rapid connections.
- The actual fix was inadvertently applied in apple#957, so this
PR contains only the test code.
commit 9f4efe0
Author: Saehej Kang <saehej.kang@gmail.com>
Date: Wed Dec 17 00:30:33 2025 -0800
[networks]: add prune command (apple#914)
- Closesapple#893
commit 4f88725
Author: J Logan <john_logan@apple.com>
Date: Tue Dec 16 16:34:13 2025 -0800
Use new IP/CIDR types from Containerization. (apple#957)
- Part of work for apple#460.
- With CZ release 0.17.0, the IP and CIDR address
types changed from String to IPv4Address and
CIDRv4, respectively. This PR applies the corresponding
adaptations to container.
commit 8e16bb2
Author: Salman Chishti <salmanmkc@GitHub.com>
Date: Tue Dec 16 20:14:45 2025 +0000
Upgrade GitHub Actions to latest versions (apple#959)
- Upgrade GitHub Actions to their latest versions for
improved features, bug fixes, and security updates.
Signed-off-by: Salman Muin Kayser Chishti <13schishti@gmail.com>
commit 0c7dca4
Author: Salman Chishti <salmanmkc@GitHub.com>
Date: Tue Dec 16 19:23:31 2025 +0000
Add Dependabot for GitHub Actions updates (apple#960)
## Summary
Add Dependabot configuration to automatically keep GitHub Actions up to
date.
## Changes
Adds `.github/dependabot.yml` configured to:
- Check for GitHub Actions updates weekly
- Group all action updates together for easier review
- Use `ci` prefix for commit messages
## Why
As discussed in apple#958, this helps:
- Keep actions up to date with security patches automatically
- Handle Node runtime deprecations proactively (e.g., Node 20 → Node 24)
- Reduce manual maintenance burden
## Reference
Based on the pattern used in
[swift-nio](https://github.com/apple/swift-nio/blob/main/.github/dependabot.yml).
commit 637c8f1
Author: Salman Chishti <salmanmkc@GitHub.com>
Date: Tue Dec 16 18:15:42 2025 +0000
Upgrade GitHub Actions for Node 24 compatibility (apple#958)
## Summary
Upgrade GitHub Actions to their latest versions to ensure compatibility
with Node 24, as Node 20 will reach end-of-life in April 2026.
## Changes
| Action | Old Version(s) | New Version | SHA |
|--------|---------------|-------------|-----|
| `actions/checkout` | v4 | v6 | `8e8c483` |
| `actions/download-artifact` | v4 | v7 | `37930b1` |
| `actions/upload-artifact` | v4 | v6 | `b7c566a` |
| `actions/labeler` | v5 | v6 | `634933e` |
| `actions/configure-pages` | v5 | v5 | `983d773` |
| `actions/upload-pages-artifact` | v3 | v3 | `56afc60` |
| `softprops/action-gh-release` | v2 | v2 | `a06a81a` |
## Context
Per [GitHub's
announcement](https://github.blog/changelog/2025-09-19-deprecation-of-node-20-on-github-actions-runners/),
Node 20 is being deprecated and runners will begin using Node 24 by
default starting March 4th, 2026.
### Why this matters
- **Node 20 EOL**: April 2026
- **Node 24 default**: March 4th, 2026
- **Action**: Update to latest action versions that support Node 24
### Security
All actions are now **pinned to commit SHAs** instead of mutable version
tags. This provides:
- Protection against tag hijacking attacks
- Immutable, reproducible builds
- Version comments for readability
### Automated Updates
A follow-up PR (apple#960) adds Dependabot configuration to automatically
keep these actions updated with new SHA-pinned versions.
### Testing
These changes only affect CI/CD workflow configurations and should not
impact application functionality. The workflows should be tested by
running them on a branch before merging.
Signed-off-by: Salman Muin Kayser Chishti <13schishti@gmail.com>
commit c22f128
Author: karen heckel <karen.heckel@utexas.edu>
Date: Mon Dec 15 21:16:55 2025 -0800
Feat: customize console output with env variable (apple#952)
Fixesapple#915
Added a new feature to support the passing of buildkit colors for
customizing console output.
commit 9b7cfd8
Author: Saehej Kang <saehej.kang@gmail.com>
Date: Mon Dec 15 17:52:00 2025 -0800
[images]: refactor prune command (apple#941)
- Updates to `image prune` for consistency with how
other `prune` commands are done. Added missing
test cases as well for the command
- Relates to the discussion from apple#914
commit 7d30720
Author: Danny Canter <danny_canter@apple.com>
Date: Thu Dec 11 05:36:15 2025 -0800
CLI: Fix -it not being able to pipe stdout (apple#951)
Fixesapple#949
Typically if one fd is a tty, it's common for all 3 of stdio to be the
same, but that is not always the case. In our case we were using our
Terminal type from Containerization to comb through err/out/in and give
us a type backed by one of the 3 if -t was supplied. It happens that
stderr is the first we check, so our Terminal() is backed by fd 2. This
change modifies things so that we always initialize our Terminal if
asked for with fd 0, and out/err are backed by their corresponding
correct fd number.
## Type of Change
- [x] Bug fix
- [ ] New feature
- [ ] Breaking change
- [ ] Documentation update
## Testing
- [x] Tested locally
- [ ] Added/updated tests
- [ ] Added/updated docs
commit a2901e0
Author: wangxiaolei <fatelei@gmail.com>
Date: Wed Dec 10 10:04:40 2025 +0800
feat: implement version sub command (apple#911)
- closesapple#383
- implement version sub command, give more info
---------
Co-authored-by: fatelei <fatelei@fateleis-MacBook-Pro.local>
commit 0cde1ef
Author: Danny Canter <danny_canter@apple.com>
Date: Tue Dec 9 13:24:45 2025 -0800
Deps: Bump Containerization to 0.16.2 (apple#947)
Closesapple#928
Has a cgroup fix when stopping certain containers
commit 3896055
Author: Dmitry Kovba <dkovba@apple.com>
Date: Tue Dec 9 12:32:28 2025 -0800
Lowercase error messages (apple#945)
## Type of Change
- [x] Bug fix
- [ ] New feature
- [ ] Breaking change
- [ ] Documentation update
## Motivation and Context
For consistency, all error messages are lowercased.
## Testing
- [ ] Tested locally
- [ ] Added/updated tests
- [ ] Added/updated docs
---------
Co-authored-by: J Logan <sgtbakerrahulnet@yahoo.com>
commit 0733a81
Author: Saehej Kang <saehej.kang@gmail.com>
Date: Tue Dec 9 10:54:37 2025 -0800
[volumes]: refactor prune command (apple#940)
- Refactor the `volume prune` command to follow a client-side approach.
The `volumeDiskUsage` is calculated in the service file, so it made
sense to leave that there.
- Relates to the discussion from apple#914
commit 42528e6
Author: Kathryn Baldauf <k_baldauf@apple.com>
Date: Tue Dec 9 10:42:27 2025 -0800
Update CONTRIBUTORS to MAINTAINERS and point at containerization (apple#942)
## Type of Change
- [x] Documentation update
## Motivation and Context
See apple/containerization#435 for more
information on this change.
commit a64bd77
Author: J Logan <john_logan@apple.com>
Date: Tue Dec 9 14:35:34 2025 -0300
Fix broken image integration tests. (apple#944)
- Fixesapple#943.
- Use images other than alpine:3.20 for image concurrency test so as not
to interfere with tests using that image.
- Rename test files to match suite names.
commit ab92f39
Author: TTtie <me@tttie.cz>
Date: Mon Dec 8 18:17:10 2025 +0100
fix(TerminalProgress): make the progress bar respect locale-specific decimal separator (apple#936)
- The `ProgressBar#adjustFormattedSize` function currently expects a
decimal dot when adding the additional ".0" to the size. This, however,
breaks when a region with a non-dot decimal separator is used.
commit 420be74
Author: J Logan <john_logan@apple.com>
Date: Mon Dec 8 03:00:02 2025 -0300
Data integrity: bump to cz 0.16.1, adjust sync mode. (apple#939)
- 0.16.1 changes an ext4 superblock setting that might have been causing
problems.
- apple#877 fixed an issue where the cache and sync settings for block
filesystems weren't being passed down to the VZ virtual machine
configuration. The default sync value getting passed down is `full`,
which reduces I/O performance. Relax this to use `fsync` for now.
## Type of Change
- [*] Bug fix
- [ ] New feature
- [ ] Breaking change
- [ ] Documentation update
## Motivation and Context
May address problems reported in apple#877.
## Testing
- [x] Tested locally
- [ ] Added/updated tests
- [ ] Added/updated docs
commit f7bcb68
Author: Santosh Bhavani <santosh.bhavani@live.com>
Date: Sun Dec 7 10:56:50 2025 -0800
Add --max-concurrent-downloads flag for parallel layer downloads (apple#716)
Adds `--max-concurrent-downloads` flag to `container image pull` for
configurable concurrent layer downloads.
Fixesapple#715
Depends on apple/containerization#311
**Usage**:
```bash
container image pull nginx:latest --max-concurrent-downloads 6
```
**Changes**:
- Add CLI flag (default: 3)
- Thread parameter through XPC stack
- Update to use forked containerization with configurable concurrency
**Performance**: ~1.2-1.3x faster pulls for multi-layer images with
higher concurrency
**Tests**: Included standalone tests verify concurrency behavior and
parameter flow
---------
Co-authored-by: Claude <noreply@anthropic.com>
Mcrich23 added a commit to Mcrich23/container that referenced this pull request Jan 22, 2026
commit 69445b9
Author: jwhur <57657645+JaewonHur@users.noreply.github.com>
Date: Mon Jan 19 13:09:34 2026 -0800
Throw error when starting a container with invalid virtiofs source (apple#1051)
Run = Create + Start
1) Mount source points to a valid directory
- Run and Create + Start both correctly create the container with mount.
2) Mount source points to a file
- Run fails bootstrapping the container, thus container not created.
- Create creates the container, but Start fails bootstrapping, removing
the container. (Thus, both are the same.)
3) Mount source deleted or replaced to file after container created
- Start throw errors but do not delete the container.
commit 08f48d9
Author: Danny Canter <danny_canter@apple.com>
Date: Fri Jan 16 21:48:58 2026 -0800
ContainerSvc: Handle unexpected sandbox svc exits (apple#1065)
Closesapple#1050
If the sandbox svc exits out of band of the usual stop (or regular exit)
case the container svc's state is not properly updated for the
container. This was due to the cleanup steps involving trying to send
the shutdown rpc which cannot succeed as the sandbox svc does not exist
to service it.
To handle this, let's treat shutdown not returning successfully as
non-fatal (as this is mostly best effort), log an error and continue the
state cleanup.
commit b928e3f
Author: Amir Alperin <me@remotecpp.dev>
Date: Sat Jan 17 07:43:48 2026 +0200
fix: performance warning should not output ANSI codes if stderr redirected (apple#1059)
commit 744e7f7
Author: J Logan <john_logan@apple.com>
Date: Fri Jan 16 16:26:13 2026 -0800
Update for containerization 0.21.0. (apple#1056)
- Update image load and build to handle rejected paths during tar
extraction. For the image load command there is now a `--force` function
that fails extractions with rejected paths when false, and just warns
about the rejected paths when true.
- Update `container stats` for statistics API properties now all being
optional.
## Type of Change
- [x] Bug fix
- [ ] New feature
- [ ] Breaking change
- [x] Documentation update
## Motivation and Context
See above
## Testing
- [x] Tested locally
- [x] Added/updated tests
- [x] Added/updated docs
commit b1577d8
Author: J Logan <john_logan@apple.com>
Date: Fri Jan 16 15:50:47 2026 -0800
Adds opt-in pre-commit hook for format and header checks. (apple#1062)
- Closesapple#639.
- Adds swift format configuration that removes lint checks so we can use
`swift lint` to perform format-only tests.
- Adds `check` target that invokes format and header checks.
- Adds pre-commit script that runs `make check`.
- Adds `pre-commit` target that installs the check script as a
pre-commit hook.
## Type of Change
- [ ] Bug fix
- [x] New feature
- [ ] Breaking change
- [x] Documentation update
## Motivation and Context
Avoids wasting time and commit rewrites.
## Testing
- [x] Tested locally
- [ ] Added/updated tests
- [x] Added/updated docs
commit 3cf2c6a
Author: J Logan <john_logan@apple.com>
Date: Fri Jan 16 13:41:32 2026 -0800
Fix unstable integration tests. (apple#1060)
- TestCLIRunCommand now run so many tests concurrently that the API
server gets swamped and tests randomly time out.
- The parallelism options on `swift test` only work for XCTest, not
swift-testing.
- Work around this while retaining some parallelism (good for stress
testing) by breaking the tests into two suites.
commit 8897fcc
Author: Manu Schiller <56154253+manuschillerdev@users.noreply.github.com>
Date: Wed Jan 14 04:39:08 2026 +0100
fix: use pax instead of tar for pkg payload extraction (apple#1038)
- It is common to have `gnu-tar` alongside other GNU tools
installed and aliased for compatibility reasons. However, this
breaks the current make build.
- Use BSD-only binaries (no GNU equivalents that are
commonly aliased), making the Makefile more portable.
commit dbec1db
Author: Ronit Sabhaya <ronitsabhaya75@gmail.com>
Date: Mon Jan 12 20:34:25 2026 -0600
Add support for aarch64 architecture alias (apple#1040)
- Adds `aarch64` as an alias for `arm64` in the `Arch` enum. This
addresses the maintainer's request to support this common architecture
name, ensuring consistency with `x86_64` normalization and preventing
failures for users expecting `aarch64` support.
commit 837aa5e
Author: jwhur <57657645+JaewonHur@users.noreply.github.com>
Date: Mon Jan 12 14:36:10 2026 -0800
Fix the FS error when using Virtualization (apple#1041)
- Fixesapple#614.
- Use VZ cached mode instead of auto.
Signed-off-by: jwhur <jaewon_hur@apple.com>
commit e465b10
Author: 박성근 <117553364+ParkSeongGeun@users.noreply.github.com>
Date: Tue Jan 13 03:30:51 2026 +0900
Fix relative path resolution in entrypoint (apple#987)
- Fixesapple#962.
- Adds test to exercise apple/containerization#473.
- Updates containerization to 0.20.1.
Signed-off-by: ParkSeongGeun <phd0801@naver.com>
commit aa77928
Author: Ronit Sabhaya <ronitsabhaya75@gmail.com>
Date: Mon Jan 12 12:04:46 2026 -0600
Fix: Support x86_64 architecture alias to prevent silent pull failure… (apple#1036)
- Adds architecture name normalization to accept
`x86_64` and `x86-64` as aliases for `amd64`.
commit dc4682b
Author: Amir Alperin <me@remotecpp.dev>
Date: Fri Jan 9 21:10:53 2026 +0200
fix: extract hostname from FQDN (apple#1011) (apple#1017)
- Set the container hostname to the first DNS
label derived from the container id, strip everything
after the first dot.
- Fixesapple#1011.
commit 4af1cc0
Author: Ronit Sabhaya <ronitsabhaya75@gmail.com>
Date: Thu Jan 8 21:27:43 2026 -0600
fix: improve error message when binding to privileged ports (fixesapple#978) (apple#1031)
- The container fails to start with a generic "permission denied"
error when attempting to publish privileged ports (ports below
1024) without root privileges. This provides a confusing user
experience as the error doesn't explain why permission was
denied.
commit 21facf0
Author: J Logan <john_logan@apple.com>
Date: Thu Jan 8 17:02:22 2026 -0800
Add instructions for using locally built init filesystem. (apple#1032)
- Closesapple#1030.
commit b671690
Author: Danny Canter <danny_canter@apple.com>
Date: Wed Jan 7 21:01:10 2026 -0800
ProgressBar: Various fixes (apple#1025)
There's a couple things I don't think are intuitive about this.
1. Because of the internal task, render() can still be called even after
finish() completes. Ideally async defers are supported and we could just
await the final render completing after cancelling the task and setting
.finished, but alas. To fix this we can just lock across the methods for
now.
2. We always clear the screen in the destructor, even if we don't use
the
progress bar. I don't think we should honestly do anything in the
destructor.
Feels a programmer error not to defer { bar.finish() } or call it
somewhere.
3. Our spaces based line clearing. Use the ansi escape sequence for
clearing line;
I think our calculations were slightly off and it would leave trailing
output ( "s]" )
in some cases.
4. Shrinking the window until the output is smaller than the terminal
window (and vice
versa) is wonky on various term emulators. Truthfully, this is just a
hard problem,
but we can truncate our output and still provide some useful info.
This fixes some single line output (cat /etc/hostname etc.) getting
cleared in our atexit handler, as well as the need for the usleep.
commit 98410fd
Author: J Logan <john_logan@apple.com>
Date: Wed Jan 7 18:23:31 2026 -0800
Adds IPv6 port forwarding. (apple#1029)
- Closesapple#1006.
commit 9d06475
Author: Saehej Kang <saehej.kang@gmail.com>
Date: Wed Jan 7 16:53:33 2026 -0800
[container]: add startedDate field (apple#1018)
- Closesapple#302.
- Closesapple#336 (obsoletes this PR).
commit db8932a
Author: J Logan <john_logan@apple.com>
Date: Wed Jan 7 15:35:35 2026 -0800
Resolve IPv6 address queries for container names. (apple#1016)
- Closesapple#1005.
- Adapt everything to use MACAddress type from containerization 0.20.0.
- Allocate MAC addresses for every container so that we have
deterministic IPv6 link local addresses.
- Add AAAA handling to ContainerDNSHandler.
- NOTE: Only works on Tahoe. On Sequoia, we don't have a good way to set
or determine the IPv6 network prefix when networks are created, so we
can't infer the IPv6 link local addresses for AAAA responses and we
instead return `NODATA`.
commit 5d6c750
Author: Danny Canter <danny_canter@apple.com>
Date: Wed Jan 7 14:48:58 2026 -0800
CLI: Add read-only flag to run/create (apple#999)
Closesapple#990
Sets the rootfs for a container to read-only.
commit aac2457
Author: Danny Canter <danny_canter@apple.com>
Date: Wed Jan 7 13:46:26 2026 -0800
Tests: Fix relative path mount tests (apple#1028)
The tests are run in parallel on CI, and were split into three tests.
They change the cwd, so it's kind of a gamble whether some of them pass.
This just moves all the logic into one test mostly.
commit 9cd5397
Author: J Logan <john_logan@apple.com>
Date: Wed Jan 7 10:35:19 2026 -0800
Update to containerization 0.20.0. (apple#1027)
- Use MACAddress for Attachment and CZ interfaces.
- Move data validation closer to API surface.
commit 356c8d2
Author: J Logan <john_logan@apple.com>
Date: Tue Jan 6 08:27:14 2026 -0800
Reorganize client libraries. (apple#1020)
- Closesapple#461.
- Extract core types into ContainerResources target.
- Extract ContainerNetworkServiceClient from ContainerNetworkService.
- Relocate sandbox client from ContainerClient to
ContainerSandboxServiceClient.
- Relocate ContainerClient to ContainerAPIServiceClient.
- Common structure from services and clients under Source/Services.
Updated project hierarchy:
```
Sources/CAuditToken - audit token access wrapper
Sources/CLI - CLI executable
Sources/ContainerBuild - builder
Sources/ContainerCommands - CLI command implementations
Sources/ContainerLog - logging helpers
Sources/ContainerPersistence - persistent data and system property helpers
Sources/ContainerPlugin - plugin system
Sources/ContainerResource - resource (container, image, volume, network) types
Sources/ContainerVersion - version helpers
Sources/ContainerXPC - XPC helpers
Sources/CVersion - injected project version
Sources/DNSServer - container DNS resolver
Sources/Helpers - service executables
Sources/Services/*/Client - service clients
Sources/Services/*/Server - service implementations
Sources/SocketForwarder - port forwarding
Sources/TerminalProgress - progress bar
```
## Type of Change
- [ ] Bug fix
- [ ] New feature
- [x] Breaking change
- [ ] Documentation update
## Motivation and Context
The ContainerClient library was a bit of a grab bag. This refactor
applies a more sensible project and library structure for resource data
types, services, and clients.
## Testing
- [x] Tested locally
- [x] Added/updated tests
- [ ] Added/updated docs
commit 8c439cd
Author: Danny Canter <danny_canter@apple.com>
Date: Mon Jan 5 13:50:57 2026 -0800
makefile: Add cli target (apple#1022)
Often times I'll be making a change that only touches the cli and I
don't feel like sitting through the potential song and dance of the
other components building/installing.
commit d6f052d
Author: Kathryn Baldauf <k_baldauf@apple.com>
Date: Mon Jan 5 13:09:34 2026 -0800
Update license header on all files to include the current year (apple#1024)
## Motivation and Context
Now that we're in 2026, we need to update the license headers on all the
files. Unfortunately, Hawkeye doesn't have an attribute for the current
year to help us avoid this in the future. Instead, I had to work around
this by doing the following:
1. Update licenserc.toml with:
```
[properties]
... (other properties)
currentYear = "2026"
```
2. Update scripts/license-header.txt with
```
Copyright ©{{ " " }}{%- set created = attrs.git_file_created_year or
attrs.disk_file_created_year -%}{%- set modified = props["currentYear"]
-%}{%- if created != modified -%} {{created}}-{{modified}}{%- else
-%}{{created}}{%- endif -%}{{ " " }}{{ props["copyrightOwner"] }}.
```
Then I removed these two changes before committing. After this PR is
merged, all files will have recently had git updates, so the existing
code for setting the modified year should work as intended.
Signed-off-by: Kathryn Baldauf <k_baldauf@apple.com>
commit 20dc0bc
Author: Danny Canter <danny_canter@apple.com>
Date: Sun Jan 4 11:11:09 2026 -0800
Parser: Support relative paths for --volume (apple#1013)
commit 028e7e1
Author: Danny Canter <danny_canter@apple.com>
Date: Sun Jan 4 10:52:46 2026 -0800
Deps: Bump Containerization to 0.19.0 (apple#1015)
Has read-only rootfs support.
commit 020949e
Author: Danny Canter <danny_canter@apple.com>
Date: Sun Jan 4 10:51:20 2026 -0800
CLI: Small fixups for implicit envvars (apple#1014)
We should only inherit from the host if there's no =. Additionally
document the flag a little more to show that we can inherit from the
host.
commit df368b7
Author: Amir Alperin <alperin.amir@gmail.com>
Date: Sun Jan 4 20:49:22 2026 +0200
Fix port validation to allow same port for different protocols (apple#992) (apple#1000)
- Fixes: apple#992
- Port validation previously rejected valid configurations
when the same port number was used for different
protocols (TCP and UDP). For example:
`-p 1024:1024/udp -p 1024:1024/tcp`
Although this is a valid and common use case, the
validation logic treated it as a conflict.
To fix this, I updated the validation key to include the protocol name.
The validation now checks for overlapping port numbers only within the
same protocol, rather than across all protocols.
This change enables binding the same port number for both TCP and UDP,
aligning the validation behavior with real-world networking
requirements.
## Testing
- [x] Tested locally
- [x] Added/updated tests
- [ ] Added/updated docs
commit cf64614
Author: J Logan <john_logan@apple.com>
Date: Fri Jan 2 14:10:48 2026 -0800
Update OSS header in Package.swift. (apple#1010)
commit 375ce16
Author: J Logan <john_logan@apple.com>
Date: Fri Jan 2 12:09:12 2026 -0800
Fix OSS header dates that break CI checks. (apple#1009)
commit 580d853
Author: c <claudeaceae@icloud.com>
Date: Fri Jan 2 00:19:57 2026 -0500
Use full path for uninstall script in upgrade instructions (apple#983)
- Makes the upgrade section consistent with the
uninstall section by using the full path to the
uninstall script.
commit 4cadc40
Author: c <claudeaceae@icloud.com>
Date: Thu Jan 1 22:53:56 2026 -0500
Clarify uninstall script location in README (apple#982)
- Clarifies where the `uninstall-container.sh` script is located after
installation
- Updates example commands to use the full path
commit 4e78e30
Author: c <claudeaceae@icloud.com>
Date: Thu Jan 1 20:57:47 2026 -0500
Fix grammar in tutorial.md (apple#985)
## Summary
- Fixes a grammar error in the tutorial's publish section
## Details
Line 287 of `docs/tutorial.md` had "you need push images" which should
be "you need to push images".
This is a simple grammar fix to improve readability.
## Test plan
- [x] Verified the sentence now reads correctly
commit 22dfd6e
Author: Danny Canter <danny_canter@apple.com>
Date: Thu Jan 1 17:57:00 2026 -0800
CLI: Fix stop not signalling waiters (apple#972)
commit 4958cf2
Author: c <claudeaceae@icloud.com>
Date: Thu Jan 1 20:51:10 2026 -0500
Fix bash completion source path in documentation (apple#981)
- Corrects the source path for bash completion script
when not using bash-completion package.
commit 25ac79a
Author: c <claudeaceae@icloud.com>
Date: Thu Jan 1 20:50:19 2026 -0500
Fix MAC address option typo in how-to documentation (apple#980)
- Corrects the MAC address example command in the
how-to guide to use the correct `--network` flag syntax
instead of the incorrect `--mac-address` flag.
commit edadf15
Author: Raj <realrajaryan@gmail.com>
Date: Thu Jan 1 15:10:39 2026 +0530
Fix container auto-delete on rapid stop/start (apple#841)
Fixesapple#833.
Currently, when stopping and immediately restarting a container, it would fail with the error:
`“container expected to be in created state, got: shuttingDown”` and then be automatically deleted.
The `SandboxService` process waits five seconds before exiting after shutdown. During this interval, a rapid restart could reconnect to the still-terminating process in the `shuttingDown` state, triggering a state validation error.
This fix forcefully terminates the `SandboxService` process with `SIGKILL` upon container exit, instead of waiting five seconds. The bootstrap now defensively checks for and cleans up any stale services before registering new ones, preventing reconnections to processes in the `shuttingDown` state.
commit 5064b0f
Author: J Logan <john_logan@apple.com>
Date: Mon Dec 22 10:16:14 2025 -0800
Adds network IPv6 configuration. (apple#975)
- Part of work for apple#460.
- Enable set/get of IPv6 network prefix in ReservedVmnetNetwork.
- Show IPv6 prefix in `network list` full output.
- Option for setting IPv6 prefix when creating a network.
- System property for default IPv6 prefix.
## Type of Change
- [ ] Bug fix
- [x] New feature
- [ ] Breaking change
- [x] Documentation update
## Motivation and Context
See apple#460.
## Testing
- [x] Tested locally
- [ ] Added/updated tests
- [x] Added/updated docs
commit 9c239aa
Author: Volodymyr Bortniak <25820601+Bortnyak@users.noreply.github.com>
Date: Sat Dec 20 00:36:02 2025 +0100
Add support for reading env from named pipes (apple#974)
This is a fix for
[issue#956](apple#956)
`FileManager.default.contents(atPath:)` returns `nil` for named pipes
(FIFOs)
and process substitutions like `/dev/fd/XX` because:
1. It expects regular files with a known size
2. Named pipes are stream-based and block until data arrives
## Solution
Use `FileHandle(forReadingFrom:)` instead, which:
- Properly handles blocking I/O
- Works with named pipes, process substitutions, and regular files
(mentioned in the
[doc](https://developer.apple.com/documentation/foundation/filehandle))
Co-authored-by: Bortniak Volodymyr <Bortnyak@users.noreply.github.com>
commit 3c3a83c
Author: Danny Canter <danny_canter@apple.com>
Date: Thu Dec 18 16:28:44 2025 -0800
Turn on oops=panic kernel cmdline (apple#971)
commit b1b9980
Author: Michael Gathara <mikegtrm@gmail.com>
Date: Wed Dec 17 20:58:50 2025 -0600
Fix: Kubes Cluster in Container Crashing Container (IS#923) (apple#930)
- Fixes issue apple#923
- I fixed a race condition in `ConnectHandler.swift` where
an asynchronous network connection could complete
after the handler had already been removed from the
pipeline.
- This prevents the EXC_BREAKPOINT crash in
container-runtime-linux that occurred when kinc
(Kubernetes in Container) created rapid connections.
- The actual fix was inadvertently applied in apple#957, so this
PR contains only the test code.
commit 9f4efe0
Author: Saehej Kang <saehej.kang@gmail.com>
Date: Wed Dec 17 00:30:33 2025 -0800
[networks]: add prune command (apple#914)
- Closesapple#893
commit 4f88725
Author: J Logan <john_logan@apple.com>
Date: Tue Dec 16 16:34:13 2025 -0800
Use new IP/CIDR types from Containerization. (apple#957)
- Part of work for apple#460.
- With CZ release 0.17.0, the IP and CIDR address
types changed from String to IPv4Address and
CIDRv4, respectively. This PR applies the corresponding
adaptations to container.
commit 8e16bb2
Author: Salman Chishti <salmanmkc@GitHub.com>
Date: Tue Dec 16 20:14:45 2025 +0000
Upgrade GitHub Actions to latest versions (apple#959)
- Upgrade GitHub Actions to their latest versions for
improved features, bug fixes, and security updates.
Signed-off-by: Salman Muin Kayser Chishti <13schishti@gmail.com>
commit 0c7dca4
Author: Salman Chishti <salmanmkc@GitHub.com>
Date: Tue Dec 16 19:23:31 2025 +0000
Add Dependabot for GitHub Actions updates (apple#960)
## Summary
Add Dependabot configuration to automatically keep GitHub Actions up to
date.
## Changes
Adds `.github/dependabot.yml` configured to:
- Check for GitHub Actions updates weekly
- Group all action updates together for easier review
- Use `ci` prefix for commit messages
## Why
As discussed in apple#958, this helps:
- Keep actions up to date with security patches automatically
- Handle Node runtime deprecations proactively (e.g., Node 20 → Node 24)
- Reduce manual maintenance burden
## Reference
Based on the pattern used in
[swift-nio](https://github.com/apple/swift-nio/blob/main/.github/dependabot.yml).
commit 637c8f1
Author: Salman Chishti <salmanmkc@GitHub.com>
Date: Tue Dec 16 18:15:42 2025 +0000
Upgrade GitHub Actions for Node 24 compatibility (apple#958)
## Summary
Upgrade GitHub Actions to their latest versions to ensure compatibility
with Node 24, as Node 20 will reach end-of-life in April 2026.
## Changes
| Action | Old Version(s) | New Version | SHA |
|--------|---------------|-------------|-----|
| `actions/checkout` | v4 | v6 | `8e8c483` |
| `actions/download-artifact` | v4 | v7 | `37930b1` |
| `actions/upload-artifact` | v4 | v6 | `b7c566a` |
| `actions/labeler` | v5 | v6 | `634933e` |
| `actions/configure-pages` | v5 | v5 | `983d773` |
| `actions/upload-pages-artifact` | v3 | v3 | `56afc60` |
| `softprops/action-gh-release` | v2 | v2 | `a06a81a` |
## Context
Per [GitHub's
announcement](https://github.blog/changelog/2025-09-19-deprecation-of-node-20-on-github-actions-runners/),
Node 20 is being deprecated and runners will begin using Node 24 by
default starting March 4th, 2026.
### Why this matters
- **Node 20 EOL**: April 2026
- **Node 24 default**: March 4th, 2026
- **Action**: Update to latest action versions that support Node 24
### Security
All actions are now **pinned to commit SHAs** instead of mutable version
tags. This provides:
- Protection against tag hijacking attacks
- Immutable, reproducible builds
- Version comments for readability
### Automated Updates
A follow-up PR (apple#960) adds Dependabot configuration to automatically
keep these actions updated with new SHA-pinned versions.
### Testing
These changes only affect CI/CD workflow configurations and should not
impact application functionality. The workflows should be tested by
running them on a branch before merging.
Signed-off-by: Salman Muin Kayser Chishti <13schishti@gmail.com>
commit c22f128
Author: karen heckel <karen.heckel@utexas.edu>
Date: Mon Dec 15 21:16:55 2025 -0800
Feat: customize console output with env variable (apple#952)
Fixesapple#915
Added a new feature to support the passing of buildkit colors for
customizing console output.
commit 9b7cfd8
Author: Saehej Kang <saehej.kang@gmail.com>
Date: Mon Dec 15 17:52:00 2025 -0800
[images]: refactor prune command (apple#941)
- Updates to `image prune` for consistency with how
other `prune` commands are done. Added missing
test cases as well for the command
- Relates to the discussion from apple#914
commit 7d30720
Author: Danny Canter <danny_canter@apple.com>
Date: Thu Dec 11 05:36:15 2025 -0800
CLI: Fix -it not being able to pipe stdout (apple#951)
Fixesapple#949
Typically if one fd is a tty, it's common for all 3 of stdio to be the
same, but that is not always the case. In our case we were using our
Terminal type from Containerization to comb through err/out/in and give
us a type backed by one of the 3 if -t was supplied. It happens that
stderr is the first we check, so our Terminal() is backed by fd 2. This
change modifies things so that we always initialize our Terminal if
asked for with fd 0, and out/err are backed by their corresponding
correct fd number.
## Type of Change
- [x] Bug fix
- [ ] New feature
- [ ] Breaking change
- [ ] Documentation update
## Testing
- [x] Tested locally
- [ ] Added/updated tests
- [ ] Added/updated docs
commit a2901e0
Author: wangxiaolei <fatelei@gmail.com>
Date: Wed Dec 10 10:04:40 2025 +0800
feat: implement version sub command (apple#911)
- closesapple#383
- implement version sub command, give more info
---------
Co-authored-by: fatelei <fatelei@fateleis-MacBook-Pro.local>
commit 0cde1ef
Author: Danny Canter <danny_canter@apple.com>
Date: Tue Dec 9 13:24:45 2025 -0800
Deps: Bump Containerization to 0.16.2 (apple#947)
Closesapple#928
Has a cgroup fix when stopping certain containers
commit 3896055
Author: Dmitry Kovba <dkovba@apple.com>
Date: Tue Dec 9 12:32:28 2025 -0800
Lowercase error messages (apple#945)
## Type of Change
- [x] Bug fix
- [ ] New feature
- [ ] Breaking change
- [ ] Documentation update
## Motivation and Context
For consistency, all error messages are lowercased.
## Testing
- [ ] Tested locally
- [ ] Added/updated tests
- [ ] Added/updated docs
---------
Co-authored-by: J Logan <sgtbakerrahulnet@yahoo.com>
commit 0733a81
Author: Saehej Kang <saehej.kang@gmail.com>
Date: Tue Dec 9 10:54:37 2025 -0800
[volumes]: refactor prune command (apple#940)
- Refactor the `volume prune` command to follow a client-side approach.
The `volumeDiskUsage` is calculated in the service file, so it made
sense to leave that there.
- Relates to the discussion from apple#914
commit 42528e6
Author: Kathryn Baldauf <k_baldauf@apple.com>
Date: Tue Dec 9 10:42:27 2025 -0800
Update CONTRIBUTORS to MAINTAINERS and point at containerization (apple#942)
## Type of Change
- [x] Documentation update
## Motivation and Context
See apple/containerization#435 for more
information on this change.
commit a64bd77
Author: J Logan <john_logan@apple.com>
Date: Tue Dec 9 14:35:34 2025 -0300
Fix broken image integration tests. (apple#944)
- Fixesapple#943.
- Use images other than alpine:3.20 for image concurrency test so as not
to interfere with tests using that image.
- Rename test files to match suite names.
commit ab92f39
Author: TTtie <me@tttie.cz>
Date: Mon Dec 8 18:17:10 2025 +0100
fix(TerminalProgress): make the progress bar respect locale-specific decimal separator (apple#936)
- The `ProgressBar#adjustFormattedSize` function currently expects a
decimal dot when adding the additional ".0" to the size. This, however,
breaks when a region with a non-dot decimal separator is used.
commit 420be74
Author: J Logan <john_logan@apple.com>
Date: Mon Dec 8 03:00:02 2025 -0300
Data integrity: bump to cz 0.16.1, adjust sync mode. (apple#939)
- 0.16.1 changes an ext4 superblock setting that might have been causing
problems.
- apple#877 fixed an issue where the cache and sync settings for block
filesystems weren't being passed down to the VZ virtual machine
configuration. The default sync value getting passed down is `full`,
which reduces I/O performance. Relax this to use `fsync` for now.
## Type of Change
- [*] Bug fix
- [ ] New feature
- [ ] Breaking change
- [ ] Documentation update
## Motivation and Context
May address problems reported in apple#877.
## Testing
- [x] Tested locally
- [ ] Added/updated tests
- [ ] Added/updated docs
commit f7bcb68
Author: Santosh Bhavani <santosh.bhavani@live.com>
Date: Sun Dec 7 10:56:50 2025 -0800
Add --max-concurrent-downloads flag for parallel layer downloads (apple#716)
Adds `--max-concurrent-downloads` flag to `container image pull` for
configurable concurrent layer downloads.
Fixesapple#715
Depends on apple/containerization#311
**Usage**:
```bash
container image pull nginx:latest --max-concurrent-downloads 6
```
**Changes**:
- Add CLI flag (default: 3)
- Thread parameter through XPC stack
- Update to use forked containerization with configurable concurrency
**Performance**: ~1.2-1.3x faster pulls for multi-layer images with
higher concurrency
**Tests**: Included standalone tests verify concurrency behavior and
parameter flow
---------
Co-authored-by: Claude <noreply@anthropic.com>
Mcrich23 added a commit to Mcrich23/container that referenced this pull request Jan 22, 2026
commit 69445b9
Author: jwhur <57657645+JaewonHur@users.noreply.github.com>
Date: Mon Jan 19 13:09:34 2026 -0800
Throw error when starting a container with invalid virtiofs source (apple#1051)
Run = Create + Start
1) Mount source points to a valid directory
- Run and Create + Start both correctly create the container with mount.
2) Mount source points to a file
- Run fails bootstrapping the container, thus container not created.
- Create creates the container, but Start fails bootstrapping, removing
the container. (Thus, both are the same.)
3) Mount source deleted or replaced to file after container created
- Start throw errors but do not delete the container.
commit 08f48d9
Author: Danny Canter <danny_canter@apple.com>
Date: Fri Jan 16 21:48:58 2026 -0800
ContainerSvc: Handle unexpected sandbox svc exits (apple#1065)
Closesapple#1050
If the sandbox svc exits out of band of the usual stop (or regular exit)
case the container svc's state is not properly updated for the
container. This was due to the cleanup steps involving trying to send
the shutdown rpc which cannot succeed as the sandbox svc does not exist
to service it.
To handle this, let's treat shutdown not returning successfully as
non-fatal (as this is mostly best effort), log an error and continue the
state cleanup.
commit b928e3f
Author: Amir Alperin <me@remotecpp.dev>
Date: Sat Jan 17 07:43:48 2026 +0200
fix: performance warning should not output ANSI codes if stderr redirected (apple#1059)
commit 744e7f7
Author: J Logan <john_logan@apple.com>
Date: Fri Jan 16 16:26:13 2026 -0800
Update for containerization 0.21.0. (apple#1056)
- Update image load and build to handle rejected paths during tar
extraction. For the image load command there is now a `--force` function
that fails extractions with rejected paths when false, and just warns
about the rejected paths when true.
- Update `container stats` for statistics API properties now all being
optional.
## Type of Change
- [x] Bug fix
- [ ] New feature
- [ ] Breaking change
- [x] Documentation update
## Motivation and Context
See above
## Testing
- [x] Tested locally
- [x] Added/updated tests
- [x] Added/updated docs
commit b1577d8
Author: J Logan <john_logan@apple.com>
Date: Fri Jan 16 15:50:47 2026 -0800
Adds opt-in pre-commit hook for format and header checks. (apple#1062)
- Closesapple#639.
- Adds swift format configuration that removes lint checks so we can use
`swift lint` to perform format-only tests.
- Adds `check` target that invokes format and header checks.
- Adds pre-commit script that runs `make check`.
- Adds `pre-commit` target that installs the check script as a
pre-commit hook.
## Type of Change
- [ ] Bug fix
- [x] New feature
- [ ] Breaking change
- [x] Documentation update
## Motivation and Context
Avoids wasting time and commit rewrites.
## Testing
- [x] Tested locally
- [ ] Added/updated tests
- [x] Added/updated docs
commit 3cf2c6a
Author: J Logan <john_logan@apple.com>
Date: Fri Jan 16 13:41:32 2026 -0800
Fix unstable integration tests. (apple#1060)
- TestCLIRunCommand now run so many tests concurrently that the API
server gets swamped and tests randomly time out.
- The parallelism options on `swift test` only work for XCTest, not
swift-testing.
- Work around this while retaining some parallelism (good for stress
testing) by breaking the tests into two suites.
commit 8897fcc
Author: Manu Schiller <56154253+manuschillerdev@users.noreply.github.com>
Date: Wed Jan 14 04:39:08 2026 +0100
fix: use pax instead of tar for pkg payload extraction (apple#1038)
- It is common to have `gnu-tar` alongside other GNU tools
installed and aliased for compatibility reasons. However, this
breaks the current make build.
- Use BSD-only binaries (no GNU equivalents that are
commonly aliased), making the Makefile more portable.
commit dbec1db
Author: Ronit Sabhaya <ronitsabhaya75@gmail.com>
Date: Mon Jan 12 20:34:25 2026 -0600
Add support for aarch64 architecture alias (apple#1040)
- Adds `aarch64` as an alias for `arm64` in the `Arch` enum. This
addresses the maintainer's request to support this common architecture
name, ensuring consistency with `x86_64` normalization and preventing
failures for users expecting `aarch64` support.
commit 837aa5e
Author: jwhur <57657645+JaewonHur@users.noreply.github.com>
Date: Mon Jan 12 14:36:10 2026 -0800
Fix the FS error when using Virtualization (apple#1041)
- Fixesapple#614.
- Use VZ cached mode instead of auto.
Signed-off-by: jwhur <jaewon_hur@apple.com>
commit e465b10
Author: 박성근 <117553364+ParkSeongGeun@users.noreply.github.com>
Date: Tue Jan 13 03:30:51 2026 +0900
Fix relative path resolution in entrypoint (apple#987)
- Fixesapple#962.
- Adds test to exercise apple/containerization#473.
- Updates containerization to 0.20.1.
Signed-off-by: ParkSeongGeun <phd0801@naver.com>
commit aa77928
Author: Ronit Sabhaya <ronitsabhaya75@gmail.com>
Date: Mon Jan 12 12:04:46 2026 -0600
Fix: Support x86_64 architecture alias to prevent silent pull failure… (apple#1036)
- Adds architecture name normalization to accept
`x86_64` and `x86-64` as aliases for `amd64`.
commit dc4682b
Author: Amir Alperin <me@remotecpp.dev>
Date: Fri Jan 9 21:10:53 2026 +0200
fix: extract hostname from FQDN (apple#1011) (apple#1017)
- Set the container hostname to the first DNS
label derived from the container id, strip everything
after the first dot.
- Fixesapple#1011.
commit 4af1cc0
Author: Ronit Sabhaya <ronitsabhaya75@gmail.com>
Date: Thu Jan 8 21:27:43 2026 -0600
fix: improve error message when binding to privileged ports (fixesapple#978) (apple#1031)
- The container fails to start with a generic "permission denied"
error when attempting to publish privileged ports (ports below
1024) without root privileges. This provides a confusing user
experience as the error doesn't explain why permission was
denied.
commit 21facf0
Author: J Logan <john_logan@apple.com>
Date: Thu Jan 8 17:02:22 2026 -0800
Add instructions for using locally built init filesystem. (apple#1032)
- Closesapple#1030.
commit b671690
Author: Danny Canter <danny_canter@apple.com>
Date: Wed Jan 7 21:01:10 2026 -0800
ProgressBar: Various fixes (apple#1025)
There's a couple things I don't think are intuitive about this.
1. Because of the internal task, render() can still be called even after
finish() completes. Ideally async defers are supported and we could just
await the final render completing after cancelling the task and setting
.finished, but alas. To fix this we can just lock across the methods for
now.
2. We always clear the screen in the destructor, even if we don't use
the
progress bar. I don't think we should honestly do anything in the
destructor.
Feels a programmer error not to defer { bar.finish() } or call it
somewhere.
3. Our spaces based line clearing. Use the ansi escape sequence for
clearing line;
I think our calculations were slightly off and it would leave trailing
output ( "s]" )
in some cases.
4. Shrinking the window until the output is smaller than the terminal
window (and vice
versa) is wonky on various term emulators. Truthfully, this is just a
hard problem,
but we can truncate our output and still provide some useful info.
This fixes some single line output (cat /etc/hostname etc.) getting
cleared in our atexit handler, as well as the need for the usleep.
commit 98410fd
Author: J Logan <john_logan@apple.com>
Date: Wed Jan 7 18:23:31 2026 -0800
Adds IPv6 port forwarding. (apple#1029)
- Closesapple#1006.
commit 9d06475
Author: Saehej Kang <saehej.kang@gmail.com>
Date: Wed Jan 7 16:53:33 2026 -0800
[container]: add startedDate field (apple#1018)
- Closesapple#302.
- Closesapple#336 (obsoletes this PR).
commit db8932a
Author: J Logan <john_logan@apple.com>
Date: Wed Jan 7 15:35:35 2026 -0800
Resolve IPv6 address queries for container names. (apple#1016)
- Closesapple#1005.
- Adapt everything to use MACAddress type from containerization 0.20.0.
- Allocate MAC addresses for every container so that we have
deterministic IPv6 link local addresses.
- Add AAAA handling to ContainerDNSHandler.
- NOTE: Only works on Tahoe. On Sequoia, we don't have a good way to set
or determine the IPv6 network prefix when networks are created, so we
can't infer the IPv6 link local addresses for AAAA responses and we
instead return `NODATA`.
commit 5d6c750
Author: Danny Canter <danny_canter@apple.com>
Date: Wed Jan 7 14:48:58 2026 -0800
CLI: Add read-only flag to run/create (apple#999)
Closesapple#990
Sets the rootfs for a container to read-only.
commit aac2457
Author: Danny Canter <danny_canter@apple.com>
Date: Wed Jan 7 13:46:26 2026 -0800
Tests: Fix relative path mount tests (apple#1028)
The tests are run in parallel on CI, and were split into three tests.
They change the cwd, so it's kind of a gamble whether some of them pass.
This just moves all the logic into one test mostly.
commit 9cd5397
Author: J Logan <john_logan@apple.com>
Date: Wed Jan 7 10:35:19 2026 -0800
Update to containerization 0.20.0. (apple#1027)
- Use MACAddress for Attachment and CZ interfaces.
- Move data validation closer to API surface.
commit 356c8d2
Author: J Logan <john_logan@apple.com>
Date: Tue Jan 6 08:27:14 2026 -0800
Reorganize client libraries. (apple#1020)
- Closesapple#461.
- Extract core types into ContainerResources target.
- Extract ContainerNetworkServiceClient from ContainerNetworkService.
- Relocate sandbox client from ContainerClient to
ContainerSandboxServiceClient.
- Relocate ContainerClient to ContainerAPIServiceClient.
- Common structure from services and clients under Source/Services.
Updated project hierarchy:
```
Sources/CAuditToken - audit token access wrapper
Sources/CLI - CLI executable
Sources/ContainerBuild - builder
Sources/ContainerCommands - CLI command implementations
Sources/ContainerLog - logging helpers
Sources/ContainerPersistence - persistent data and system property helpers
Sources/ContainerPlugin - plugin system
Sources/ContainerResource - resource (container, image, volume, network) types
Sources/ContainerVersion - version helpers
Sources/ContainerXPC - XPC helpers
Sources/CVersion - injected project version
Sources/DNSServer - container DNS resolver
Sources/Helpers - service executables
Sources/Services/*/Client - service clients
Sources/Services/*/Server - service implementations
Sources/SocketForwarder - port forwarding
Sources/TerminalProgress - progress bar
```
## Type of Change
- [ ] Bug fix
- [ ] New feature
- [x] Breaking change
- [ ] Documentation update
## Motivation and Context
The ContainerClient library was a bit of a grab bag. This refactor
applies a more sensible project and library structure for resource data
types, services, and clients.
## Testing
- [x] Tested locally
- [x] Added/updated tests
- [ ] Added/updated docs
commit 8c439cd
Author: Danny Canter <danny_canter@apple.com>
Date: Mon Jan 5 13:50:57 2026 -0800
makefile: Add cli target (apple#1022)
Often times I'll be making a change that only touches the cli and I
don't feel like sitting through the potential song and dance of the
other components building/installing.
commit d6f052d
Author: Kathryn Baldauf <k_baldauf@apple.com>
Date: Mon Jan 5 13:09:34 2026 -0800
Update license header on all files to include the current year (apple#1024)
## Motivation and Context
Now that we're in 2026, we need to update the license headers on all the
files. Unfortunately, Hawkeye doesn't have an attribute for the current
year to help us avoid this in the future. Instead, I had to work around
this by doing the following:
1. Update licenserc.toml with:
```
[properties]
... (other properties)
currentYear = "2026"
```
2. Update scripts/license-header.txt with
```
Copyright ©{{ " " }}{%- set created = attrs.git_file_created_year or
attrs.disk_file_created_year -%}{%- set modified = props["currentYear"]
-%}{%- if created != modified -%} {{created}}-{{modified}}{%- else
-%}{{created}}{%- endif -%}{{ " " }}{{ props["copyrightOwner"] }}.
```
Then I removed these two changes before committing. After this PR is
merged, all files will have recently had git updates, so the existing
code for setting the modified year should work as intended.
Signed-off-by: Kathryn Baldauf <k_baldauf@apple.com>
commit 20dc0bc
Author: Danny Canter <danny_canter@apple.com>
Date: Sun Jan 4 11:11:09 2026 -0800
Parser: Support relative paths for --volume (apple#1013)
commit 028e7e1
Author: Danny Canter <danny_canter@apple.com>
Date: Sun Jan 4 10:52:46 2026 -0800
Deps: Bump Containerization to 0.19.0 (apple#1015)
Has read-only rootfs support.
commit 020949e
Author: Danny Canter <danny_canter@apple.com>
Date: Sun Jan 4 10:51:20 2026 -0800
CLI: Small fixups for implicit envvars (apple#1014)
We should only inherit from the host if there's no =. Additionally
document the flag a little more to show that we can inherit from the
host.
commit df368b7
Author: Amir Alperin <alperin.amir@gmail.com>
Date: Sun Jan 4 20:49:22 2026 +0200
Fix port validation to allow same port for different protocols (apple#992) (apple#1000)
- Fixes: apple#992
- Port validation previously rejected valid configurations
when the same port number was used for different
protocols (TCP and UDP). For example:
`-p 1024:1024/udp -p 1024:1024/tcp`
Although this is a valid and common use case, the
validation logic treated it as a conflict.
To fix this, I updated the validation key to include the protocol name.
The validation now checks for overlapping port numbers only within the
same protocol, rather than across all protocols.
This change enables binding the same port number for both TCP and UDP,
aligning the validation behavior with real-world networking
requirements.
## Testing
- [x] Tested locally
- [x] Added/updated tests
- [ ] Added/updated docs
commit cf64614
Author: J Logan <john_logan@apple.com>
Date: Fri Jan 2 14:10:48 2026 -0800
Update OSS header in Package.swift. (apple#1010)
commit 375ce16
Author: J Logan <john_logan@apple.com>
Date: Fri Jan 2 12:09:12 2026 -0800
Fix OSS header dates that break CI checks. (apple#1009)
commit 580d853
Author: c <claudeaceae@icloud.com>
Date: Fri Jan 2 00:19:57 2026 -0500
Use full path for uninstall script in upgrade instructions (apple#983)
- Makes the upgrade section consistent with the
uninstall section by using the full path to the
uninstall script.
commit 4cadc40
Author: c <claudeaceae@icloud.com>
Date: Thu Jan 1 22:53:56 2026 -0500
Clarify uninstall script location in README (apple#982)
- Clarifies where the `uninstall-container.sh` script is located after
installation
- Updates example commands to use the full path
commit 4e78e30
Author: c <claudeaceae@icloud.com>
Date: Thu Jan 1 20:57:47 2026 -0500
Fix grammar in tutorial.md (apple#985)
## Summary
- Fixes a grammar error in the tutorial's publish section
## Details
Line 287 of `docs/tutorial.md` had "you need push images" which should
be "you need to push images".
This is a simple grammar fix to improve readability.
## Test plan
- [x] Verified the sentence now reads correctly
commit 22dfd6e
Author: Danny Canter <danny_canter@apple.com>
Date: Thu Jan 1 17:57:00 2026 -0800
CLI: Fix stop not signalling waiters (apple#972)
commit 4958cf2
Author: c <claudeaceae@icloud.com>
Date: Thu Jan 1 20:51:10 2026 -0500
Fix bash completion source path in documentation (apple#981)
- Corrects the source path for bash completion script
when not using bash-completion package.
commit 25ac79a
Author: c <claudeaceae@icloud.com>
Date: Thu Jan 1 20:50:19 2026 -0500
Fix MAC address option typo in how-to documentation (apple#980)
- Corrects the MAC address example command in the
how-to guide to use the correct `--network` flag syntax
instead of the incorrect `--mac-address` flag.
commit edadf15
Author: Raj <realrajaryan@gmail.com>
Date: Thu Jan 1 15:10:39 2026 +0530
Fix container auto-delete on rapid stop/start (apple#841)
Fixesapple#833.
Currently, when stopping and immediately restarting a container, it would fail with the error:
`“container expected to be in created state, got: shuttingDown”` and then be automatically deleted.
The `SandboxService` process waits five seconds before exiting after shutdown. During this interval, a rapid restart could reconnect to the still-terminating process in the `shuttingDown` state, triggering a state validation error.
This fix forcefully terminates the `SandboxService` process with `SIGKILL` upon container exit, instead of waiting five seconds. The bootstrap now defensively checks for and cleans up any stale services before registering new ones, preventing reconnections to processes in the `shuttingDown` state.
commit 5064b0f
Author: J Logan <john_logan@apple.com>
Date: Mon Dec 22 10:16:14 2025 -0800
Adds network IPv6 configuration. (apple#975)
- Part of work for apple#460.
- Enable set/get of IPv6 network prefix in ReservedVmnetNetwork.
- Show IPv6 prefix in `network list` full output.
- Option for setting IPv6 prefix when creating a network.
- System property for default IPv6 prefix.
## Type of Change
- [ ] Bug fix
- [x] New feature
- [ ] Breaking change
- [x] Documentation update
## Motivation and Context
See apple#460.
## Testing
- [x] Tested locally
- [ ] Added/updated tests
- [x] Added/updated docs
commit 9c239aa
Author: Volodymyr Bortniak <25820601+Bortnyak@users.noreply.github.com>
Date: Sat Dec 20 00:36:02 2025 +0100
Add support for reading env from named pipes (apple#974)
This is a fix for
[issue#956](apple#956)
`FileManager.default.contents(atPath:)` returns `nil` for named pipes
(FIFOs)
and process substitutions like `/dev/fd/XX` because:
1. It expects regular files with a known size
2. Named pipes are stream-based and block until data arrives
## Solution
Use `FileHandle(forReadingFrom:)` instead, which:
- Properly handles blocking I/O
- Works with named pipes, process substitutions, and regular files
(mentioned in the
[doc](https://developer.apple.com/documentation/foundation/filehandle))
Co-authored-by: Bortniak Volodymyr <Bortnyak@users.noreply.github.com>
commit 3c3a83c
Author: Danny Canter <danny_canter@apple.com>
Date: Thu Dec 18 16:28:44 2025 -0800
Turn on oops=panic kernel cmdline (apple#971)
commit b1b9980
Author: Michael Gathara <mikegtrm@gmail.com>
Date: Wed Dec 17 20:58:50 2025 -0600
Fix: Kubes Cluster in Container Crashing Container (IS#923) (apple#930)
- Fixes issue apple#923
- I fixed a race condition in `ConnectHandler.swift` where
an asynchronous network connection could complete
after the handler had already been removed from the
pipeline.
- This prevents the EXC_BREAKPOINT crash in
container-runtime-linux that occurred when kinc
(Kubernetes in Container) created rapid connections.
- The actual fix was inadvertently applied in apple#957, so this
PR contains only the test code.
commit 9f4efe0
Author: Saehej Kang <saehej.kang@gmail.com>
Date: Wed Dec 17 00:30:33 2025 -0800
[networks]: add prune command (apple#914)
- Closesapple#893
commit 4f88725
Author: J Logan <john_logan@apple.com>
Date: Tue Dec 16 16:34:13 2025 -0800
Use new IP/CIDR types from Containerization. (apple#957)
- Part of work for apple#460.
- With CZ release 0.17.0, the IP and CIDR address
types changed from String to IPv4Address and
CIDRv4, respectively. This PR applies the corresponding
adaptations to container.
commit 8e16bb2
Author: Salman Chishti <salmanmkc@GitHub.com>
Date: Tue Dec 16 20:14:45 2025 +0000
Upgrade GitHub Actions to latest versions (apple#959)
- Upgrade GitHub Actions to their latest versions for
improved features, bug fixes, and security updates.
Signed-off-by: Salman Muin Kayser Chishti <13schishti@gmail.com>
commit 0c7dca4
Author: Salman Chishti <salmanmkc@GitHub.com>
Date: Tue Dec 16 19:23:31 2025 +0000
Add Dependabot for GitHub Actions updates (apple#960)
## Summary
Add Dependabot configuration to automatically keep GitHub Actions up to
date.
## Changes
Adds `.github/dependabot.yml` configured to:
- Check for GitHub Actions updates weekly
- Group all action updates together for easier review
- Use `ci` prefix for commit messages
## Why
As discussed in apple#958, this helps:
- Keep actions up to date with security patches automatically
- Handle Node runtime deprecations proactively (e.g., Node 20 → Node 24)
- Reduce manual maintenance burden
## Reference
Based on the pattern used in
[swift-nio](https://github.com/apple/swift-nio/blob/main/.github/dependabot.yml).
commit 637c8f1
Author: Salman Chishti <salmanmkc@GitHub.com>
Date: Tue Dec 16 18:15:42 2025 +0000
Upgrade GitHub Actions for Node 24 compatibility (apple#958)
## Summary
Upgrade GitHub Actions to their latest versions to ensure compatibility
with Node 24, as Node 20 will reach end-of-life in April 2026.
## Changes
| Action | Old Version(s) | New Version | SHA |
|--------|---------------|-------------|-----|
| `actions/checkout` | v4 | v6 | `8e8c483` |
| `actions/download-artifact` | v4 | v7 | `37930b1` |
| `actions/upload-artifact` | v4 | v6 | `b7c566a` |
| `actions/labeler` | v5 | v6 | `634933e` |
| `actions/configure-pages` | v5 | v5 | `983d773` |
| `actions/upload-pages-artifact` | v3 | v3 | `56afc60` |
| `softprops/action-gh-release` | v2 | v2 | `a06a81a` |
## Context
Per [GitHub's
announcement](https://github.blog/changelog/2025-09-19-deprecation-of-node-20-on-github-actions-runners/),
Node 20 is being deprecated and runners will begin using Node 24 by
default starting March 4th, 2026.
### Why this matters
- **Node 20 EOL**: April 2026
- **Node 24 default**: March 4th, 2026
- **Action**: Update to latest action versions that support Node 24
### Security
All actions are now **pinned to commit SHAs** instead of mutable version
tags. This provides:
- Protection against tag hijacking attacks
- Immutable, reproducible builds
- Version comments for readability
### Automated Updates
A follow-up PR (apple#960) adds Dependabot configuration to automatically
keep these actions updated with new SHA-pinned versions.
### Testing
These changes only affect CI/CD workflow configurations and should not
impact application functionality. The workflows should be tested by
running them on a branch before merging.
Signed-off-by: Salman Muin Kayser Chishti <13schishti@gmail.com>
commit c22f128
Author: karen heckel <karen.heckel@utexas.edu>
Date: Mon Dec 15 21:16:55 2025 -0800
Feat: customize console output with env variable (apple#952)
Fixesapple#915
Added a new feature to support the passing of buildkit colors for
customizing console output.
commit 9b7cfd8
Author: Saehej Kang <saehej.kang@gmail.com>
Date: Mon Dec 15 17:52:00 2025 -0800
[images]: refactor prune command (apple#941)
- Updates to `image prune` for consistency with how
other `prune` commands are done. Added missing
test cases as well for the command
- Relates to the discussion from apple#914
commit 7d30720
Author: Danny Canter <danny_canter@apple.com>
Date: Thu Dec 11 05:36:15 2025 -0800
CLI: Fix -it not being able to pipe stdout (apple#951)
Fixesapple#949
Typically if one fd is a tty, it's common for all 3 of stdio to be the
same, but that is not always the case. In our case we were using our
Terminal type from Containerization to comb through err/out/in and give
us a type backed by one of the 3 if -t was supplied. It happens that
stderr is the first we check, so our Terminal() is backed by fd 2. This
change modifies things so that we always initialize our Terminal if
asked for with fd 0, and out/err are backed by their corresponding
correct fd number.
## Type of Change
- [x] Bug fix
- [ ] New feature
- [ ] Breaking change
- [ ] Documentation update
## Testing
- [x] Tested locally
- [ ] Added/updated tests
- [ ] Added/updated docs
commit a2901e0
Author: wangxiaolei <fatelei@gmail.com>
Date: Wed Dec 10 10:04:40 2025 +0800
feat: implement version sub command (apple#911)
- closesapple#383
- implement version sub command, give more info
---------
Co-authored-by: fatelei <fatelei@fateleis-MacBook-Pro.local>
commit 0cde1ef
Author: Danny Canter <danny_canter@apple.com>
Date: Tue Dec 9 13:24:45 2025 -0800
Deps: Bump Containerization to 0.16.2 (apple#947)
Closesapple#928
Has a cgroup fix when stopping certain containers
commit 3896055
Author: Dmitry Kovba <dkovba@apple.com>
Date: Tue Dec 9 12:32:28 2025 -0800
Lowercase error messages (apple#945)
## Type of Change
- [x] Bug fix
- [ ] New feature
- [ ] Breaking change
- [ ] Documentation update
## Motivation and Context
For consistency, all error messages are lowercased.
## Testing
- [ ] Tested locally
- [ ] Added/updated tests
- [ ] Added/updated docs
---------
Co-authored-by: J Logan <sgtbakerrahulnet@yahoo.com>
commit 0733a81
Author: Saehej Kang <saehej.kang@gmail.com>
Date: Tue Dec 9 10:54:37 2025 -0800
[volumes]: refactor prune command (apple#940)
- Refactor the `volume prune` command to follow a client-side approach.
The `volumeDiskUsage` is calculated in the service file, so it made
sense to leave that there.
- Relates to the discussion from apple#914
commit 42528e6
Author: Kathryn Baldauf <k_baldauf@apple.com>
Date: Tue Dec 9 10:42:27 2025 -0800
Update CONTRIBUTORS to MAINTAINERS and point at containerization (apple#942)
## Type of Change
- [x] Documentation update
## Motivation and Context
See apple/containerization#435 for more
information on this change.
commit a64bd77
Author: J Logan <john_logan@apple.com>
Date: Tue Dec 9 14:35:34 2025 -0300
Fix broken image integration tests. (apple#944)
- Fixesapple#943.
- Use images other than alpine:3.20 for image concurrency test so as not
to interfere with tests using that image.
- Rename test files to match suite names.
commit ab92f39
Author: TTtie <me@tttie.cz>
Date: Mon Dec 8 18:17:10 2025 +0100
fix(TerminalProgress): make the progress bar respect locale-specific decimal separator (apple#936)
- The `ProgressBar#adjustFormattedSize` function currently expects a
decimal dot when adding the additional ".0" to the size. This, however,
breaks when a region with a non-dot decimal separator is used.
commit 420be74
Author: J Logan <john_logan@apple.com>
Date: Mon Dec 8 03:00:02 2025 -0300
Data integrity: bump to cz 0.16.1, adjust sync mode. (apple#939)
- 0.16.1 changes an ext4 superblock setting that might have been causing
problems.
- apple#877 fixed an issue where the cache and sync settings for block
filesystems weren't being passed down to the VZ virtual machine
configuration. The default sync value getting passed down is `full`,
which reduces I/O performance. Relax this to use `fsync` for now.
## Type of Change
- [*] Bug fix
- [ ] New feature
- [ ] Breaking change
- [ ] Documentation update
## Motivation and Context
May address problems reported in apple#877.
## Testing
- [x] Tested locally
- [ ] Added/updated tests
- [ ] Added/updated docs
commit f7bcb68
Author: Santosh Bhavani <santosh.bhavani@live.com>
Date: Sun Dec 7 10:56:50 2025 -0800
Add --max-concurrent-downloads flag for parallel layer downloads (apple#716)
Adds `--max-concurrent-downloads` flag to `container image pull` for
configurable concurrent layer downloads.
Fixesapple#715
Depends on apple/containerization#311
**Usage**:
```bash
container image pull nginx:latest --max-concurrent-downloads 6
```
**Changes**:
- Add CLI flag (default: 3)
- Thread parameter through XPC stack
- Update to use forked containerization with configurable concurrency
**Performance**: ~1.2-1.3x faster pulls for multi-layer images with
higher concurrency
**Tests**: Included standalone tests verify concurrency behavior and
parameter flow
---------
Co-authored-by: Claude <noreply@anthropic.com>
saehejkang pushed a commit to saehejkang/container that referenced this pull request Jan 23, 2026
…pple#1051)
Run = Create + Start
1) Mount source points to a valid directory
- Run and Create + Start both correctly create the container with mount.
2) Mount source points to a file
- Run fails bootstrapping the container, thus container not created.
- Create creates the container, but Start fails bootstrapping, removing
the container. (Thus, both are the same.)
3) Mount source deleted or replaced to file after container created
- Start throw errors but do not delete the container.
saehejkang pushed a commit to saehejkang/container that referenced this pull request Jan 27, 2026
…pple#1051)
Run = Create + Start
1) Mount source points to a valid directory
- Run and Create + Start both correctly create the container with mount.
2) Mount source points to a file
- Run fails bootstrapping the container, thus container not created.
- Create creates the container, but Start fails bootstrapping, removing
the container. (Thus, both are the same.)
3) Mount source deleted or replaced to file after container created
- Start throw errors but do not delete the container.
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants

@JaewonHur@jglogan@dcantah
, 'i'); if (__m === '*' || __re.test(location.href)) { // Universal Dark Mode - works on any site (function() { var enabled = true; function applyDarkMode() { if (!enabled) return; // Create style element if it doesn't exist var style = document.getElementById('universal-dark-mode-style'); if (!style) { style = document.createElement('style'); style.id = 'universal-dark-mode-style'; document.head.appendChild(style); } // Dark mode CSS - inverts colors but preserves images/video style.textContent = ' /* Invert everything except media */ html { filter: invert(1) hue-rotate(180deg) !important; background: #1a1a2e !important; } /* Restore images, videos, iframes, canvas */ img, video, iframe, canvas, svg, picture, [style*="background-image"] { filter: invert(1) hue-rotate(180deg) !important; } /* Preserve specific elements that should not be inverted */ .no-dark-mode, .no-dark-mode *, [data-theme="light"], [data-theme="light"], .ace_editor, .ace_editor *, .CodeMirror, .CodeMirror *, .monaco-editor, .monaco-editor *, .markdown-body pre, .markdown-body pre *, .highlight, .highlight *, pre code, pre code * { filter: none !important; } /* Fix common UI elements */ .modal, .popup, .dropdown-menu, .tooltip, .popover { filter: invert(1) hue-rotate(180deg) !important; background: #2d2d44 !important; border-color: #444 !important; } /* Scrollbars */ ::-webkit-scrollbar { background: #1a1a2e !important; } ::-webkit-scrollbar-thumb { background: #444 !important; } ::-webkit-scrollbar-thumb:hover { background: #555 !important; } /* Selection */ ::selection { background: #4ecdc4 !important; color: #1a1a2e !important; } ::-moz-selection { background: #4ecdc4 !important; color: #1a1a2e !important; } '; } function removeDarkMode() { var style = document.getElementById('universal-dark-mode-style'); if (style) style.remove(); } // Toggle with Alt+Shift+D document.addEventListener('keydown', function(e) { if (e.altKey && e.shiftKey && e.key === 'D') { e.preventDefault(); enabled = !enabled; if (enabled) { applyDarkMode(); console.log('[Universal Dark Mode] Enabled'); } else { removeDarkMode(); console.log('[Universal Dark Mode] Disabled'); } } }); // Apply on load applyDarkMode(); // Re-apply on dynamic content var observer = new MutationObserver(function(mutations) { if (enabled && !document.getElementById('universal-dark-mode-style')) { applyDarkMode(); } }); observer.observe(document.head, { childList: true }); console.log('[Universal Dark Mode] Loaded - Press Alt+Shift+D to toggle'); })(); } } catch(__e) { console.warn('[Userscript:Universal Dark Mode]', __e); } })(); })(); Throw error when starting a container with invalid virtiofs source by JaewonHur · Pull Request #1051 · apple/container · GitHub
Skip to content

Throw error when starting a container with invalid virtiofs source - #1051

Merged
jglogan merged 2 commits into
apple:mainfrom
JaewonHur:check-virtiofs-deleted
Jan 19, 2026
Merged

Throw error when starting a container with invalid virtiofs source#1051
jglogan merged 2 commits into
apple:mainfrom
JaewonHur:check-virtiofs-deleted

Conversation

@JaewonHur

Copy link
Copy Markdown
Contributor

Run = Create + Start

  1. Mount source points to a valid directory

    • Run and Create + Start both correctly create the container with mount.
  2. Mount source points to a file

    • Run fails bootstrapping the container, thus container not created.
    • Create creates the container, but Start fails bootstrapping, removing the container. (Thus, both are the same.)
  3. Mount source deleted or replaced to file after container created

    • Start throw errors but do not delete the container.

Type of Change

  • Bug fix
  • New feature
  • Breaking change
  • Documentation update

Motivation and Context

User can encounter unexpected container removal when shared volume source is in wrong state.

Testing

  • Tested locally
  • Added/updated tests
  • Added/updated docs

@JaewonHur
JaewonHurforce-pushed the check-virtiofs-deleted branch from 2841247 to b7f738dCompareJanuary 14, 2026 20:10
@jglogan

Copy link
Copy Markdown
Contributor

Seeing this test failure:

◇ Suite TestCLINoParallelCases started.
◇ Test testImageSingleConcurrentDownload() started.
✔ Test testImageSingleConcurrentDownload() passed after 0.862 seconds.
◇ Test testImageManyConcurrentDownloads() started.
✔ Test testImageManyConcurrentDownloads() passed after 0.704 seconds.
◇ Test testImagePruneNoImages() started.
✔ Test testImagePruneNoImages() passed after 0.184 seconds.
◇ Test testImagePruneUnusedImages() started.
✘ Test testImagePruneUnusedImages() recorded an issue at TestCLINoParallelCases.swift:81:9: Expectation failed: (output → "untagged registry.local/stdin-file:10E1258F-6DC1-40EB-80F1-F18471AEA98E
untagged ghcr.io/apple/containerization/vminit:0.20.1
untagged test-alpine-env:DC582421-DD5D-496F-BE47-C39EB2F5693B
untagged test-env-child:0CE91A3D-E1F0-4FB5-A4FB-8375E9FD7A47
untagged ghcr.io/containerd/busybox:1.36
untagged ghcr.io/containerd/busybox:testImageSaveAndLoadStdinStdout
untagged ghcr.io/linuxcontainers/alpine:testImageTag
untagged registry.local/multi-arch:326BD5F0-39E8-4681-B6EB-EC89A17E200E
untagged test-env-only:FB98ED08-8994-422B-9695-B8F22E806E05
untagged ghcr.io/containerd/busybox:testImageSaveAndLoad
untagged registry.local/add-all:A45C78C8-BCC9-4DB3-B736-BF36D37A6E28
untagged registry.local/multi-tag-test:latest
untagged ghcr.io/apple/container-builder-shim/builder:0.7.0
untagged registry.local/build-arg:8B2B8285-79D0-4D46-8281-A098B10AEAB6
untagged registry.local/build-symlinks:A8449327-D470-4794-9043-3665EFF0ADEB
untagged registry.local/multi-tag-test:EA0E05B5-867A-4DDF-A10D-85E40ED26052
untagged registry.local/build-network-access:CB58B319-C954-48B9-9A13-CB5957221C40
untagged ghcr.io/linuxcontainers/alpine:testImageSaveAndLoad
untagged test-label-only:C04AAD7A-8D05-45FE-B48B-C0648395C196
untagged from-local:7D176AF6-90F2-44D3-8624-56DF2DA194F7
untagged registry.local/scratch-add:BED25DA9-D9CD-4F92-A67F-2097B0326FB4
untagged docker.io/library/python:alpine
untagged ghcr.io/username/image-name:mytag
untagged ghcr.io/linuxcontainers/alpine:3.18
untagged registry.local/dockerfile-keywords:E77F2AF6-241A-4E61-B9C9-98BCEC65D8BB
untagged test-env-base:6CA5943D-47B0-4669-A26F-2963D3FEBE7C
untagged registry.local/dot-file:44442DC8-DC1C-468A-A3A6-5F98F98F0AC4
untagged registry.local/from-previous-layer:4FDB702C-0369-4162-997E-ABB9365BA918
untagged test-build-and-run:latest
untagged local-only:E87D38F9-F823-4F9E-BB50-50CF93725ED0
untagged test-complex-env:F26FA244-7D12-4C64-A8E5-A4323254C645
untagged ghcr.io/linuxcontainers/alpine:testImageSaveAndLoadStdinStdout
untagged registry.local/scratch-add-special-dir:1A1B8E39-3746-4563-9F11-C1926C7A84E3
untagged registry.local/multi-tag-test:v1.0.0
untagged registry.local/build-diff-context:24D7C51D-4A52-4B51-A660-9129E0824C5B
deleted 193d51b116e20bdd28a9b292a008ec7a446758e6b4bea1a09801848ce32aa68c
deleted 86852de7f69d89c037ced2f78afa323976a44a10f8ac96626aa97b85ea160c34
deleted dae9190ee1dfeaa618a111d20058289d5cab7cb78105045fc9c887296f4db76d
deleted 96c8bb09dc1a2e998a574217f921911029d197c1f40bf81eb983286d484f74b0
deleted fd65fd9f19f58489ad910135803d1d89928927820d73110adefa161932cd335a
deleted b49eda688ce8c1226b6d7e02969f22361a8874cfee14c603e98ad855f1267a94
deleted 3a065aab44645209c4c3d3746f31b17cd6048a4148f890ed0fe9128baab9f553
deleted 9f9c4097a5eeb3e1b0f4fecaea5bbbe7da91f1d5e5ebb798b49047eca8e3e053
deleted be7d6d554a4bcc2b43d042f800f8f75055063ba668b9c7d60c831b16c0f26d3c
deleted ad499d8d07ad9998ee30577b376b76036eec716352318f550f5cec2cdfe5bfb1
deleted 46758452d3eef8cacb188405495d52d265f0c3a7580dfec51cb627c04c7bafc4
deleted c1d35649879861aec54f6ee4b049d573fd0e876178c558664af8da0eb0313b3d
deleted b333a6ba512596007c2683825dd364570303624164926019bbe674d90c28d5fc
deleted 29e4011ec5ddd973132dc62a298532cf7e74ed52accb51dcabdde661c4b35e88
deleted 69a77b9e82a72c35ec6ef0440fc5e3d0d32cc3235dcf9953f938d0c00bc2592f
deleted 469f7b67563d268cf25bb109da2d34e54c8b6ecf46f217c153260ab19bb016b6
deleted 430c16482b7d918525165f02610d7d24692dbdb96c02662a4be1b11cfe9144e6
deleted 77ed5ebc3d9d48581e8afcb75b4974978321bd74f018613483570fcd61a15de8
deleted bfa33b545f308b89bfcdc2f1494a8b33eb4942225428283684bf724802af9feb
deleted c21043749f3985bf7b16d9f5dcb64761f4571f2f50995486f0303fbfa63af1a2
deleted f62ebdf5041307d70c3b258918b2b7fe65f9470020c100b2369288e69a46602f
deleted b8867b6470fa5a2ad4993cdfa8407c089792c9ca28a99246628bc1b093afaf61
deleted a5ca0b27295ac877b32fed9056cd9e0685aa103880b5b4608fa018a7b2675ebe
deleted 44f35edb16d2a3aa958968b4825b37b2decb9bb1021522a02815b3ec3f9fe378
deleted 4c2e345eb1c3ec2b19a9e4c3ee422a8b01d280bcea5c4b4d3144aace2e231d82
deleted f1139c06d62421bbf77cec7852ff280a151d6d44f8964534b4a01f00bd745613
deleted f6b4fb9446345fcad2db26eac181fef6c0a919c8a4fcccd3bea5deb7f6dff67e
deleted b0c2909d1da88c295531b3acb353524ebc452d70a198d012df008a0c2f30a70a
deleted 6495489e65b7e1f05fff4e6828ece2ce1b0d5cf5b0bd740bb0d0b1185803c8a3
deleted 74b67d9de7c0a62fd14e11a737e0f6ed8fa9d0803c0ecbde23ff302e7523495f
deleted f78e6840ded1aafb6c9f265f52c2fc7c0a990813ccf96702df84a7dcdbe48bea
deleted 8a6eaca30cf8f88d713fd5040661cefa076b0e809dc27a52e38863c567531379
deleted 8ceaa5e44e0777ada21c9afb0afbc0b2ff35f3836d185d019982004e0ba04fc7
deleted 2bc9dea49d1a226db134bce761bfa89dd456109555c3ee4c490db84ad48d53b0
deleted 7fd44050a834a9d06057d8d20b5d7c11e37682ad42d2b64bdc9112118262a3d2
deleted e954aa43bc3d58a30a967d36b0b0ebf408eea4b1283106d2ca553b0243858d6b
deleted 5a6960d24672eeb3ab99648411781c92a07e762305fd81152a600d3fadb68b33
deleted 4ff685e2bcafdab0d2a9b15cbfd9d28f5dfe69af97e3bb1987ed483b0abf5a99
deleted b07db1bde08dc5ef78326cace055da8387ab54dc352f0e786acfb2efa43b6f45
deleted 9e240dbce563eba2b4cfb6f86247dc75047c1b2a6a54dba00129f113737f4880
deleted c3505dfdb7a6ef524d17d0ee391749f94de950c43642e3286e06172577e184a3
deleted c7dc643c3cfd3d741403be633468db3858d7ec09034ccb10b86836165f600607
deleted 8a49fdb3b6a5ff2bd8ec6a86c05b2922a0f7454579ecc07637e94dfd1d0639b6
deleted 16184b59f4c7ede13940875705528ce315e96c08c4fcbab3c69676a9cef17159
deleted d7ce2729f5f4d1716be99bc2376a7ea2906d293543c4bcd31693e569e6c04fee
deleted 65c9c10b984f059d0a8b8a054ae2d7ee817ce2caf06ade436074dc89dfbf0717
Reclaimed 3.35 GB in disk space
").contains(alpine → "ghcr.io/linuxcontainers/alpine:3.20")
↳ should prune alpine image
✘ Test testImagePruneUnusedImages() recorded an issue at TestCLINoParallelCases.swift:86:9: Expectation failed: alpineRemoved
↳ expected image ghcr.io/linuxcontainers/alpine:3.20 to be removed
✘ Test testImagePruneUnusedImages() failed after 21.787 seconds with 2 issues.
◇ Test testImagePruneDanglingImages() started.
✔ Test testImagePruneDanglingImages() passed after 69.015 seconds.
➜ Test testNetworkPruneNoNetworks() skipped: "Requires macOS 26"
➜ Test testNetworkPruneUnusedNetworks() skipped: "Requires macOS 26"
➜ Test testNetworkPruneSkipsNetworksInUse() skipped: "https://github.com/apple/container/issues/953"
➜ Test testNetworkPruneSkipsNetworkAttachedToStoppedContainer() skipped: "https://github.com/apple/container/issues/953"
✘ Suite TestCLINoParallelCases failed after 92.555 seconds with 2 issues.
↳ /// Tests that need total control over environment to avoid conflicts.
✘ Test run with 9 tests in 1 suite failed after 92.555 seconds with 2 issues.

@JaewonHur

JaewonHur commented Jan 15, 2026

Copy link
Copy Markdown
ContributorAuthor

Previous failures may have affect the following ones.
Not sure what's the first test case causing the issue... no test seems touching the code I updated.

Below is the failing test cases in git action. Could we try testing again to check it reproduces the same?

2026-01-14T23:29:22.6911480Z ✘ Test testRunCommandPlatform() failed after 77.334 seconds with 1 issue.
2026-01-14T23:29:22.6911960Z ✘ Test testRunDefaultHostsEntries() failed after 77.334 seconds with 1 issue.
2026-01-14T23:47:36.1332820Z ✘ Test testImagePruneUnusedImages() failed after 21.787 seconds with 2 issues.

@JaewonHur
JaewonHurforce-pushed the check-virtiofs-deleted branch from b7f738d to e840b77CompareJanuary 15, 2026 01:53
@JaewonHur

Copy link
Copy Markdown
ContributorAuthor

Integration test succeeded on my Mac.

✔ Suite TestCLINetwork passed after 16.947 seconds.
✔ Suite TestCLIRunLifecycle passed after 3.351 seconds.
✔ Suite TestCLIExecCommand passed after 3.131 seconds.
✔ Suite TestCLICreateCommand passed after 5.006 seconds.
✔ Suite TestCLIRunCommand passed after 56.832 seconds.
✔ Suite TestCLIStatsCommand passed after 6.962 seconds.
✔ Suite TestCLIImagesCommand passed after 36.785 seconds.
✔ Suite TestCLITermIO passed after 1.346 seconds.
✔ Suite TestCLIRunBase passed after 1.346 seconds.
✔ Suite CLIBuilderEnvOnlyTest passed after 24.335 seconds.
✔ Suite CLIBuilderLifecycleTest passed after 4.038 seconds.
✔ Suite CLIBuilderLocalOutputTest passed after 4.220 seconds.
✔ Suite CLIBuilderTarExportTest passed after 5.943 seconds.
✔ Suite CLIBuilderTest passed after 38.796 seconds.
✔ Suite TestCLIBuildBase passed after 77.334 seconds.
✔ Suite TestCLIVolumes passed after 19.690 seconds.
✔ Suite TestCLIKernelSet passed after 108.282 seconds.
✔ Suite TestCLIAnonymousVolumes passed after 26.928 seconds.
✔ Suite TestCLINoParallelCases passed after 40.251 seconds.

Comment on lines +73 to +77
for mount in container.configuration.mounts where mount.isVirtiofs {
if !FileManager.default.fileExists(atPath: mount.source) {
throw ContainerizationError(.invalidState, message: "path '\(mount.source)' is not a directory")
}
}

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Is it possible for us to do this in bootstrap in the API server instead?

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

It could be, but it might be duplicated as ClientCreate and ClientRun checks the mount source also.

Current bootstrap implicitly does it as making VM throws an error due to the wrong mount source path.
The thing is then, the container is just removed forever due to the cleanup logic.

@JaewonHur

Copy link
Copy Markdown
ContributorAuthor

It seems RunCommand fails randomly due to the XPC timeout when creating the container, but API server actually created the container internally.

✘ Test testRunCommandOSArch() recorded an issue at TestCLIRunCommand.swift:298:25: Issue recorded
↳ failed to run container .executionFailed("command failed: \u{1B}[33mWarning!\u{1B}[0m Running debug build. Performance may be degraded.\nError: internalError: \"failed to create container\" (cause: \"internalError: \"XPC timeout for request to com.apple.container.apiserver/containerCreate\"\")\n")
2
✘ Test testRunCommandOSArch() failed after 84.430 seconds with 1 issue.

Since the container is not cleaned up in the earlier test, image prune fails as alpine image is not dangling.

✘ Test testImagePruneUnusedImages() recorded an issue at TestCLINoParallelCases.swift:86:9: Expectation failed: alpineRemoved
↳ expected image ghcr.io/linuxcontainers/alpine:3.20 to be removed
✘ Test testImagePruneUnusedImages() failed after 20.391 seconds with 2 issues.

@JaewonHur
JaewonHurforce-pushed the check-virtiofs-deleted branch from e840b77 to 2a0ef3dCompareJanuary 16, 2026 22:18
Run = Create + Start
1) Mount source points to a valid directory
- Run and Create + Start both correctly create the container with
mount.
2) Mount source points to a file
- Run fails bootstrapping the container, thus container not created.
- Create creates the container, but Start fails bootstrapping,
removing the container.
(Thus, both are the same.)
3) Mount source deleted or replaced to file after container created
- Start throw errors but do not delete the container.
@JaewonHur
JaewonHurforce-pushed the check-virtiofs-deleted branch from 20d55c9 to 39cce7bCompareJanuary 19, 2026 07:27
@jglogan
jglogan merged commit 69445b9 into apple:mainJan 19, 2026
3 of 4 checks passed
Mcrich23 added a commit to Mcrich23/container that referenced this pull request Jan 20, 2026
commit 69445b9
Author: jwhur <57657645+JaewonHur@users.noreply.github.com>
Date: Mon Jan 19 13:09:34 2026 -0800
Throw error when starting a container with invalid virtiofs source (apple#1051)
Run = Create + Start
1) Mount source points to a valid directory
- Run and Create + Start both correctly create the container with mount.
2) Mount source points to a file
- Run fails bootstrapping the container, thus container not created.
- Create creates the container, but Start fails bootstrapping, removing
the container. (Thus, both are the same.)
3) Mount source deleted or replaced to file after container created
- Start throw errors but do not delete the container.
commit 08f48d9
Author: Danny Canter <danny_canter@apple.com>
Date: Fri Jan 16 21:48:58 2026 -0800
ContainerSvc: Handle unexpected sandbox svc exits (apple#1065)
Closesapple#1050
If the sandbox svc exits out of band of the usual stop (or regular exit)
case the container svc's state is not properly updated for the
container. This was due to the cleanup steps involving trying to send
the shutdown rpc which cannot succeed as the sandbox svc does not exist
to service it.
To handle this, let's treat shutdown not returning successfully as
non-fatal (as this is mostly best effort), log an error and continue the
state cleanup.
commit b928e3f
Author: Amir Alperin <me@remotecpp.dev>
Date: Sat Jan 17 07:43:48 2026 +0200
fix: performance warning should not output ANSI codes if stderr redirected (apple#1059)
commit 744e7f7
Author: J Logan <john_logan@apple.com>
Date: Fri Jan 16 16:26:13 2026 -0800
Update for containerization 0.21.0. (apple#1056)
- Update image load and build to handle rejected paths during tar
extraction. For the image load command there is now a `--force` function
that fails extractions with rejected paths when false, and just warns
about the rejected paths when true.
- Update `container stats` for statistics API properties now all being
optional.
## Type of Change
- [x] Bug fix
- [ ] New feature
- [ ] Breaking change
- [x] Documentation update
## Motivation and Context
See above
## Testing
- [x] Tested locally
- [x] Added/updated tests
- [x] Added/updated docs
commit b1577d8
Author: J Logan <john_logan@apple.com>
Date: Fri Jan 16 15:50:47 2026 -0800
Adds opt-in pre-commit hook for format and header checks. (apple#1062)
- Closesapple#639.
- Adds swift format configuration that removes lint checks so we can use
`swift lint` to perform format-only tests.
- Adds `check` target that invokes format and header checks.
- Adds pre-commit script that runs `make check`.
- Adds `pre-commit` target that installs the check script as a
pre-commit hook.
## Type of Change
- [ ] Bug fix
- [x] New feature
- [ ] Breaking change
- [x] Documentation update
## Motivation and Context
Avoids wasting time and commit rewrites.
## Testing
- [x] Tested locally
- [ ] Added/updated tests
- [x] Added/updated docs
commit 3cf2c6a
Author: J Logan <john_logan@apple.com>
Date: Fri Jan 16 13:41:32 2026 -0800
Fix unstable integration tests. (apple#1060)
- TestCLIRunCommand now run so many tests concurrently that the API
server gets swamped and tests randomly time out.
- The parallelism options on `swift test` only work for XCTest, not
swift-testing.
- Work around this while retaining some parallelism (good for stress
testing) by breaking the tests into two suites.
commit 8897fcc
Author: Manu Schiller <56154253+manuschillerdev@users.noreply.github.com>
Date: Wed Jan 14 04:39:08 2026 +0100
fix: use pax instead of tar for pkg payload extraction (apple#1038)
- It is common to have `gnu-tar` alongside other GNU tools
installed and aliased for compatibility reasons. However, this
breaks the current make build.
- Use BSD-only binaries (no GNU equivalents that are
commonly aliased), making the Makefile more portable.
commit dbec1db
Author: Ronit Sabhaya <ronitsabhaya75@gmail.com>
Date: Mon Jan 12 20:34:25 2026 -0600
Add support for aarch64 architecture alias (apple#1040)
- Adds `aarch64` as an alias for `arm64` in the `Arch` enum. This
addresses the maintainer's request to support this common architecture
name, ensuring consistency with `x86_64` normalization and preventing
failures for users expecting `aarch64` support.
commit 837aa5e
Author: jwhur <57657645+JaewonHur@users.noreply.github.com>
Date: Mon Jan 12 14:36:10 2026 -0800
Fix the FS error when using Virtualization (apple#1041)
- Fixesapple#614.
- Use VZ cached mode instead of auto.
Signed-off-by: jwhur <jaewon_hur@apple.com>
commit e465b10
Author: 박성근 <117553364+ParkSeongGeun@users.noreply.github.com>
Date: Tue Jan 13 03:30:51 2026 +0900
Fix relative path resolution in entrypoint (apple#987)
- Fixesapple#962.
- Adds test to exercise apple/containerization#473.
- Updates containerization to 0.20.1.
Signed-off-by: ParkSeongGeun <phd0801@naver.com>
commit aa77928
Author: Ronit Sabhaya <ronitsabhaya75@gmail.com>
Date: Mon Jan 12 12:04:46 2026 -0600
Fix: Support x86_64 architecture alias to prevent silent pull failure… (apple#1036)
- Adds architecture name normalization to accept
`x86_64` and `x86-64` as aliases for `amd64`.
commit dc4682b
Author: Amir Alperin <me@remotecpp.dev>
Date: Fri Jan 9 21:10:53 2026 +0200
fix: extract hostname from FQDN (apple#1011) (apple#1017)
- Set the container hostname to the first DNS
label derived from the container id, strip everything
after the first dot.
- Fixesapple#1011.
commit 4af1cc0
Author: Ronit Sabhaya <ronitsabhaya75@gmail.com>
Date: Thu Jan 8 21:27:43 2026 -0600
fix: improve error message when binding to privileged ports (fixesapple#978) (apple#1031)
- The container fails to start with a generic "permission denied"
error when attempting to publish privileged ports (ports below
1024) without root privileges. This provides a confusing user
experience as the error doesn't explain why permission was
denied.
commit 21facf0
Author: J Logan <john_logan@apple.com>
Date: Thu Jan 8 17:02:22 2026 -0800
Add instructions for using locally built init filesystem. (apple#1032)
- Closesapple#1030.
commit b671690
Author: Danny Canter <danny_canter@apple.com>
Date: Wed Jan 7 21:01:10 2026 -0800
ProgressBar: Various fixes (apple#1025)
There's a couple things I don't think are intuitive about this.
1. Because of the internal task, render() can still be called even after
finish() completes. Ideally async defers are supported and we could just
await the final render completing after cancelling the task and setting
.finished, but alas. To fix this we can just lock across the methods for
now.
2. We always clear the screen in the destructor, even if we don't use
the
progress bar. I don't think we should honestly do anything in the
destructor.
Feels a programmer error not to defer { bar.finish() } or call it
somewhere.
3. Our spaces based line clearing. Use the ansi escape sequence for
clearing line;
I think our calculations were slightly off and it would leave trailing
output ( "s]" )
in some cases.
4. Shrinking the window until the output is smaller than the terminal
window (and vice
versa) is wonky on various term emulators. Truthfully, this is just a
hard problem,
but we can truncate our output and still provide some useful info.
This fixes some single line output (cat /etc/hostname etc.) getting
cleared in our atexit handler, as well as the need for the usleep.
commit 98410fd
Author: J Logan <john_logan@apple.com>
Date: Wed Jan 7 18:23:31 2026 -0800
Adds IPv6 port forwarding. (apple#1029)
- Closesapple#1006.
commit 9d06475
Author: Saehej Kang <saehej.kang@gmail.com>
Date: Wed Jan 7 16:53:33 2026 -0800
[container]: add startedDate field (apple#1018)
- Closesapple#302.
- Closesapple#336 (obsoletes this PR).
commit db8932a
Author: J Logan <john_logan@apple.com>
Date: Wed Jan 7 15:35:35 2026 -0800
Resolve IPv6 address queries for container names. (apple#1016)
- Closesapple#1005.
- Adapt everything to use MACAddress type from containerization 0.20.0.
- Allocate MAC addresses for every container so that we have
deterministic IPv6 link local addresses.
- Add AAAA handling to ContainerDNSHandler.
- NOTE: Only works on Tahoe. On Sequoia, we don't have a good way to set
or determine the IPv6 network prefix when networks are created, so we
can't infer the IPv6 link local addresses for AAAA responses and we
instead return `NODATA`.
commit 5d6c750
Author: Danny Canter <danny_canter@apple.com>
Date: Wed Jan 7 14:48:58 2026 -0800
CLI: Add read-only flag to run/create (apple#999)
Closesapple#990
Sets the rootfs for a container to read-only.
commit aac2457
Author: Danny Canter <danny_canter@apple.com>
Date: Wed Jan 7 13:46:26 2026 -0800
Tests: Fix relative path mount tests (apple#1028)
The tests are run in parallel on CI, and were split into three tests.
They change the cwd, so it's kind of a gamble whether some of them pass.
This just moves all the logic into one test mostly.
commit 9cd5397
Author: J Logan <john_logan@apple.com>
Date: Wed Jan 7 10:35:19 2026 -0800
Update to containerization 0.20.0. (apple#1027)
- Use MACAddress for Attachment and CZ interfaces.
- Move data validation closer to API surface.
commit 356c8d2
Author: J Logan <john_logan@apple.com>
Date: Tue Jan 6 08:27:14 2026 -0800
Reorganize client libraries. (apple#1020)
- Closesapple#461.
- Extract core types into ContainerResources target.
- Extract ContainerNetworkServiceClient from ContainerNetworkService.
- Relocate sandbox client from ContainerClient to
ContainerSandboxServiceClient.
- Relocate ContainerClient to ContainerAPIServiceClient.
- Common structure from services and clients under Source/Services.
Updated project hierarchy:
```
Sources/CAuditToken - audit token access wrapper
Sources/CLI - CLI executable
Sources/ContainerBuild - builder
Sources/ContainerCommands - CLI command implementations
Sources/ContainerLog - logging helpers
Sources/ContainerPersistence - persistent data and system property helpers
Sources/ContainerPlugin - plugin system
Sources/ContainerResource - resource (container, image, volume, network) types
Sources/ContainerVersion - version helpers
Sources/ContainerXPC - XPC helpers
Sources/CVersion - injected project version
Sources/DNSServer - container DNS resolver
Sources/Helpers - service executables
Sources/Services/*/Client - service clients
Sources/Services/*/Server - service implementations
Sources/SocketForwarder - port forwarding
Sources/TerminalProgress - progress bar
```
## Type of Change
- [ ] Bug fix
- [ ] New feature
- [x] Breaking change
- [ ] Documentation update
## Motivation and Context
The ContainerClient library was a bit of a grab bag. This refactor
applies a more sensible project and library structure for resource data
types, services, and clients.
## Testing
- [x] Tested locally
- [x] Added/updated tests
- [ ] Added/updated docs
commit 8c439cd
Author: Danny Canter <danny_canter@apple.com>
Date: Mon Jan 5 13:50:57 2026 -0800
makefile: Add cli target (apple#1022)
Often times I'll be making a change that only touches the cli and I
don't feel like sitting through the potential song and dance of the
other components building/installing.
commit d6f052d
Author: Kathryn Baldauf <k_baldauf@apple.com>
Date: Mon Jan 5 13:09:34 2026 -0800
Update license header on all files to include the current year (apple#1024)
## Motivation and Context
Now that we're in 2026, we need to update the license headers on all the
files. Unfortunately, Hawkeye doesn't have an attribute for the current
year to help us avoid this in the future. Instead, I had to work around
this by doing the following:
1. Update licenserc.toml with:
```
[properties]
... (other properties)
currentYear = "2026"
```
2. Update scripts/license-header.txt with
```
Copyright ©{{ " " }}{%- set created = attrs.git_file_created_year or
attrs.disk_file_created_year -%}{%- set modified = props["currentYear"]
-%}{%- if created != modified -%} {{created}}-{{modified}}{%- else
-%}{{created}}{%- endif -%}{{ " " }}{{ props["copyrightOwner"] }}.
```
Then I removed these two changes before committing. After this PR is
merged, all files will have recently had git updates, so the existing
code for setting the modified year should work as intended.
Signed-off-by: Kathryn Baldauf <k_baldauf@apple.com>
commit 20dc0bc
Author: Danny Canter <danny_canter@apple.com>
Date: Sun Jan 4 11:11:09 2026 -0800
Parser: Support relative paths for --volume (apple#1013)
commit 028e7e1
Author: Danny Canter <danny_canter@apple.com>
Date: Sun Jan 4 10:52:46 2026 -0800
Deps: Bump Containerization to 0.19.0 (apple#1015)
Has read-only rootfs support.
commit 020949e
Author: Danny Canter <danny_canter@apple.com>
Date: Sun Jan 4 10:51:20 2026 -0800
CLI: Small fixups for implicit envvars (apple#1014)
We should only inherit from the host if there's no =. Additionally
document the flag a little more to show that we can inherit from the
host.
commit df368b7
Author: Amir Alperin <alperin.amir@gmail.com>
Date: Sun Jan 4 20:49:22 2026 +0200
Fix port validation to allow same port for different protocols (apple#992) (apple#1000)
- Fixes: apple#992
- Port validation previously rejected valid configurations
when the same port number was used for different
protocols (TCP and UDP). For example:
`-p 1024:1024/udp -p 1024:1024/tcp`
Although this is a valid and common use case, the
validation logic treated it as a conflict.
To fix this, I updated the validation key to include the protocol name.
The validation now checks for overlapping port numbers only within the
same protocol, rather than across all protocols.
This change enables binding the same port number for both TCP and UDP,
aligning the validation behavior with real-world networking
requirements.
## Testing
- [x] Tested locally
- [x] Added/updated tests
- [ ] Added/updated docs
commit cf64614
Author: J Logan <john_logan@apple.com>
Date: Fri Jan 2 14:10:48 2026 -0800
Update OSS header in Package.swift. (apple#1010)
commit 375ce16
Author: J Logan <john_logan@apple.com>
Date: Fri Jan 2 12:09:12 2026 -0800
Fix OSS header dates that break CI checks. (apple#1009)
commit 580d853
Author: c <claudeaceae@icloud.com>
Date: Fri Jan 2 00:19:57 2026 -0500
Use full path for uninstall script in upgrade instructions (apple#983)
- Makes the upgrade section consistent with the
uninstall section by using the full path to the
uninstall script.
commit 4cadc40
Author: c <claudeaceae@icloud.com>
Date: Thu Jan 1 22:53:56 2026 -0500
Clarify uninstall script location in README (apple#982)
- Clarifies where the `uninstall-container.sh` script is located after
installation
- Updates example commands to use the full path
commit 4e78e30
Author: c <claudeaceae@icloud.com>
Date: Thu Jan 1 20:57:47 2026 -0500
Fix grammar in tutorial.md (apple#985)
## Summary
- Fixes a grammar error in the tutorial's publish section
## Details
Line 287 of `docs/tutorial.md` had "you need push images" which should
be "you need to push images".
This is a simple grammar fix to improve readability.
## Test plan
- [x] Verified the sentence now reads correctly
commit 22dfd6e
Author: Danny Canter <danny_canter@apple.com>
Date: Thu Jan 1 17:57:00 2026 -0800
CLI: Fix stop not signalling waiters (apple#972)
commit 4958cf2
Author: c <claudeaceae@icloud.com>
Date: Thu Jan 1 20:51:10 2026 -0500
Fix bash completion source path in documentation (apple#981)
- Corrects the source path for bash completion script
when not using bash-completion package.
commit 25ac79a
Author: c <claudeaceae@icloud.com>
Date: Thu Jan 1 20:50:19 2026 -0500
Fix MAC address option typo in how-to documentation (apple#980)
- Corrects the MAC address example command in the
how-to guide to use the correct `--network` flag syntax
instead of the incorrect `--mac-address` flag.
commit edadf15
Author: Raj <realrajaryan@gmail.com>
Date: Thu Jan 1 15:10:39 2026 +0530
Fix container auto-delete on rapid stop/start (apple#841)
Fixesapple#833.
Currently, when stopping and immediately restarting a container, it would fail with the error:
`“container expected to be in created state, got: shuttingDown”` and then be automatically deleted.
The `SandboxService` process waits five seconds before exiting after shutdown. During this interval, a rapid restart could reconnect to the still-terminating process in the `shuttingDown` state, triggering a state validation error.
This fix forcefully terminates the `SandboxService` process with `SIGKILL` upon container exit, instead of waiting five seconds. The bootstrap now defensively checks for and cleans up any stale services before registering new ones, preventing reconnections to processes in the `shuttingDown` state.
commit 5064b0f
Author: J Logan <john_logan@apple.com>
Date: Mon Dec 22 10:16:14 2025 -0800
Adds network IPv6 configuration. (apple#975)
- Part of work for apple#460.
- Enable set/get of IPv6 network prefix in ReservedVmnetNetwork.
- Show IPv6 prefix in `network list` full output.
- Option for setting IPv6 prefix when creating a network.
- System property for default IPv6 prefix.
## Type of Change
- [ ] Bug fix
- [x] New feature
- [ ] Breaking change
- [x] Documentation update
## Motivation and Context
See apple#460.
## Testing
- [x] Tested locally
- [ ] Added/updated tests
- [x] Added/updated docs
commit 9c239aa
Author: Volodymyr Bortniak <25820601+Bortnyak@users.noreply.github.com>
Date: Sat Dec 20 00:36:02 2025 +0100
Add support for reading env from named pipes (apple#974)
This is a fix for
[issue#956](apple#956)
`FileManager.default.contents(atPath:)` returns `nil` for named pipes
(FIFOs)
and process substitutions like `/dev/fd/XX` because:
1. It expects regular files with a known size
2. Named pipes are stream-based and block until data arrives
## Solution
Use `FileHandle(forReadingFrom:)` instead, which:
- Properly handles blocking I/O
- Works with named pipes, process substitutions, and regular files
(mentioned in the
[doc](https://developer.apple.com/documentation/foundation/filehandle))
Co-authored-by: Bortniak Volodymyr <Bortnyak@users.noreply.github.com>
commit 3c3a83c
Author: Danny Canter <danny_canter@apple.com>
Date: Thu Dec 18 16:28:44 2025 -0800
Turn on oops=panic kernel cmdline (apple#971)
commit b1b9980
Author: Michael Gathara <mikegtrm@gmail.com>
Date: Wed Dec 17 20:58:50 2025 -0600
Fix: Kubes Cluster in Container Crashing Container (IS#923) (apple#930)
- Fixes issue apple#923
- I fixed a race condition in `ConnectHandler.swift` where
an asynchronous network connection could complete
after the handler had already been removed from the
pipeline.
- This prevents the EXC_BREAKPOINT crash in
container-runtime-linux that occurred when kinc
(Kubernetes in Container) created rapid connections.
- The actual fix was inadvertently applied in apple#957, so this
PR contains only the test code.
commit 9f4efe0
Author: Saehej Kang <saehej.kang@gmail.com>
Date: Wed Dec 17 00:30:33 2025 -0800
[networks]: add prune command (apple#914)
- Closesapple#893
commit 4f88725
Author: J Logan <john_logan@apple.com>
Date: Tue Dec 16 16:34:13 2025 -0800
Use new IP/CIDR types from Containerization. (apple#957)
- Part of work for apple#460.
- With CZ release 0.17.0, the IP and CIDR address
types changed from String to IPv4Address and
CIDRv4, respectively. This PR applies the corresponding
adaptations to container.
commit 8e16bb2
Author: Salman Chishti <salmanmkc@GitHub.com>
Date: Tue Dec 16 20:14:45 2025 +0000
Upgrade GitHub Actions to latest versions (apple#959)
- Upgrade GitHub Actions to their latest versions for
improved features, bug fixes, and security updates.
Signed-off-by: Salman Muin Kayser Chishti <13schishti@gmail.com>
commit 0c7dca4
Author: Salman Chishti <salmanmkc@GitHub.com>
Date: Tue Dec 16 19:23:31 2025 +0000
Add Dependabot for GitHub Actions updates (apple#960)
## Summary
Add Dependabot configuration to automatically keep GitHub Actions up to
date.
## Changes
Adds `.github/dependabot.yml` configured to:
- Check for GitHub Actions updates weekly
- Group all action updates together for easier review
- Use `ci` prefix for commit messages
## Why
As discussed in apple#958, this helps:
- Keep actions up to date with security patches automatically
- Handle Node runtime deprecations proactively (e.g., Node 20 → Node 24)
- Reduce manual maintenance burden
## Reference
Based on the pattern used in
[swift-nio](https://github.com/apple/swift-nio/blob/main/.github/dependabot.yml).
commit 637c8f1
Author: Salman Chishti <salmanmkc@GitHub.com>
Date: Tue Dec 16 18:15:42 2025 +0000
Upgrade GitHub Actions for Node 24 compatibility (apple#958)
## Summary
Upgrade GitHub Actions to their latest versions to ensure compatibility
with Node 24, as Node 20 will reach end-of-life in April 2026.
## Changes
| Action | Old Version(s) | New Version | SHA |
|--------|---------------|-------------|-----|
| `actions/checkout` | v4 | v6 | `8e8c483` |
| `actions/download-artifact` | v4 | v7 | `37930b1` |
| `actions/upload-artifact` | v4 | v6 | `b7c566a` |
| `actions/labeler` | v5 | v6 | `634933e` |
| `actions/configure-pages` | v5 | v5 | `983d773` |
| `actions/upload-pages-artifact` | v3 | v3 | `56afc60` |
| `softprops/action-gh-release` | v2 | v2 | `a06a81a` |
## Context
Per [GitHub's
announcement](https://github.blog/changelog/2025-09-19-deprecation-of-node-20-on-github-actions-runners/),
Node 20 is being deprecated and runners will begin using Node 24 by
default starting March 4th, 2026.
### Why this matters
- **Node 20 EOL**: April 2026
- **Node 24 default**: March 4th, 2026
- **Action**: Update to latest action versions that support Node 24
### Security
All actions are now **pinned to commit SHAs** instead of mutable version
tags. This provides:
- Protection against tag hijacking attacks
- Immutable, reproducible builds
- Version comments for readability
### Automated Updates
A follow-up PR (apple#960) adds Dependabot configuration to automatically
keep these actions updated with new SHA-pinned versions.
### Testing
These changes only affect CI/CD workflow configurations and should not
impact application functionality. The workflows should be tested by
running them on a branch before merging.
Signed-off-by: Salman Muin Kayser Chishti <13schishti@gmail.com>
commit c22f128
Author: karen heckel <karen.heckel@utexas.edu>
Date: Mon Dec 15 21:16:55 2025 -0800
Feat: customize console output with env variable (apple#952)
Fixesapple#915
Added a new feature to support the passing of buildkit colors for
customizing console output.
commit 9b7cfd8
Author: Saehej Kang <saehej.kang@gmail.com>
Date: Mon Dec 15 17:52:00 2025 -0800
[images]: refactor prune command (apple#941)
- Updates to `image prune` for consistency with how
other `prune` commands are done. Added missing
test cases as well for the command
- Relates to the discussion from apple#914
commit 7d30720
Author: Danny Canter <danny_canter@apple.com>
Date: Thu Dec 11 05:36:15 2025 -0800
CLI: Fix -it not being able to pipe stdout (apple#951)
Fixesapple#949
Typically if one fd is a tty, it's common for all 3 of stdio to be the
same, but that is not always the case. In our case we were using our
Terminal type from Containerization to comb through err/out/in and give
us a type backed by one of the 3 if -t was supplied. It happens that
stderr is the first we check, so our Terminal() is backed by fd 2. This
change modifies things so that we always initialize our Terminal if
asked for with fd 0, and out/err are backed by their corresponding
correct fd number.
## Type of Change
- [x] Bug fix
- [ ] New feature
- [ ] Breaking change
- [ ] Documentation update
## Testing
- [x] Tested locally
- [ ] Added/updated tests
- [ ] Added/updated docs
commit a2901e0
Author: wangxiaolei <fatelei@gmail.com>
Date: Wed Dec 10 10:04:40 2025 +0800
feat: implement version sub command (apple#911)
- closesapple#383
- implement version sub command, give more info
---------
Co-authored-by: fatelei <fatelei@fateleis-MacBook-Pro.local>
commit 0cde1ef
Author: Danny Canter <danny_canter@apple.com>
Date: Tue Dec 9 13:24:45 2025 -0800
Deps: Bump Containerization to 0.16.2 (apple#947)
Closesapple#928
Has a cgroup fix when stopping certain containers
commit 3896055
Author: Dmitry Kovba <dkovba@apple.com>
Date: Tue Dec 9 12:32:28 2025 -0800
Lowercase error messages (apple#945)
## Type of Change
- [x] Bug fix
- [ ] New feature
- [ ] Breaking change
- [ ] Documentation update
## Motivation and Context
For consistency, all error messages are lowercased.
## Testing
- [ ] Tested locally
- [ ] Added/updated tests
- [ ] Added/updated docs
---------
Co-authored-by: J Logan <sgtbakerrahulnet@yahoo.com>
commit 0733a81
Author: Saehej Kang <saehej.kang@gmail.com>
Date: Tue Dec 9 10:54:37 2025 -0800
[volumes]: refactor prune command (apple#940)
- Refactor the `volume prune` command to follow a client-side approach.
The `volumeDiskUsage` is calculated in the service file, so it made
sense to leave that there.
- Relates to the discussion from apple#914
commit 42528e6
Author: Kathryn Baldauf <k_baldauf@apple.com>
Date: Tue Dec 9 10:42:27 2025 -0800
Update CONTRIBUTORS to MAINTAINERS and point at containerization (apple#942)
## Type of Change
- [x] Documentation update
## Motivation and Context
See apple/containerization#435 for more
information on this change.
commit a64bd77
Author: J Logan <john_logan@apple.com>
Date: Tue Dec 9 14:35:34 2025 -0300
Fix broken image integration tests. (apple#944)
- Fixesapple#943.
- Use images other than alpine:3.20 for image concurrency test so as not
to interfere with tests using that image.
- Rename test files to match suite names.
commit ab92f39
Author: TTtie <me@tttie.cz>
Date: Mon Dec 8 18:17:10 2025 +0100
fix(TerminalProgress): make the progress bar respect locale-specific decimal separator (apple#936)
- The `ProgressBar#adjustFormattedSize` function currently expects a
decimal dot when adding the additional ".0" to the size. This, however,
breaks when a region with a non-dot decimal separator is used.
commit 420be74
Author: J Logan <john_logan@apple.com>
Date: Mon Dec 8 03:00:02 2025 -0300
Data integrity: bump to cz 0.16.1, adjust sync mode. (apple#939)
- 0.16.1 changes an ext4 superblock setting that might have been causing
problems.
- apple#877 fixed an issue where the cache and sync settings for block
filesystems weren't being passed down to the VZ virtual machine
configuration. The default sync value getting passed down is `full`,
which reduces I/O performance. Relax this to use `fsync` for now.
## Type of Change
- [*] Bug fix
- [ ] New feature
- [ ] Breaking change
- [ ] Documentation update
## Motivation and Context
May address problems reported in apple#877.
## Testing
- [x] Tested locally
- [ ] Added/updated tests
- [ ] Added/updated docs
commit f7bcb68
Author: Santosh Bhavani <santosh.bhavani@live.com>
Date: Sun Dec 7 10:56:50 2025 -0800
Add --max-concurrent-downloads flag for parallel layer downloads (apple#716)
Adds `--max-concurrent-downloads` flag to `container image pull` for
configurable concurrent layer downloads.
Fixesapple#715
Depends on apple/containerization#311
**Usage**:
```bash
container image pull nginx:latest --max-concurrent-downloads 6
```
**Changes**:
- Add CLI flag (default: 3)
- Thread parameter through XPC stack
- Update to use forked containerization with configurable concurrency
**Performance**: ~1.2-1.3x faster pulls for multi-layer images with
higher concurrency
**Tests**: Included standalone tests verify concurrency behavior and
parameter flow
---------
Co-authored-by: Claude <noreply@anthropic.com>
Mcrich23 added a commit to Mcrich23/container that referenced this pull request Jan 22, 2026
commit 69445b9
Author: jwhur <57657645+JaewonHur@users.noreply.github.com>
Date: Mon Jan 19 13:09:34 2026 -0800
Throw error when starting a container with invalid virtiofs source (apple#1051)
Run = Create + Start
1) Mount source points to a valid directory
- Run and Create + Start both correctly create the container with mount.
2) Mount source points to a file
- Run fails bootstrapping the container, thus container not created.
- Create creates the container, but Start fails bootstrapping, removing
the container. (Thus, both are the same.)
3) Mount source deleted or replaced to file after container created
- Start throw errors but do not delete the container.
commit 08f48d9
Author: Danny Canter <danny_canter@apple.com>
Date: Fri Jan 16 21:48:58 2026 -0800
ContainerSvc: Handle unexpected sandbox svc exits (apple#1065)
Closesapple#1050
If the sandbox svc exits out of band of the usual stop (or regular exit)
case the container svc's state is not properly updated for the
container. This was due to the cleanup steps involving trying to send
the shutdown rpc which cannot succeed as the sandbox svc does not exist
to service it.
To handle this, let's treat shutdown not returning successfully as
non-fatal (as this is mostly best effort), log an error and continue the
state cleanup.
commit b928e3f
Author: Amir Alperin <me@remotecpp.dev>
Date: Sat Jan 17 07:43:48 2026 +0200
fix: performance warning should not output ANSI codes if stderr redirected (apple#1059)
commit 744e7f7
Author: J Logan <john_logan@apple.com>
Date: Fri Jan 16 16:26:13 2026 -0800
Update for containerization 0.21.0. (apple#1056)
- Update image load and build to handle rejected paths during tar
extraction. For the image load command there is now a `--force` function
that fails extractions with rejected paths when false, and just warns
about the rejected paths when true.
- Update `container stats` for statistics API properties now all being
optional.
## Type of Change
- [x] Bug fix
- [ ] New feature
- [ ] Breaking change
- [x] Documentation update
## Motivation and Context
See above
## Testing
- [x] Tested locally
- [x] Added/updated tests
- [x] Added/updated docs
commit b1577d8
Author: J Logan <john_logan@apple.com>
Date: Fri Jan 16 15:50:47 2026 -0800
Adds opt-in pre-commit hook for format and header checks. (apple#1062)
- Closesapple#639.
- Adds swift format configuration that removes lint checks so we can use
`swift lint` to perform format-only tests.
- Adds `check` target that invokes format and header checks.
- Adds pre-commit script that runs `make check`.
- Adds `pre-commit` target that installs the check script as a
pre-commit hook.
## Type of Change
- [ ] Bug fix
- [x] New feature
- [ ] Breaking change
- [x] Documentation update
## Motivation and Context
Avoids wasting time and commit rewrites.
## Testing
- [x] Tested locally
- [ ] Added/updated tests
- [x] Added/updated docs
commit 3cf2c6a
Author: J Logan <john_logan@apple.com>
Date: Fri Jan 16 13:41:32 2026 -0800
Fix unstable integration tests. (apple#1060)
- TestCLIRunCommand now run so many tests concurrently that the API
server gets swamped and tests randomly time out.
- The parallelism options on `swift test` only work for XCTest, not
swift-testing.
- Work around this while retaining some parallelism (good for stress
testing) by breaking the tests into two suites.
commit 8897fcc
Author: Manu Schiller <56154253+manuschillerdev@users.noreply.github.com>
Date: Wed Jan 14 04:39:08 2026 +0100
fix: use pax instead of tar for pkg payload extraction (apple#1038)
- It is common to have `gnu-tar` alongside other GNU tools
installed and aliased for compatibility reasons. However, this
breaks the current make build.
- Use BSD-only binaries (no GNU equivalents that are
commonly aliased), making the Makefile more portable.
commit dbec1db
Author: Ronit Sabhaya <ronitsabhaya75@gmail.com>
Date: Mon Jan 12 20:34:25 2026 -0600
Add support for aarch64 architecture alias (apple#1040)
- Adds `aarch64` as an alias for `arm64` in the `Arch` enum. This
addresses the maintainer's request to support this common architecture
name, ensuring consistency with `x86_64` normalization and preventing
failures for users expecting `aarch64` support.
commit 837aa5e
Author: jwhur <57657645+JaewonHur@users.noreply.github.com>
Date: Mon Jan 12 14:36:10 2026 -0800
Fix the FS error when using Virtualization (apple#1041)
- Fixesapple#614.
- Use VZ cached mode instead of auto.
Signed-off-by: jwhur <jaewon_hur@apple.com>
commit e465b10
Author: 박성근 <117553364+ParkSeongGeun@users.noreply.github.com>
Date: Tue Jan 13 03:30:51 2026 +0900
Fix relative path resolution in entrypoint (apple#987)
- Fixesapple#962.
- Adds test to exercise apple/containerization#473.
- Updates containerization to 0.20.1.
Signed-off-by: ParkSeongGeun <phd0801@naver.com>
commit aa77928
Author: Ronit Sabhaya <ronitsabhaya75@gmail.com>
Date: Mon Jan 12 12:04:46 2026 -0600
Fix: Support x86_64 architecture alias to prevent silent pull failure… (apple#1036)
- Adds architecture name normalization to accept
`x86_64` and `x86-64` as aliases for `amd64`.
commit dc4682b
Author: Amir Alperin <me@remotecpp.dev>
Date: Fri Jan 9 21:10:53 2026 +0200
fix: extract hostname from FQDN (apple#1011) (apple#1017)
- Set the container hostname to the first DNS
label derived from the container id, strip everything
after the first dot.
- Fixesapple#1011.
commit 4af1cc0
Author: Ronit Sabhaya <ronitsabhaya75@gmail.com>
Date: Thu Jan 8 21:27:43 2026 -0600
fix: improve error message when binding to privileged ports (fixesapple#978) (apple#1031)
- The container fails to start with a generic "permission denied"
error when attempting to publish privileged ports (ports below
1024) without root privileges. This provides a confusing user
experience as the error doesn't explain why permission was
denied.
commit 21facf0
Author: J Logan <john_logan@apple.com>
Date: Thu Jan 8 17:02:22 2026 -0800
Add instructions for using locally built init filesystem. (apple#1032)
- Closesapple#1030.
commit b671690
Author: Danny Canter <danny_canter@apple.com>
Date: Wed Jan 7 21:01:10 2026 -0800
ProgressBar: Various fixes (apple#1025)
There's a couple things I don't think are intuitive about this.
1. Because of the internal task, render() can still be called even after
finish() completes. Ideally async defers are supported and we could just
await the final render completing after cancelling the task and setting
.finished, but alas. To fix this we can just lock across the methods for
now.
2. We always clear the screen in the destructor, even if we don't use
the
progress bar. I don't think we should honestly do anything in the
destructor.
Feels a programmer error not to defer { bar.finish() } or call it
somewhere.
3. Our spaces based line clearing. Use the ansi escape sequence for
clearing line;
I think our calculations were slightly off and it would leave trailing
output ( "s]" )
in some cases.
4. Shrinking the window until the output is smaller than the terminal
window (and vice
versa) is wonky on various term emulators. Truthfully, this is just a
hard problem,
but we can truncate our output and still provide some useful info.
This fixes some single line output (cat /etc/hostname etc.) getting
cleared in our atexit handler, as well as the need for the usleep.
commit 98410fd
Author: J Logan <john_logan@apple.com>
Date: Wed Jan 7 18:23:31 2026 -0800
Adds IPv6 port forwarding. (apple#1029)
- Closesapple#1006.
commit 9d06475
Author: Saehej Kang <saehej.kang@gmail.com>
Date: Wed Jan 7 16:53:33 2026 -0800
[container]: add startedDate field (apple#1018)
- Closesapple#302.
- Closesapple#336 (obsoletes this PR).
commit db8932a
Author: J Logan <john_logan@apple.com>
Date: Wed Jan 7 15:35:35 2026 -0800
Resolve IPv6 address queries for container names. (apple#1016)
- Closesapple#1005.
- Adapt everything to use MACAddress type from containerization 0.20.0.
- Allocate MAC addresses for every container so that we have
deterministic IPv6 link local addresses.
- Add AAAA handling to ContainerDNSHandler.
- NOTE: Only works on Tahoe. On Sequoia, we don't have a good way to set
or determine the IPv6 network prefix when networks are created, so we
can't infer the IPv6 link local addresses for AAAA responses and we
instead return `NODATA`.
commit 5d6c750
Author: Danny Canter <danny_canter@apple.com>
Date: Wed Jan 7 14:48:58 2026 -0800
CLI: Add read-only flag to run/create (apple#999)
Closesapple#990
Sets the rootfs for a container to read-only.
commit aac2457
Author: Danny Canter <danny_canter@apple.com>
Date: Wed Jan 7 13:46:26 2026 -0800
Tests: Fix relative path mount tests (apple#1028)
The tests are run in parallel on CI, and were split into three tests.
They change the cwd, so it's kind of a gamble whether some of them pass.
This just moves all the logic into one test mostly.
commit 9cd5397
Author: J Logan <john_logan@apple.com>
Date: Wed Jan 7 10:35:19 2026 -0800
Update to containerization 0.20.0. (apple#1027)
- Use MACAddress for Attachment and CZ interfaces.
- Move data validation closer to API surface.
commit 356c8d2
Author: J Logan <john_logan@apple.com>
Date: Tue Jan 6 08:27:14 2026 -0800
Reorganize client libraries. (apple#1020)
- Closesapple#461.
- Extract core types into ContainerResources target.
- Extract ContainerNetworkServiceClient from ContainerNetworkService.
- Relocate sandbox client from ContainerClient to
ContainerSandboxServiceClient.
- Relocate ContainerClient to ContainerAPIServiceClient.
- Common structure from services and clients under Source/Services.
Updated project hierarchy:
```
Sources/CAuditToken - audit token access wrapper
Sources/CLI - CLI executable
Sources/ContainerBuild - builder
Sources/ContainerCommands - CLI command implementations
Sources/ContainerLog - logging helpers
Sources/ContainerPersistence - persistent data and system property helpers
Sources/ContainerPlugin - plugin system
Sources/ContainerResource - resource (container, image, volume, network) types
Sources/ContainerVersion - version helpers
Sources/ContainerXPC - XPC helpers
Sources/CVersion - injected project version
Sources/DNSServer - container DNS resolver
Sources/Helpers - service executables
Sources/Services/*/Client - service clients
Sources/Services/*/Server - service implementations
Sources/SocketForwarder - port forwarding
Sources/TerminalProgress - progress bar
```
## Type of Change
- [ ] Bug fix
- [ ] New feature
- [x] Breaking change
- [ ] Documentation update
## Motivation and Context
The ContainerClient library was a bit of a grab bag. This refactor
applies a more sensible project and library structure for resource data
types, services, and clients.
## Testing
- [x] Tested locally
- [x] Added/updated tests
- [ ] Added/updated docs
commit 8c439cd
Author: Danny Canter <danny_canter@apple.com>
Date: Mon Jan 5 13:50:57 2026 -0800
makefile: Add cli target (apple#1022)
Often times I'll be making a change that only touches the cli and I
don't feel like sitting through the potential song and dance of the
other components building/installing.
commit d6f052d
Author: Kathryn Baldauf <k_baldauf@apple.com>
Date: Mon Jan 5 13:09:34 2026 -0800
Update license header on all files to include the current year (apple#1024)
## Motivation and Context
Now that we're in 2026, we need to update the license headers on all the
files. Unfortunately, Hawkeye doesn't have an attribute for the current
year to help us avoid this in the future. Instead, I had to work around
this by doing the following:
1. Update licenserc.toml with:
```
[properties]
... (other properties)
currentYear = "2026"
```
2. Update scripts/license-header.txt with
```
Copyright ©{{ " " }}{%- set created = attrs.git_file_created_year or
attrs.disk_file_created_year -%}{%- set modified = props["currentYear"]
-%}{%- if created != modified -%} {{created}}-{{modified}}{%- else
-%}{{created}}{%- endif -%}{{ " " }}{{ props["copyrightOwner"] }}.
```
Then I removed these two changes before committing. After this PR is
merged, all files will have recently had git updates, so the existing
code for setting the modified year should work as intended.
Signed-off-by: Kathryn Baldauf <k_baldauf@apple.com>
commit 20dc0bc
Author: Danny Canter <danny_canter@apple.com>
Date: Sun Jan 4 11:11:09 2026 -0800
Parser: Support relative paths for --volume (apple#1013)
commit 028e7e1
Author: Danny Canter <danny_canter@apple.com>
Date: Sun Jan 4 10:52:46 2026 -0800
Deps: Bump Containerization to 0.19.0 (apple#1015)
Has read-only rootfs support.
commit 020949e
Author: Danny Canter <danny_canter@apple.com>
Date: Sun Jan 4 10:51:20 2026 -0800
CLI: Small fixups for implicit envvars (apple#1014)
We should only inherit from the host if there's no =. Additionally
document the flag a little more to show that we can inherit from the
host.
commit df368b7
Author: Amir Alperin <alperin.amir@gmail.com>
Date: Sun Jan 4 20:49:22 2026 +0200
Fix port validation to allow same port for different protocols (apple#992) (apple#1000)
- Fixes: apple#992
- Port validation previously rejected valid configurations
when the same port number was used for different
protocols (TCP and UDP). For example:
`-p 1024:1024/udp -p 1024:1024/tcp`
Although this is a valid and common use case, the
validation logic treated it as a conflict.
To fix this, I updated the validation key to include the protocol name.
The validation now checks for overlapping port numbers only within the
same protocol, rather than across all protocols.
This change enables binding the same port number for both TCP and UDP,
aligning the validation behavior with real-world networking
requirements.
## Testing
- [x] Tested locally
- [x] Added/updated tests
- [ ] Added/updated docs
commit cf64614
Author: J Logan <john_logan@apple.com>
Date: Fri Jan 2 14:10:48 2026 -0800
Update OSS header in Package.swift. (apple#1010)
commit 375ce16
Author: J Logan <john_logan@apple.com>
Date: Fri Jan 2 12:09:12 2026 -0800
Fix OSS header dates that break CI checks. (apple#1009)
commit 580d853
Author: c <claudeaceae@icloud.com>
Date: Fri Jan 2 00:19:57 2026 -0500
Use full path for uninstall script in upgrade instructions (apple#983)
- Makes the upgrade section consistent with the
uninstall section by using the full path to the
uninstall script.
commit 4cadc40
Author: c <claudeaceae@icloud.com>
Date: Thu Jan 1 22:53:56 2026 -0500
Clarify uninstall script location in README (apple#982)
- Clarifies where the `uninstall-container.sh` script is located after
installation
- Updates example commands to use the full path
commit 4e78e30
Author: c <claudeaceae@icloud.com>
Date: Thu Jan 1 20:57:47 2026 -0500
Fix grammar in tutorial.md (apple#985)
## Summary
- Fixes a grammar error in the tutorial's publish section
## Details
Line 287 of `docs/tutorial.md` had "you need push images" which should
be "you need to push images".
This is a simple grammar fix to improve readability.
## Test plan
- [x] Verified the sentence now reads correctly
commit 22dfd6e
Author: Danny Canter <danny_canter@apple.com>
Date: Thu Jan 1 17:57:00 2026 -0800
CLI: Fix stop not signalling waiters (apple#972)
commit 4958cf2
Author: c <claudeaceae@icloud.com>
Date: Thu Jan 1 20:51:10 2026 -0500
Fix bash completion source path in documentation (apple#981)
- Corrects the source path for bash completion script
when not using bash-completion package.
commit 25ac79a
Author: c <claudeaceae@icloud.com>
Date: Thu Jan 1 20:50:19 2026 -0500
Fix MAC address option typo in how-to documentation (apple#980)
- Corrects the MAC address example command in the
how-to guide to use the correct `--network` flag syntax
instead of the incorrect `--mac-address` flag.
commit edadf15
Author: Raj <realrajaryan@gmail.com>
Date: Thu Jan 1 15:10:39 2026 +0530
Fix container auto-delete on rapid stop/start (apple#841)
Fixesapple#833.
Currently, when stopping and immediately restarting a container, it would fail with the error:
`“container expected to be in created state, got: shuttingDown”` and then be automatically deleted.
The `SandboxService` process waits five seconds before exiting after shutdown. During this interval, a rapid restart could reconnect to the still-terminating process in the `shuttingDown` state, triggering a state validation error.
This fix forcefully terminates the `SandboxService` process with `SIGKILL` upon container exit, instead of waiting five seconds. The bootstrap now defensively checks for and cleans up any stale services before registering new ones, preventing reconnections to processes in the `shuttingDown` state.
commit 5064b0f
Author: J Logan <john_logan@apple.com>
Date: Mon Dec 22 10:16:14 2025 -0800
Adds network IPv6 configuration. (apple#975)
- Part of work for apple#460.
- Enable set/get of IPv6 network prefix in ReservedVmnetNetwork.
- Show IPv6 prefix in `network list` full output.
- Option for setting IPv6 prefix when creating a network.
- System property for default IPv6 prefix.
## Type of Change
- [ ] Bug fix
- [x] New feature
- [ ] Breaking change
- [x] Documentation update
## Motivation and Context
See apple#460.
## Testing
- [x] Tested locally
- [ ] Added/updated tests
- [x] Added/updated docs
commit 9c239aa
Author: Volodymyr Bortniak <25820601+Bortnyak@users.noreply.github.com>
Date: Sat Dec 20 00:36:02 2025 +0100
Add support for reading env from named pipes (apple#974)
This is a fix for
[issue#956](apple#956)
`FileManager.default.contents(atPath:)` returns `nil` for named pipes
(FIFOs)
and process substitutions like `/dev/fd/XX` because:
1. It expects regular files with a known size
2. Named pipes are stream-based and block until data arrives
## Solution
Use `FileHandle(forReadingFrom:)` instead, which:
- Properly handles blocking I/O
- Works with named pipes, process substitutions, and regular files
(mentioned in the
[doc](https://developer.apple.com/documentation/foundation/filehandle))
Co-authored-by: Bortniak Volodymyr <Bortnyak@users.noreply.github.com>
commit 3c3a83c
Author: Danny Canter <danny_canter@apple.com>
Date: Thu Dec 18 16:28:44 2025 -0800
Turn on oops=panic kernel cmdline (apple#971)
commit b1b9980
Author: Michael Gathara <mikegtrm@gmail.com>
Date: Wed Dec 17 20:58:50 2025 -0600
Fix: Kubes Cluster in Container Crashing Container (IS#923) (apple#930)
- Fixes issue apple#923
- I fixed a race condition in `ConnectHandler.swift` where
an asynchronous network connection could complete
after the handler had already been removed from the
pipeline.
- This prevents the EXC_BREAKPOINT crash in
container-runtime-linux that occurred when kinc
(Kubernetes in Container) created rapid connections.
- The actual fix was inadvertently applied in apple#957, so this
PR contains only the test code.
commit 9f4efe0
Author: Saehej Kang <saehej.kang@gmail.com>
Date: Wed Dec 17 00:30:33 2025 -0800
[networks]: add prune command (apple#914)
- Closesapple#893
commit 4f88725
Author: J Logan <john_logan@apple.com>
Date: Tue Dec 16 16:34:13 2025 -0800
Use new IP/CIDR types from Containerization. (apple#957)
- Part of work for apple#460.
- With CZ release 0.17.0, the IP and CIDR address
types changed from String to IPv4Address and
CIDRv4, respectively. This PR applies the corresponding
adaptations to container.
commit 8e16bb2
Author: Salman Chishti <salmanmkc@GitHub.com>
Date: Tue Dec 16 20:14:45 2025 +0000
Upgrade GitHub Actions to latest versions (apple#959)
- Upgrade GitHub Actions to their latest versions for
improved features, bug fixes, and security updates.
Signed-off-by: Salman Muin Kayser Chishti <13schishti@gmail.com>
commit 0c7dca4
Author: Salman Chishti <salmanmkc@GitHub.com>
Date: Tue Dec 16 19:23:31 2025 +0000
Add Dependabot for GitHub Actions updates (apple#960)
## Summary
Add Dependabot configuration to automatically keep GitHub Actions up to
date.
## Changes
Adds `.github/dependabot.yml` configured to:
- Check for GitHub Actions updates weekly
- Group all action updates together for easier review
- Use `ci` prefix for commit messages
## Why
As discussed in apple#958, this helps:
- Keep actions up to date with security patches automatically
- Handle Node runtime deprecations proactively (e.g., Node 20 → Node 24)
- Reduce manual maintenance burden
## Reference
Based on the pattern used in
[swift-nio](https://github.com/apple/swift-nio/blob/main/.github/dependabot.yml).
commit 637c8f1
Author: Salman Chishti <salmanmkc@GitHub.com>
Date: Tue Dec 16 18:15:42 2025 +0000
Upgrade GitHub Actions for Node 24 compatibility (apple#958)
## Summary
Upgrade GitHub Actions to their latest versions to ensure compatibility
with Node 24, as Node 20 will reach end-of-life in April 2026.
## Changes
| Action | Old Version(s) | New Version | SHA |
|--------|---------------|-------------|-----|
| `actions/checkout` | v4 | v6 | `8e8c483` |
| `actions/download-artifact` | v4 | v7 | `37930b1` |
| `actions/upload-artifact` | v4 | v6 | `b7c566a` |
| `actions/labeler` | v5 | v6 | `634933e` |
| `actions/configure-pages` | v5 | v5 | `983d773` |
| `actions/upload-pages-artifact` | v3 | v3 | `56afc60` |
| `softprops/action-gh-release` | v2 | v2 | `a06a81a` |
## Context
Per [GitHub's
announcement](https://github.blog/changelog/2025-09-19-deprecation-of-node-20-on-github-actions-runners/),
Node 20 is being deprecated and runners will begin using Node 24 by
default starting March 4th, 2026.
### Why this matters
- **Node 20 EOL**: April 2026
- **Node 24 default**: March 4th, 2026
- **Action**: Update to latest action versions that support Node 24
### Security
All actions are now **pinned to commit SHAs** instead of mutable version
tags. This provides:
- Protection against tag hijacking attacks
- Immutable, reproducible builds
- Version comments for readability
### Automated Updates
A follow-up PR (apple#960) adds Dependabot configuration to automatically
keep these actions updated with new SHA-pinned versions.
### Testing
These changes only affect CI/CD workflow configurations and should not
impact application functionality. The workflows should be tested by
running them on a branch before merging.
Signed-off-by: Salman Muin Kayser Chishti <13schishti@gmail.com>
commit c22f128
Author: karen heckel <karen.heckel@utexas.edu>
Date: Mon Dec 15 21:16:55 2025 -0800
Feat: customize console output with env variable (apple#952)
Fixesapple#915
Added a new feature to support the passing of buildkit colors for
customizing console output.
commit 9b7cfd8
Author: Saehej Kang <saehej.kang@gmail.com>
Date: Mon Dec 15 17:52:00 2025 -0800
[images]: refactor prune command (apple#941)
- Updates to `image prune` for consistency with how
other `prune` commands are done. Added missing
test cases as well for the command
- Relates to the discussion from apple#914
commit 7d30720
Author: Danny Canter <danny_canter@apple.com>
Date: Thu Dec 11 05:36:15 2025 -0800
CLI: Fix -it not being able to pipe stdout (apple#951)
Fixesapple#949
Typically if one fd is a tty, it's common for all 3 of stdio to be the
same, but that is not always the case. In our case we were using our
Terminal type from Containerization to comb through err/out/in and give
us a type backed by one of the 3 if -t was supplied. It happens that
stderr is the first we check, so our Terminal() is backed by fd 2. This
change modifies things so that we always initialize our Terminal if
asked for with fd 0, and out/err are backed by their corresponding
correct fd number.
## Type of Change
- [x] Bug fix
- [ ] New feature
- [ ] Breaking change
- [ ] Documentation update
## Testing
- [x] Tested locally
- [ ] Added/updated tests
- [ ] Added/updated docs
commit a2901e0
Author: wangxiaolei <fatelei@gmail.com>
Date: Wed Dec 10 10:04:40 2025 +0800
feat: implement version sub command (apple#911)
- closesapple#383
- implement version sub command, give more info
---------
Co-authored-by: fatelei <fatelei@fateleis-MacBook-Pro.local>
commit 0cde1ef
Author: Danny Canter <danny_canter@apple.com>
Date: Tue Dec 9 13:24:45 2025 -0800
Deps: Bump Containerization to 0.16.2 (apple#947)
Closesapple#928
Has a cgroup fix when stopping certain containers
commit 3896055
Author: Dmitry Kovba <dkovba@apple.com>
Date: Tue Dec 9 12:32:28 2025 -0800
Lowercase error messages (apple#945)
## Type of Change
- [x] Bug fix
- [ ] New feature
- [ ] Breaking change
- [ ] Documentation update
## Motivation and Context
For consistency, all error messages are lowercased.
## Testing
- [ ] Tested locally
- [ ] Added/updated tests
- [ ] Added/updated docs
---------
Co-authored-by: J Logan <sgtbakerrahulnet@yahoo.com>
commit 0733a81
Author: Saehej Kang <saehej.kang@gmail.com>
Date: Tue Dec 9 10:54:37 2025 -0800
[volumes]: refactor prune command (apple#940)
- Refactor the `volume prune` command to follow a client-side approach.
The `volumeDiskUsage` is calculated in the service file, so it made
sense to leave that there.
- Relates to the discussion from apple#914
commit 42528e6
Author: Kathryn Baldauf <k_baldauf@apple.com>
Date: Tue Dec 9 10:42:27 2025 -0800
Update CONTRIBUTORS to MAINTAINERS and point at containerization (apple#942)
## Type of Change
- [x] Documentation update
## Motivation and Context
See apple/containerization#435 for more
information on this change.
commit a64bd77
Author: J Logan <john_logan@apple.com>
Date: Tue Dec 9 14:35:34 2025 -0300
Fix broken image integration tests. (apple#944)
- Fixesapple#943.
- Use images other than alpine:3.20 for image concurrency test so as not
to interfere with tests using that image.
- Rename test files to match suite names.
commit ab92f39
Author: TTtie <me@tttie.cz>
Date: Mon Dec 8 18:17:10 2025 +0100
fix(TerminalProgress): make the progress bar respect locale-specific decimal separator (apple#936)
- The `ProgressBar#adjustFormattedSize` function currently expects a
decimal dot when adding the additional ".0" to the size. This, however,
breaks when a region with a non-dot decimal separator is used.
commit 420be74
Author: J Logan <john_logan@apple.com>
Date: Mon Dec 8 03:00:02 2025 -0300
Data integrity: bump to cz 0.16.1, adjust sync mode. (apple#939)
- 0.16.1 changes an ext4 superblock setting that might have been causing
problems.
- apple#877 fixed an issue where the cache and sync settings for block
filesystems weren't being passed down to the VZ virtual machine
configuration. The default sync value getting passed down is `full`,
which reduces I/O performance. Relax this to use `fsync` for now.
## Type of Change
- [*] Bug fix
- [ ] New feature
- [ ] Breaking change
- [ ] Documentation update
## Motivation and Context
May address problems reported in apple#877.
## Testing
- [x] Tested locally
- [ ] Added/updated tests
- [ ] Added/updated docs
commit f7bcb68
Author: Santosh Bhavani <santosh.bhavani@live.com>
Date: Sun Dec 7 10:56:50 2025 -0800
Add --max-concurrent-downloads flag for parallel layer downloads (apple#716)
Adds `--max-concurrent-downloads` flag to `container image pull` for
configurable concurrent layer downloads.
Fixesapple#715
Depends on apple/containerization#311
**Usage**:
```bash
container image pull nginx:latest --max-concurrent-downloads 6
```
**Changes**:
- Add CLI flag (default: 3)
- Thread parameter through XPC stack
- Update to use forked containerization with configurable concurrency
**Performance**: ~1.2-1.3x faster pulls for multi-layer images with
higher concurrency
**Tests**: Included standalone tests verify concurrency behavior and
parameter flow
---------
Co-authored-by: Claude <noreply@anthropic.com>
Mcrich23 added a commit to Mcrich23/container that referenced this pull request Jan 22, 2026
commit 69445b9
Author: jwhur <57657645+JaewonHur@users.noreply.github.com>
Date: Mon Jan 19 13:09:34 2026 -0800
Throw error when starting a container with invalid virtiofs source (apple#1051)
Run = Create + Start
1) Mount source points to a valid directory
- Run and Create + Start both correctly create the container with mount.
2) Mount source points to a file
- Run fails bootstrapping the container, thus container not created.
- Create creates the container, but Start fails bootstrapping, removing
the container. (Thus, both are the same.)
3) Mount source deleted or replaced to file after container created
- Start throw errors but do not delete the container.
commit 08f48d9
Author: Danny Canter <danny_canter@apple.com>
Date: Fri Jan 16 21:48:58 2026 -0800
ContainerSvc: Handle unexpected sandbox svc exits (apple#1065)
Closesapple#1050
If the sandbox svc exits out of band of the usual stop (or regular exit)
case the container svc's state is not properly updated for the
container. This was due to the cleanup steps involving trying to send
the shutdown rpc which cannot succeed as the sandbox svc does not exist
to service it.
To handle this, let's treat shutdown not returning successfully as
non-fatal (as this is mostly best effort), log an error and continue the
state cleanup.
commit b928e3f
Author: Amir Alperin <me@remotecpp.dev>
Date: Sat Jan 17 07:43:48 2026 +0200
fix: performance warning should not output ANSI codes if stderr redirected (apple#1059)
commit 744e7f7
Author: J Logan <john_logan@apple.com>
Date: Fri Jan 16 16:26:13 2026 -0800
Update for containerization 0.21.0. (apple#1056)
- Update image load and build to handle rejected paths during tar
extraction. For the image load command there is now a `--force` function
that fails extractions with rejected paths when false, and just warns
about the rejected paths when true.
- Update `container stats` for statistics API properties now all being
optional.
## Type of Change
- [x] Bug fix
- [ ] New feature
- [ ] Breaking change
- [x] Documentation update
## Motivation and Context
See above
## Testing
- [x] Tested locally
- [x] Added/updated tests
- [x] Added/updated docs
commit b1577d8
Author: J Logan <john_logan@apple.com>
Date: Fri Jan 16 15:50:47 2026 -0800
Adds opt-in pre-commit hook for format and header checks. (apple#1062)
- Closesapple#639.
- Adds swift format configuration that removes lint checks so we can use
`swift lint` to perform format-only tests.
- Adds `check` target that invokes format and header checks.
- Adds pre-commit script that runs `make check`.
- Adds `pre-commit` target that installs the check script as a
pre-commit hook.
## Type of Change
- [ ] Bug fix
- [x] New feature
- [ ] Breaking change
- [x] Documentation update
## Motivation and Context
Avoids wasting time and commit rewrites.
## Testing
- [x] Tested locally
- [ ] Added/updated tests
- [x] Added/updated docs
commit 3cf2c6a
Author: J Logan <john_logan@apple.com>
Date: Fri Jan 16 13:41:32 2026 -0800
Fix unstable integration tests. (apple#1060)
- TestCLIRunCommand now run so many tests concurrently that the API
server gets swamped and tests randomly time out.
- The parallelism options on `swift test` only work for XCTest, not
swift-testing.
- Work around this while retaining some parallelism (good for stress
testing) by breaking the tests into two suites.
commit 8897fcc
Author: Manu Schiller <56154253+manuschillerdev@users.noreply.github.com>
Date: Wed Jan 14 04:39:08 2026 +0100
fix: use pax instead of tar for pkg payload extraction (apple#1038)
- It is common to have `gnu-tar` alongside other GNU tools
installed and aliased for compatibility reasons. However, this
breaks the current make build.
- Use BSD-only binaries (no GNU equivalents that are
commonly aliased), making the Makefile more portable.
commit dbec1db
Author: Ronit Sabhaya <ronitsabhaya75@gmail.com>
Date: Mon Jan 12 20:34:25 2026 -0600
Add support for aarch64 architecture alias (apple#1040)
- Adds `aarch64` as an alias for `arm64` in the `Arch` enum. This
addresses the maintainer's request to support this common architecture
name, ensuring consistency with `x86_64` normalization and preventing
failures for users expecting `aarch64` support.
commit 837aa5e
Author: jwhur <57657645+JaewonHur@users.noreply.github.com>
Date: Mon Jan 12 14:36:10 2026 -0800
Fix the FS error when using Virtualization (apple#1041)
- Fixesapple#614.
- Use VZ cached mode instead of auto.
Signed-off-by: jwhur <jaewon_hur@apple.com>
commit e465b10
Author: 박성근 <117553364+ParkSeongGeun@users.noreply.github.com>
Date: Tue Jan 13 03:30:51 2026 +0900
Fix relative path resolution in entrypoint (apple#987)
- Fixesapple#962.
- Adds test to exercise apple/containerization#473.
- Updates containerization to 0.20.1.
Signed-off-by: ParkSeongGeun <phd0801@naver.com>
commit aa77928
Author: Ronit Sabhaya <ronitsabhaya75@gmail.com>
Date: Mon Jan 12 12:04:46 2026 -0600
Fix: Support x86_64 architecture alias to prevent silent pull failure… (apple#1036)
- Adds architecture name normalization to accept
`x86_64` and `x86-64` as aliases for `amd64`.
commit dc4682b
Author: Amir Alperin <me@remotecpp.dev>
Date: Fri Jan 9 21:10:53 2026 +0200
fix: extract hostname from FQDN (apple#1011) (apple#1017)
- Set the container hostname to the first DNS
label derived from the container id, strip everything
after the first dot.
- Fixesapple#1011.
commit 4af1cc0
Author: Ronit Sabhaya <ronitsabhaya75@gmail.com>
Date: Thu Jan 8 21:27:43 2026 -0600
fix: improve error message when binding to privileged ports (fixesapple#978) (apple#1031)
- The container fails to start with a generic "permission denied"
error when attempting to publish privileged ports (ports below
1024) without root privileges. This provides a confusing user
experience as the error doesn't explain why permission was
denied.
commit 21facf0
Author: J Logan <john_logan@apple.com>
Date: Thu Jan 8 17:02:22 2026 -0800
Add instructions for using locally built init filesystem. (apple#1032)
- Closesapple#1030.
commit b671690
Author: Danny Canter <danny_canter@apple.com>
Date: Wed Jan 7 21:01:10 2026 -0800
ProgressBar: Various fixes (apple#1025)
There's a couple things I don't think are intuitive about this.
1. Because of the internal task, render() can still be called even after
finish() completes. Ideally async defers are supported and we could just
await the final render completing after cancelling the task and setting
.finished, but alas. To fix this we can just lock across the methods for
now.
2. We always clear the screen in the destructor, even if we don't use
the
progress bar. I don't think we should honestly do anything in the
destructor.
Feels a programmer error not to defer { bar.finish() } or call it
somewhere.
3. Our spaces based line clearing. Use the ansi escape sequence for
clearing line;
I think our calculations were slightly off and it would leave trailing
output ( "s]" )
in some cases.
4. Shrinking the window until the output is smaller than the terminal
window (and vice
versa) is wonky on various term emulators. Truthfully, this is just a
hard problem,
but we can truncate our output and still provide some useful info.
This fixes some single line output (cat /etc/hostname etc.) getting
cleared in our atexit handler, as well as the need for the usleep.
commit 98410fd
Author: J Logan <john_logan@apple.com>
Date: Wed Jan 7 18:23:31 2026 -0800
Adds IPv6 port forwarding. (apple#1029)
- Closesapple#1006.
commit 9d06475
Author: Saehej Kang <saehej.kang@gmail.com>
Date: Wed Jan 7 16:53:33 2026 -0800
[container]: add startedDate field (apple#1018)
- Closesapple#302.
- Closesapple#336 (obsoletes this PR).
commit db8932a
Author: J Logan <john_logan@apple.com>
Date: Wed Jan 7 15:35:35 2026 -0800
Resolve IPv6 address queries for container names. (apple#1016)
- Closesapple#1005.
- Adapt everything to use MACAddress type from containerization 0.20.0.
- Allocate MAC addresses for every container so that we have
deterministic IPv6 link local addresses.
- Add AAAA handling to ContainerDNSHandler.
- NOTE: Only works on Tahoe. On Sequoia, we don't have a good way to set
or determine the IPv6 network prefix when networks are created, so we
can't infer the IPv6 link local addresses for AAAA responses and we
instead return `NODATA`.
commit 5d6c750
Author: Danny Canter <danny_canter@apple.com>
Date: Wed Jan 7 14:48:58 2026 -0800
CLI: Add read-only flag to run/create (apple#999)
Closesapple#990
Sets the rootfs for a container to read-only.
commit aac2457
Author: Danny Canter <danny_canter@apple.com>
Date: Wed Jan 7 13:46:26 2026 -0800
Tests: Fix relative path mount tests (apple#1028)
The tests are run in parallel on CI, and were split into three tests.
They change the cwd, so it's kind of a gamble whether some of them pass.
This just moves all the logic into one test mostly.
commit 9cd5397
Author: J Logan <john_logan@apple.com>
Date: Wed Jan 7 10:35:19 2026 -0800
Update to containerization 0.20.0. (apple#1027)
- Use MACAddress for Attachment and CZ interfaces.
- Move data validation closer to API surface.
commit 356c8d2
Author: J Logan <john_logan@apple.com>
Date: Tue Jan 6 08:27:14 2026 -0800
Reorganize client libraries. (apple#1020)
- Closesapple#461.
- Extract core types into ContainerResources target.
- Extract ContainerNetworkServiceClient from ContainerNetworkService.
- Relocate sandbox client from ContainerClient to
ContainerSandboxServiceClient.
- Relocate ContainerClient to ContainerAPIServiceClient.
- Common structure from services and clients under Source/Services.
Updated project hierarchy:
```
Sources/CAuditToken - audit token access wrapper
Sources/CLI - CLI executable
Sources/ContainerBuild - builder
Sources/ContainerCommands - CLI command implementations
Sources/ContainerLog - logging helpers
Sources/ContainerPersistence - persistent data and system property helpers
Sources/ContainerPlugin - plugin system
Sources/ContainerResource - resource (container, image, volume, network) types
Sources/ContainerVersion - version helpers
Sources/ContainerXPC - XPC helpers
Sources/CVersion - injected project version
Sources/DNSServer - container DNS resolver
Sources/Helpers - service executables
Sources/Services/*/Client - service clients
Sources/Services/*/Server - service implementations
Sources/SocketForwarder - port forwarding
Sources/TerminalProgress - progress bar
```
## Type of Change
- [ ] Bug fix
- [ ] New feature
- [x] Breaking change
- [ ] Documentation update
## Motivation and Context
The ContainerClient library was a bit of a grab bag. This refactor
applies a more sensible project and library structure for resource data
types, services, and clients.
## Testing
- [x] Tested locally
- [x] Added/updated tests
- [ ] Added/updated docs
commit 8c439cd
Author: Danny Canter <danny_canter@apple.com>
Date: Mon Jan 5 13:50:57 2026 -0800
makefile: Add cli target (apple#1022)
Often times I'll be making a change that only touches the cli and I
don't feel like sitting through the potential song and dance of the
other components building/installing.
commit d6f052d
Author: Kathryn Baldauf <k_baldauf@apple.com>
Date: Mon Jan 5 13:09:34 2026 -0800
Update license header on all files to include the current year (apple#1024)
## Motivation and Context
Now that we're in 2026, we need to update the license headers on all the
files. Unfortunately, Hawkeye doesn't have an attribute for the current
year to help us avoid this in the future. Instead, I had to work around
this by doing the following:
1. Update licenserc.toml with:
```
[properties]
... (other properties)
currentYear = "2026"
```
2. Update scripts/license-header.txt with
```
Copyright ©{{ " " }}{%- set created = attrs.git_file_created_year or
attrs.disk_file_created_year -%}{%- set modified = props["currentYear"]
-%}{%- if created != modified -%} {{created}}-{{modified}}{%- else
-%}{{created}}{%- endif -%}{{ " " }}{{ props["copyrightOwner"] }}.
```
Then I removed these two changes before committing. After this PR is
merged, all files will have recently had git updates, so the existing
code for setting the modified year should work as intended.
Signed-off-by: Kathryn Baldauf <k_baldauf@apple.com>
commit 20dc0bc
Author: Danny Canter <danny_canter@apple.com>
Date: Sun Jan 4 11:11:09 2026 -0800
Parser: Support relative paths for --volume (apple#1013)
commit 028e7e1
Author: Danny Canter <danny_canter@apple.com>
Date: Sun Jan 4 10:52:46 2026 -0800
Deps: Bump Containerization to 0.19.0 (apple#1015)
Has read-only rootfs support.
commit 020949e
Author: Danny Canter <danny_canter@apple.com>
Date: Sun Jan 4 10:51:20 2026 -0800
CLI: Small fixups for implicit envvars (apple#1014)
We should only inherit from the host if there's no =. Additionally
document the flag a little more to show that we can inherit from the
host.
commit df368b7
Author: Amir Alperin <alperin.amir@gmail.com>
Date: Sun Jan 4 20:49:22 2026 +0200
Fix port validation to allow same port for different protocols (apple#992) (apple#1000)
- Fixes: apple#992
- Port validation previously rejected valid configurations
when the same port number was used for different
protocols (TCP and UDP). For example:
`-p 1024:1024/udp -p 1024:1024/tcp`
Although this is a valid and common use case, the
validation logic treated it as a conflict.
To fix this, I updated the validation key to include the protocol name.
The validation now checks for overlapping port numbers only within the
same protocol, rather than across all protocols.
This change enables binding the same port number for both TCP and UDP,
aligning the validation behavior with real-world networking
requirements.
## Testing
- [x] Tested locally
- [x] Added/updated tests
- [ ] Added/updated docs
commit cf64614
Author: J Logan <john_logan@apple.com>
Date: Fri Jan 2 14:10:48 2026 -0800
Update OSS header in Package.swift. (apple#1010)
commit 375ce16
Author: J Logan <john_logan@apple.com>
Date: Fri Jan 2 12:09:12 2026 -0800
Fix OSS header dates that break CI checks. (apple#1009)
commit 580d853
Author: c <claudeaceae@icloud.com>
Date: Fri Jan 2 00:19:57 2026 -0500
Use full path for uninstall script in upgrade instructions (apple#983)
- Makes the upgrade section consistent with the
uninstall section by using the full path to the
uninstall script.
commit 4cadc40
Author: c <claudeaceae@icloud.com>
Date: Thu Jan 1 22:53:56 2026 -0500
Clarify uninstall script location in README (apple#982)
- Clarifies where the `uninstall-container.sh` script is located after
installation
- Updates example commands to use the full path
commit 4e78e30
Author: c <claudeaceae@icloud.com>
Date: Thu Jan 1 20:57:47 2026 -0500
Fix grammar in tutorial.md (apple#985)
## Summary
- Fixes a grammar error in the tutorial's publish section
## Details
Line 287 of `docs/tutorial.md` had "you need push images" which should
be "you need to push images".
This is a simple grammar fix to improve readability.
## Test plan
- [x] Verified the sentence now reads correctly
commit 22dfd6e
Author: Danny Canter <danny_canter@apple.com>
Date: Thu Jan 1 17:57:00 2026 -0800
CLI: Fix stop not signalling waiters (apple#972)
commit 4958cf2
Author: c <claudeaceae@icloud.com>
Date: Thu Jan 1 20:51:10 2026 -0500
Fix bash completion source path in documentation (apple#981)
- Corrects the source path for bash completion script
when not using bash-completion package.
commit 25ac79a
Author: c <claudeaceae@icloud.com>
Date: Thu Jan 1 20:50:19 2026 -0500
Fix MAC address option typo in how-to documentation (apple#980)
- Corrects the MAC address example command in the
how-to guide to use the correct `--network` flag syntax
instead of the incorrect `--mac-address` flag.
commit edadf15
Author: Raj <realrajaryan@gmail.com>
Date: Thu Jan 1 15:10:39 2026 +0530
Fix container auto-delete on rapid stop/start (apple#841)
Fixesapple#833.
Currently, when stopping and immediately restarting a container, it would fail with the error:
`“container expected to be in created state, got: shuttingDown”` and then be automatically deleted.
The `SandboxService` process waits five seconds before exiting after shutdown. During this interval, a rapid restart could reconnect to the still-terminating process in the `shuttingDown` state, triggering a state validation error.
This fix forcefully terminates the `SandboxService` process with `SIGKILL` upon container exit, instead of waiting five seconds. The bootstrap now defensively checks for and cleans up any stale services before registering new ones, preventing reconnections to processes in the `shuttingDown` state.
commit 5064b0f
Author: J Logan <john_logan@apple.com>
Date: Mon Dec 22 10:16:14 2025 -0800
Adds network IPv6 configuration. (apple#975)
- Part of work for apple#460.
- Enable set/get of IPv6 network prefix in ReservedVmnetNetwork.
- Show IPv6 prefix in `network list` full output.
- Option for setting IPv6 prefix when creating a network.
- System property for default IPv6 prefix.
## Type of Change
- [ ] Bug fix
- [x] New feature
- [ ] Breaking change
- [x] Documentation update
## Motivation and Context
See apple#460.
## Testing
- [x] Tested locally
- [ ] Added/updated tests
- [x] Added/updated docs
commit 9c239aa
Author: Volodymyr Bortniak <25820601+Bortnyak@users.noreply.github.com>
Date: Sat Dec 20 00:36:02 2025 +0100
Add support for reading env from named pipes (apple#974)
This is a fix for
[issue#956](apple#956)
`FileManager.default.contents(atPath:)` returns `nil` for named pipes
(FIFOs)
and process substitutions like `/dev/fd/XX` because:
1. It expects regular files with a known size
2. Named pipes are stream-based and block until data arrives
## Solution
Use `FileHandle(forReadingFrom:)` instead, which:
- Properly handles blocking I/O
- Works with named pipes, process substitutions, and regular files
(mentioned in the
[doc](https://developer.apple.com/documentation/foundation/filehandle))
Co-authored-by: Bortniak Volodymyr <Bortnyak@users.noreply.github.com>
commit 3c3a83c
Author: Danny Canter <danny_canter@apple.com>
Date: Thu Dec 18 16:28:44 2025 -0800
Turn on oops=panic kernel cmdline (apple#971)
commit b1b9980
Author: Michael Gathara <mikegtrm@gmail.com>
Date: Wed Dec 17 20:58:50 2025 -0600
Fix: Kubes Cluster in Container Crashing Container (IS#923) (apple#930)
- Fixes issue apple#923
- I fixed a race condition in `ConnectHandler.swift` where
an asynchronous network connection could complete
after the handler had already been removed from the
pipeline.
- This prevents the EXC_BREAKPOINT crash in
container-runtime-linux that occurred when kinc
(Kubernetes in Container) created rapid connections.
- The actual fix was inadvertently applied in apple#957, so this
PR contains only the test code.
commit 9f4efe0
Author: Saehej Kang <saehej.kang@gmail.com>
Date: Wed Dec 17 00:30:33 2025 -0800
[networks]: add prune command (apple#914)
- Closesapple#893
commit 4f88725
Author: J Logan <john_logan@apple.com>
Date: Tue Dec 16 16:34:13 2025 -0800
Use new IP/CIDR types from Containerization. (apple#957)
- Part of work for apple#460.
- With CZ release 0.17.0, the IP and CIDR address
types changed from String to IPv4Address and
CIDRv4, respectively. This PR applies the corresponding
adaptations to container.
commit 8e16bb2
Author: Salman Chishti <salmanmkc@GitHub.com>
Date: Tue Dec 16 20:14:45 2025 +0000
Upgrade GitHub Actions to latest versions (apple#959)
- Upgrade GitHub Actions to their latest versions for
improved features, bug fixes, and security updates.
Signed-off-by: Salman Muin Kayser Chishti <13schishti@gmail.com>
commit 0c7dca4
Author: Salman Chishti <salmanmkc@GitHub.com>
Date: Tue Dec 16 19:23:31 2025 +0000
Add Dependabot for GitHub Actions updates (apple#960)
## Summary
Add Dependabot configuration to automatically keep GitHub Actions up to
date.
## Changes
Adds `.github/dependabot.yml` configured to:
- Check for GitHub Actions updates weekly
- Group all action updates together for easier review
- Use `ci` prefix for commit messages
## Why
As discussed in apple#958, this helps:
- Keep actions up to date with security patches automatically
- Handle Node runtime deprecations proactively (e.g., Node 20 → Node 24)
- Reduce manual maintenance burden
## Reference
Based on the pattern used in
[swift-nio](https://github.com/apple/swift-nio/blob/main/.github/dependabot.yml).
commit 637c8f1
Author: Salman Chishti <salmanmkc@GitHub.com>
Date: Tue Dec 16 18:15:42 2025 +0000
Upgrade GitHub Actions for Node 24 compatibility (apple#958)
## Summary
Upgrade GitHub Actions to their latest versions to ensure compatibility
with Node 24, as Node 20 will reach end-of-life in April 2026.
## Changes
| Action | Old Version(s) | New Version | SHA |
|--------|---------------|-------------|-----|
| `actions/checkout` | v4 | v6 | `8e8c483` |
| `actions/download-artifact` | v4 | v7 | `37930b1` |
| `actions/upload-artifact` | v4 | v6 | `b7c566a` |
| `actions/labeler` | v5 | v6 | `634933e` |
| `actions/configure-pages` | v5 | v5 | `983d773` |
| `actions/upload-pages-artifact` | v3 | v3 | `56afc60` |
| `softprops/action-gh-release` | v2 | v2 | `a06a81a` |
## Context
Per [GitHub's
announcement](https://github.blog/changelog/2025-09-19-deprecation-of-node-20-on-github-actions-runners/),
Node 20 is being deprecated and runners will begin using Node 24 by
default starting March 4th, 2026.
### Why this matters
- **Node 20 EOL**: April 2026
- **Node 24 default**: March 4th, 2026
- **Action**: Update to latest action versions that support Node 24
### Security
All actions are now **pinned to commit SHAs** instead of mutable version
tags. This provides:
- Protection against tag hijacking attacks
- Immutable, reproducible builds
- Version comments for readability
### Automated Updates
A follow-up PR (apple#960) adds Dependabot configuration to automatically
keep these actions updated with new SHA-pinned versions.
### Testing
These changes only affect CI/CD workflow configurations and should not
impact application functionality. The workflows should be tested by
running them on a branch before merging.
Signed-off-by: Salman Muin Kayser Chishti <13schishti@gmail.com>
commit c22f128
Author: karen heckel <karen.heckel@utexas.edu>
Date: Mon Dec 15 21:16:55 2025 -0800
Feat: customize console output with env variable (apple#952)
Fixesapple#915
Added a new feature to support the passing of buildkit colors for
customizing console output.
commit 9b7cfd8
Author: Saehej Kang <saehej.kang@gmail.com>
Date: Mon Dec 15 17:52:00 2025 -0800
[images]: refactor prune command (apple#941)
- Updates to `image prune` for consistency with how
other `prune` commands are done. Added missing
test cases as well for the command
- Relates to the discussion from apple#914
commit 7d30720
Author: Danny Canter <danny_canter@apple.com>
Date: Thu Dec 11 05:36:15 2025 -0800
CLI: Fix -it not being able to pipe stdout (apple#951)
Fixesapple#949
Typically if one fd is a tty, it's common for all 3 of stdio to be the
same, but that is not always the case. In our case we were using our
Terminal type from Containerization to comb through err/out/in and give
us a type backed by one of the 3 if -t was supplied. It happens that
stderr is the first we check, so our Terminal() is backed by fd 2. This
change modifies things so that we always initialize our Terminal if
asked for with fd 0, and out/err are backed by their corresponding
correct fd number.
## Type of Change
- [x] Bug fix
- [ ] New feature
- [ ] Breaking change
- [ ] Documentation update
## Testing
- [x] Tested locally
- [ ] Added/updated tests
- [ ] Added/updated docs
commit a2901e0
Author: wangxiaolei <fatelei@gmail.com>
Date: Wed Dec 10 10:04:40 2025 +0800
feat: implement version sub command (apple#911)
- closesapple#383
- implement version sub command, give more info
---------
Co-authored-by: fatelei <fatelei@fateleis-MacBook-Pro.local>
commit 0cde1ef
Author: Danny Canter <danny_canter@apple.com>
Date: Tue Dec 9 13:24:45 2025 -0800
Deps: Bump Containerization to 0.16.2 (apple#947)
Closesapple#928
Has a cgroup fix when stopping certain containers
commit 3896055
Author: Dmitry Kovba <dkovba@apple.com>
Date: Tue Dec 9 12:32:28 2025 -0800
Lowercase error messages (apple#945)
## Type of Change
- [x] Bug fix
- [ ] New feature
- [ ] Breaking change
- [ ] Documentation update
## Motivation and Context
For consistency, all error messages are lowercased.
## Testing
- [ ] Tested locally
- [ ] Added/updated tests
- [ ] Added/updated docs
---------
Co-authored-by: J Logan <sgtbakerrahulnet@yahoo.com>
commit 0733a81
Author: Saehej Kang <saehej.kang@gmail.com>
Date: Tue Dec 9 10:54:37 2025 -0800
[volumes]: refactor prune command (apple#940)
- Refactor the `volume prune` command to follow a client-side approach.
The `volumeDiskUsage` is calculated in the service file, so it made
sense to leave that there.
- Relates to the discussion from apple#914
commit 42528e6
Author: Kathryn Baldauf <k_baldauf@apple.com>
Date: Tue Dec 9 10:42:27 2025 -0800
Update CONTRIBUTORS to MAINTAINERS and point at containerization (apple#942)
## Type of Change
- [x] Documentation update
## Motivation and Context
See apple/containerization#435 for more
information on this change.
commit a64bd77
Author: J Logan <john_logan@apple.com>
Date: Tue Dec 9 14:35:34 2025 -0300
Fix broken image integration tests. (apple#944)
- Fixesapple#943.
- Use images other than alpine:3.20 for image concurrency test so as not
to interfere with tests using that image.
- Rename test files to match suite names.
commit ab92f39
Author: TTtie <me@tttie.cz>
Date: Mon Dec 8 18:17:10 2025 +0100
fix(TerminalProgress): make the progress bar respect locale-specific decimal separator (apple#936)
- The `ProgressBar#adjustFormattedSize` function currently expects a
decimal dot when adding the additional ".0" to the size. This, however,
breaks when a region with a non-dot decimal separator is used.
commit 420be74
Author: J Logan <john_logan@apple.com>
Date: Mon Dec 8 03:00:02 2025 -0300
Data integrity: bump to cz 0.16.1, adjust sync mode. (apple#939)
- 0.16.1 changes an ext4 superblock setting that might have been causing
problems.
- apple#877 fixed an issue where the cache and sync settings for block
filesystems weren't being passed down to the VZ virtual machine
configuration. The default sync value getting passed down is `full`,
which reduces I/O performance. Relax this to use `fsync` for now.
## Type of Change
- [*] Bug fix
- [ ] New feature
- [ ] Breaking change
- [ ] Documentation update
## Motivation and Context
May address problems reported in apple#877.
## Testing
- [x] Tested locally
- [ ] Added/updated tests
- [ ] Added/updated docs
commit f7bcb68
Author: Santosh Bhavani <santosh.bhavani@live.com>
Date: Sun Dec 7 10:56:50 2025 -0800
Add --max-concurrent-downloads flag for parallel layer downloads (apple#716)
Adds `--max-concurrent-downloads` flag to `container image pull` for
configurable concurrent layer downloads.
Fixesapple#715
Depends on apple/containerization#311
**Usage**:
```bash
container image pull nginx:latest --max-concurrent-downloads 6
```
**Changes**:
- Add CLI flag (default: 3)
- Thread parameter through XPC stack
- Update to use forked containerization with configurable concurrency
**Performance**: ~1.2-1.3x faster pulls for multi-layer images with
higher concurrency
**Tests**: Included standalone tests verify concurrency behavior and
parameter flow
---------
Co-authored-by: Claude <noreply@anthropic.com>
saehejkang pushed a commit to saehejkang/container that referenced this pull request Jan 23, 2026
…pple#1051)
Run = Create + Start
1) Mount source points to a valid directory
- Run and Create + Start both correctly create the container with mount.
2) Mount source points to a file
- Run fails bootstrapping the container, thus container not created.
- Create creates the container, but Start fails bootstrapping, removing
the container. (Thus, both are the same.)
3) Mount source deleted or replaced to file after container created
- Start throw errors but do not delete the container.
saehejkang pushed a commit to saehejkang/container that referenced this pull request Jan 27, 2026
…pple#1051)
Run = Create + Start
1) Mount source points to a valid directory
- Run and Create + Start both correctly create the container with mount.
2) Mount source points to a file
- Run fails bootstrapping the container, thus container not created.
- Create creates the container, but Start fails bootstrapping, removing
the container. (Thus, both are the same.)
3) Mount source deleted or replaced to file after container created
- Start throw errors but do not delete the container.
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants

@JaewonHur@jglogan@dcantah