How to Configure Container Machine Settings in Apple Container
Use the container machine set command to adjust CPU, memory, and virtualization parameters, then restart the machine for changes to take effect.
The Apple Container project provides a lightweight Linux environment that runs on macOS using OCI images with persistent storage. When you need to configure container machine settings, you modify key-value pairs that the ServiceManager component reads from a JSON file during machine initialization. These settings persist in ~/.container/machines/<name>/config.json and control resource allocation, storage mounting, and virtualization capabilities.
Available Configuration Options
The container machine set command writes settings to disk immediately, but the ServiceManager component in Sources/ContainerPlugin/ServiceManager.swift only reads them during the next startup cycle. The following parameters are defined in docs/container-machine.md and modeled in Sources/ContainerPlugin/PluginConfig.swift.
CPU and Memory Allocation
Control compute resources with the cpus and memory parameters.
- CPU count (
cpus): Sets the number of virtual CPUs allocated to the machine. - Memory size (
memory): Specifies RAM allocation using standard size suffixes likeGfor gigabytes.
container machine set -n dev cpus=4 memory=8G
Home Directory Mount Mode
The home-mount mode (homeMount) determines how macOS shares your home directory with the container. By default, the machine maps $HOME on macOS to /Users/<username> inside the container for seamless file sharing.
Available modes include:
rw: Read-write access (default)ro: Read-only accessnone: Disables the mount entirely
container machine set -n dev homeMount=ro
Nested Virtualization and Custom Kernels
Enable advanced virtualization features using the virtualization and kernel settings.
Nested virtualization (virtualization) exposes /dev/kvm to the container, allowing you to run KVM guests inside the machine. This requires Apple Silicon M3+ on macOS 15+ and a Linux kernel compiled with CONFIG_KVM=y. The default kernel shipped with Apple Container does not include KVM support, so you must provide a custom binary.
Custom kernel (kernel) specifies an absolute path to a replacement kernel binary. An empty value resets to the bundled kernel.
container machine set -n dev virtualization=true kernel=/opt/kernels/vmlinux-kvm
Applying Configuration Changes
Configuration changes do not take effect on running machines. According to the implementation in Sources/ContainerPlugin/ServiceManager.swift, the system reads the configuration file only during the machine initialization sequence.
To apply new settings:
- Stop the running machine.
- Start the machine again to trigger the ServiceManager to allocate resources and recreate bind mounts.
# Stop the machine
container machine stop dev
# Start and verify the new configuration
container machine run -n dev uname -a
Configuration File Internals
When you run container machine set, the command writes to ~/.container/machines/<name>/config.json. The PluginConfig data model in Sources/ContainerPlugin/PluginConfig.swift defines the JSON schema that stores these values.
Internally, Swift code accesses this configuration programmatically:
import ContainerPlugin
let config = try PluginConfig.load(for: "dev")
print("CPUs:", config.cpus ?? "default")
print("Memory:", config.memory ?? "default")
print("KVM enabled:", config.virtualization ?? false)
This structure ensures that both the CLI and internal components use the same persistence layer for machine settings.
Summary
- Use
container machine setwith key-value syntax to configure container machine settings including CPU count, memory size, home-mount mode, and virtualization. - Persist changes in
~/.container/machines/<name>/config.jsonas defined by the PluginConfig model. - Restart required — the ServiceManager reads configuration only during machine startup, so you must stop and start the machine to apply changes.
- Nested virtualization requires a custom KVM-enabled kernel and modern Apple Silicon hardware.
Frequently Asked Questions
How do I check the current configuration of a container machine?
The configuration is stored as JSON in ~/.container/machines/<name>/config.json. You can view this file directly to see current CPU, memory, and mount settings. Alternatively, use the Swift PluginConfig API to load and inspect the configuration programmatically as implemented in Sources/ContainerPlugin/PluginConfig.swift.
Can I change container machine settings while the machine is running?
No. According to docs/container-machine.md, settings are written to disk immediately when you run container machine set, but they only take effect after you stop and restart the machine. The ServiceManager component reads the configuration file during the initialization phase, not during runtime.
What kernel do I need for nested virtualization?
You must provide a custom Linux kernel compiled with CONFIG_KVM=y using the kernel setting. The default kernel bundled with Apple Container does not include KVM support. Additionally, nested virtualization requires Apple Silicon M3+ and macOS 15 or later to function properly.
How do I disable the home directory mount completely?
Set homeMount=none using the configuration command. This prevents the automatic mapping between your macOS home directory and the container's /Users/<username> path, isolating the container filesystem from your host home directory.
Have a question about this repo?
These articles cover the highlights, but your codebase questions are specific. Give your agent direct access to the source. Share this with your agent to get started:
curl -s "https://instagit.com/install.md" Maintain an open-source project? Get it listed too →