[haos-one] Run Home Assistant OS in Docker Container (for those migrating from depricated Supervised)

The updates are performe container-way: through the image version updates.

So, you have to specify qweritos/haos-one:latest and run docker pull qweritos/haos-one:latest (then re-create container) or specify image qweritos/haos-one:18.2 explicitly.

I thinking on how to add support for auto-updates, but it either require introducing another level of docker supervision (like watchtower/WUD does) OR to completely change the runtime preparation approach (and I don’t like this idea, because it introduces more resources overhead and complexity).

Probably, to those wanting to keep HAOS OS image up-to-date to use Watchtower/WUD/??? to update the container image automatically.

Just as a guy running ha in docker i just want to point out one thing.
There is no reason to run haos in docker. You can run just ha in its own docker container and add everyting else as you please.
Why? Well because you can avoid all haos problems like frigate killing your system due high cpu usage.
Downside is that you will have to put some effort in it, but it is doable.
And everything like auto upgrades and backups of all containers can be set up.
And there is a lot of info out there on how to do it.

It’s a good point, actually. Initially, I made this project long ago to run HAOS in my home k8s cluster. And after Supervised installation method became deprecated, I decided to share the project with a public.

It is primarily intended for those who explicitly want the OS experience, including the Addon Store (Apps) or to migrate existing Supervised installation.

Why? It’s just because I got used to work with some apps right from the HASS :melting_face:

I know that you put your time and effort in doing this. And it is obvoius.
But basically when you run haos in docker container you are running docker containers inside docker container.
And there is no need to do so.
Haos is made for people runing windows to get started with linux aka haos.
But if you are alredy using linux then obvoius migration will be to docker and do it yourself.
That is what i just want to point out.

@ddaniel, you said:

But basically when you run haos in docker container you are running docker containers inside docker container.

Correct, and the only alternative - to run HAOS in VM, which obviously comes with relatively significant resource overhead. And this project is made to eliminate this drawback while keeping the original “Operating System” flavour.

@famewolf , I added some fixes (fake udev interceptor) that makes it work on LXC (running unpriviliged in proxmox). For both rootfull and rootles.
Verified on:

Proxmox VE 9.2.2 x86_64
Unprivileged LXC running nested Docker Engine 26.1.5+dfsg1 (client/server)
(rootless & rootfull)

It is perfectly fine by me if you want to put your time and effort in this type of instalation.

I just wanted to say that anyone can use ha container installation and have all the things haos have without haos drawbacks.

hello,
I was running haos on an old pc just dedicated to that because on my ugreen dh4300 nas there is no VM to be able to install it and via docker it wasn’t great. so I tried installing haos-one on my nas like this “docker run --name haos -ti --privileged --network host -v./data:/mnt/data qweritos/haos-one” then integrated the latest haos backup from my old pc and it seems to work. it’s been working pretty well for two days, even my sonof matter key works. bravo and thank you for this version

Thank you! Will try again!

I just spun it up and noticed alot of failed events. I’m not sure if any of these are critical so I’m just posting them here for review.

systemd 256.17 running in system mode (+PAM +AUDIT -SELINUX +APPARMOR -IMA -SMACK +SECCOMP -GCRYPT -GNUTLS +OPENSSL -ACL +BLKID +CURL -ELFUTILS -FIDO2 -IDN2 -IDN +IPTC +KMOD +LIBCRYPTSETUP +LIBCRYPTSETUP_PLUGINS +LIBFDISK +PCRE2 -PWQUALITY -P11KIT -QRENCODE -TPM2 -BZIP2 -LZ4 -XZ +ZLIB -ZSTD -BPF_FRAMEWORK -XKBCOMMON -UTMP -SYSVINIT -LIBARCHIVE)
Detected virtualization docker.
Detected architecture x86-64.

Welcome to Home Assistant OS 18.2!

Initializing machine ID from random generator.
Failed to create timezone change event source: No such file or directory
Queued start job for default target Multi-User System.
Unnecessary job was removed for /dev/sda.
Unnecessary job was removed for /dev/zram2.
[  OK  ] Created slice Slice /system/modprobe.
[  OK  ] Created slice User and Session Slice.
[  OK  ] Started Dispatch Password Requests to Console Directory Watch.
[  OK  ] Started Forward Password Requests to Wall Directory Watch.
[  OK  ] Reached target Local Encrypted Volumes.
[  OK  ] Reached target Login Prompts.
[  OK  ] Reached target HAOS hardware targets.
[  OK  ] Reached target HAOS zram targets.
[  OK  ] Reached target Local Integrity Protected Volumes.
[  OK  ] Reached target NFS client services.
[  OK  ] Reached target Path Units.
[  OK  ] Reached target Preparation for Remote File Systems.
[  OK  ] Reached target Remote Encrypted Volumes.
[  OK  ] Reached target Remote File Systems.
[  OK  ] Reached target Remote Verity Protected Volumes.
[  OK  ] Reached target Slice Units.
[  OK  ] Reached target System Time Set.
[  OK  ] Reached target Local Verity Protected Volumes.
[  OK  ] Listening on D-Bus System Message Bus Socket.
[  OK  ] Listening on RPCbind Server Activation Socket.
[  OK  ] Reached target RPC Port Mapper.
[  OK  ] Listening on Process Core Dump Socket.
[  OK  ] Listening on Credential Encryption/Decryption.
[  OK  ] Listening on Journal Audit Socket.
[  OK  ] Listening on Journal Socket (/dev/log).
[  OK  ] Listening on Journal Sockets.
Mounting Huge Pages File System...
sys-kernel-debug.mount: Failed to check directory /sys/kernel/debug: Permission denied
Mounting Kernel Debug File System...
Mounting Kernel Trace File System...
Starting HAOS overlay setup...
Starting Retrigger udev rules after user rules mounted...
Starting Load Kernel Module configfs...
Starting Load Kernel Module drm...
Starting Load Kernel Module fuse...
Starting Journal Service...
Starting Generate network units from Kernel command line...
Starting Remount Root and Kernel File Systems...
Starting Apply Kernel Variables...
Starting Create Static Device Nodes in /dev gracefully...
Starting Load udev Rules from Credentials...
Starting Disk Manager...
[  OK  ] Mounted Huge Pages File System.
[  OK  ] Mounted Kernel Debug File System.
[  OK  ] Mounted Kernel Trace File System.
haos-user-rules-udev-trigger.service: Main process exited, code=exited, status=1/FAILURE
haos-user-rules-udev-trigger.service: Failed with result 'exit-code'.
[FAILED] Failed to start Retrigger udev rules after user rules mounted.
See 'systemctl status haos-user-rules-udev-trigger.service' for details.
[email protected]: Deactivated successfully.
[  OK  ] Finished Load Kernel Module configfs.
[email protected]: Deactivated successfully.
[  OK  ] Finished Load Kernel Module drm.
[  OK  ] Finished HAOS overlay setup.
[email protected]: Deactivated successfully.
[  OK  ] Finished Load Kernel Module fuse.
[  OK  ] Finished Generate network units from Kernel command line.
[  OK  ] Finished Remount Root and Kernel File Systems.
[  OK  ] Reached target Preparation for Network.
[  OK  ] Reached target Swaps.
Mounting FUSE Control File System...
Mounting Kernel Configuration File System...
[  OK  ] Finished Apply Kernel Variables.
[  OK  ] Finished Load udev Rules from Credentials.
Starting D-Bus System Message Bus...
[  OK  ] Mounted FUSE Control File System.
[  OK  ] Started Journal Service.
[  OK  ] Mounted Kernel Configuration File System.
[  OK  ] Started D-Bus System Message Bus.
[  OK  ] Finished Create Static Device Nodes in /dev gracefully.
Starting Create Static Device Nodes in /dev...
[  OK  ] Started Disk Manager.
[  OK  ] Finished Create Static Device Nodes in /dev.
[  OK  ] Reached target Preparation for Local File Systems.
Mounting Docker persistent data...
Mounting Systemd persistent logging...
[  OK  ] Mounted Docker persistent data.
[  OK  ] Mounted Systemd persistent logging.
[  OK  ] Reached target HAOS overlay targets.
[  OK  ] Reached target Local File Systems.
Starting Flush Journal to Persistent Storage...
[  OK  ] Finished Flush Journal to Persistent Storage.
Starting Create System Files and Directories...
[  OK  ] Finished Create System Files and Directories.
Starting Security Auditing Service...
Starting Network Name Resolution...
[FAILED] Failed to start Security Auditing Service.
See 'systemctl status auditd.service' for details.
[  OK  ] Started Network Name Resolution.
[  OK  ] Reached target Host and Network Name Lookups.
[  OK  ] Reached target System Initialization.
[  OK  ] Started Daily Cleanup of Temporary Directories.
[  OK  ] Reached target Timer Units.
Starting Docker Socket for the API...
[  OK  ] Listening on Hostname Service Socket.
[  OK  ] Listening on Journal Gateway Service Socket.
Starting Home Assistant OS Agent...
[  OK  ] Listening on Docker Socket for the API.
[  OK  ] Reached target Socket Units.
[  OK  ] Reached target Basic System.
Starting Docker environment and config initialization...
Starting Configure multigenerational LRU...
Starting HAOS persists data on bootstate...
Starting RAUC Update Service...
Starting RPC Bind...
Starting User Login Management...
Starting Bind-mount /mnt/data/bluetooth to /var/lib/bluetooth...
Starting WPA supplicant...
[  OK  ] Started Home Assistant OS Agent.
[  OK  ] Started RPC Bind.
[  OK  ] Finished Docker environment and config initialization.
[  OK  ] Finished Configure multigenerational LRU.
[  OK  ] Finished HAOS persists data on bootstate.
[  OK  ] Started RAUC Update Service.
[  OK  ] Started WPA supplicant.
[  OK  ] Reached target Network.
[  OK  ] Reached target Network is Online.
Starting containerd container runtime...
Starting HAOS Configuration Manager...
Starting Ensure rauc.db contains version information...
Starting Notify NFS peers of a restart...
[  OK  ] Reached target System Time Synchronized.
Starting HAOS AppArmor...
Starting Permit User Sessions...
[  OK  ] Finished Bind-mount /mnt/data/bluetooth to /var/lib/bluetooth.
[  OK  ] Started Notify NFS peers of a restart.
Starting Security Auditing Service...
[  OK  ] Finished Permit User Sessions.
[  OK  ] Finished HAOS Configuration Manager.
[  OK  ] Started User Login Management.
[FAILED] Failed to start Security Auditing Service.
See 'systemctl status auditd.service' for details.
Stopping RAUC Update Service...
[  OK  ] Stopped RAUC Update Service.
Starting RAUC Update Service...
[  OK  ] Started containerd container runtime.
[  OK  ] Started RAUC Update Service.
[  OK  ] Finished Ensure rauc.db contains version information.
[  OK  ] Finished HAOS AppArmor.
Starting Security Auditing Service...
Starting Docker Application Container Engine...
[FAILED] Failed to start Security Auditing Service.
See 'systemctl status auditd.service' for details.
Starting Security Auditing Service...
[FAILED] Failed to start Security Auditing Service.
See 'systemctl status auditd.service' for details.
Starting Security Auditing Service...
[FAILED] Failed to start Security Auditing Service.
See 'systemctl status auditd.service' for details.
[FAILED] Failed to start Security Auditing Service.
See 'systemctl status auditd.service' for details.
[  OK  ] Started Docker Application Container Engine.
Starting Build and run haos_one_compat container...
[  OK  ] Started libcontainer container 53b…dd3b9e137da2e270ee7c1ec4f2537002e4.
[  OK  ] Started libcontainer container 295…b6bebf8aa4c9b70f95f148b90606b475bb.
[  OK  ] Started Build and run haos_one_compat container.
Starting HAOS supervisor...
[  OK  ] Started HAOS supervisor.
[  OK  ] Reached target Multi-User System.
services: 
haos-one: 
image: qweritos/haos-one 
container_name: haos-one 
privileged: true 
network_mode: host 
stdin_open: true 
tty: true 
environment: 
- USE_DUMMY_NETWORKMANAGER=1 
volumes: 
- /mnt/dockerdata/docker/containers/haos-one:/mnt/data 
restart: unless-stopped

It ran into trouble trying to upload a backup from my proxmox vm haos.

@qweritos Any thoughts on why the restore from backup is failing?

So of course once I actually post a followup question and decide to try things one last time it works fine with a new backup. No idea what the deal was but happy to get farther in trying it out.

When you initially launching the instance and restoring from backup, the whole lot of container images/layers being downloaded one-by-one, so the registry provider may throttle your bandwidth. Consequently, it takes a while to restore all the stuff, especially if you previously has lot of apps(addons) installed.

You can track download progress in journalctl, the supervisor drop some lines when it start and end downloading next image.

So, if there’s a record about begin download and no related trailing line - most likely the downloading is undergoing right now.

You can track image downloading progress by ctr image pull <image:tag>

I’ll try again and just leave it running for a while. I left it for several hours and it was conflicting with my existing vm since they had the same “id” which made me think it was done but no ui was available. Above and beyond that the fact portainer stops working when haos-one is running is my main issue which may involve having to put it in it’s own docker lxc and at that point it’s just as easy to install haos directly to a mini pc I have lying around here.

Thanks, I adjusted the the compose file to latest.
Now it get’s stuck on updating the supervisor:


The screeshot only shows it running for 11 minutes, but also after hours nothing happens. I can’t see anything useful in the logs.

@futurebuddha , Check it with

journalctl -n all -f | grep -E 'Downloading docker image|msg="image pulled"'

if you see the line like

... hassio_supervisor[235]:...  INFO (MainThread) [supervisor.docker.interface] Downloading docker image ghcr.io/esphome/esphome-hassio with tag 2026.8.1.

but no line

... hs2 dockerd[235]: time="..." level=info msg="image pulled" digest="sha256:a2453d8b653258e84f307cff5e767f46249501e38e437e44ec977fd5275314be" remote="ghcr.io/esphome/esphome-hassio:2026.8.1"

then it seems like it being pulled image. To see progress, you can start parallel pull (containerd will handle this - you’ll be attached to existing pull job).

ctr image pull ghcr.io/esphome/esphome-hassio:2026.8.1

and you’ll see the detailed downloading progress.

If it can be solved by removing “network_mode: host”, this most likely related to Mac OS - Network Host · Issue #45 · qweritos/haos-one · GitHub

I working on the stable workaround for this issue.

/ # journalctl -n all -f | grep -E 'Downloading docker image|msg="image pulled"'
^C
/ # ctr image pull ghcr.io/esphome/esphome-hassio:2026.8.0
ghcr.io/esphome/esphome hassio:2026.8.0         saved
└──index (db229dbc6dfb)                         complete        |++++++++++++++++++++++++++++++++++++++|
   ├──manifest (acaa3b60e425)                   complete        |++++++++++++++++++++++++++++++++++++++|
   ├──manifest (cd9ceba4d2a1)                   complete        |++++++++++++++++++++++++++++++++++++++|
   │  ├──config (0d3c1731b19c)                  complete        |++++++++++++++++++++++++++++++++++++++|
   │  ├──layer (c2259a2b6693)                   extracted       |++++++++++++++++++++++++++++++++++++++|
   │  ├──layer (7b0d25945124)                   extracted       |++++++++++++++++++++++++++++++++++++++|
   │  ├──layer (ea5dce075097)                   extracted       |++++++++++++++++++++++++++++++++++++++|
   │  ├──layer (49a3ab6076e1)                   extracted       |++++++++++++++++++++++++++++++++++++++|
   │  ├──layer (4e82f7e1e19e)                   extracted       |++++++++++++++++++++++++++++++++++++++|
   │  ├──layer (fcb70b6ddcec)                   extracted       |++++++++++++++++++++++++++++++++++++++|
   │  ├──layer (10e45fc46cbd)                   extracted       |++++++++++++++++++++++++++++++++++++++|
   │  ├──layer (5f9f24d1ef89)                   extracted       |++++++++++++++++++++++++++++++++++++++|
   │  ├──layer (7fc44a483609)                   extracted       |++++++++++++++++++++++++++++++++++++++|
   │  ├──layer (d635cc9238aa)                   extracted       |++++++++++++++++++++++++++++++++++++++|
   │  └──layer (5260db2a6772)                   extracted       |++++++++++++++++++++++++++++++++++++++|
   ├──manifest (9957f288d8f1)                   complete        |++++++++++++++++++++++++++++++++++++++|
   └──manifest (eaaeadd3bbdc)                   complete        |++++++++++++++++++++++++++++++++++++++|
      └──config (80ee2564c505)                  complete        |++++++++++++++++++++++++++++++++++++++|
application/vnd.oci.image.index.v1+json sha256:db229dbc6dfb53a5adf67f3c642f0df9dcc42ee8a51414f2a3625d820ddb7bb5
Completed pull from OCI Registry (ghcr.io/esphome/esphome-hassio:2026.8.0)      elapsed: 31.6s  total:  175.0   (5.5 MiB/s)

The grep showed nothing. ctr imag pull did download something, but it changed nothing.
Thanks for trying, in the end I made a backup, deleted the data folder so it reinstalled and uploaded the backup.
I’m afraid I didn’t have to time to trying to understand what’s going on.