Scale up as you grow — whether you're running one virtual machine or ten thousand.

From GPU-powered inference and Kubernetes to managed databases and storage, get everything you need to build, scale, and deploy intelligent applications.

This textbox defaults to using Markdown to format your answer.
You can type !ref in this text area to quickly search our full set of tutorials, documentation & marketplace offerings and insert the link!
These answers are provided by our Community. If you find them useful, show some love by clicking the heart. If you run into issues leave a comment, or add your own answer to help others.
Accepted Answer
Heya,
For any droplet you create going forward, since you’re rebuilding onto bootc anyway, setting both to false at creation avoids this entirely rather than fighting cloud-init after the fact:
doctl compute droplet create my-bootc-droplet \
--image my-bootc-image \
--size s-1vcpu-1gb \
--region nyc1 \
--droplet-agent=false \
--no-monitoring
Or via the API directly with “monitoring”: false and “with_droplet_agent”: false in the create request.
For the droplet you’re already stuck with, the flag is baked into that instance’s metadata and there’s no way to flip it after creation, but the install script is very likely delivered through cloud-init’s vendor-data channel specifically, DigitalOcean’s metadata service exposes vendor-data as a distinct endpoint alongside user-data, and cloud-init has a built-in, official way to opt out of vendor-data entirely while keeping user-data active:
#cloud-config
vendor_data:
enabled: false
That should stop whatever DigitalOcean pushes through vendor-data, likely including the agent install script, without touching cloud-init’s own handling of your user-data. One caveat worth knowing before you rely on it: cloud-init only reads user-data on first boot by default, so this needs to go in at rebuild time (DigitalOcean’s Droplet rebuild feature lets you resupply user-data) rather than injected into the already-running, already-failing instance. I haven’t been able to confirm the do-agent script specifically travels through vendor-data rather than some other DigitalOcean-side mechanism, so worth testing on one droplet before rolling it out everywhere, but it’s the most direct, cloud-init-native lever available for exactly this situation.
Regards
Heya,
You’ve diagnosed it correctly — DigitalOcean delivers the do-agent/droplet-agent install as cloud-init vendor-data (served from the metadata service at boot), not as part of your image. That’s exactly why bootc’s read-only /usr fights it: the vendor-data scripts fire on every boot and get denied.
A couple of things up front:
"with_droplet_agent": false. Panel-created Droplets can’t opt out that way, and you can’t flip it after the fact.Drop a config file in /etc/cloud/cloud.cfg.d/ (that dir is on writable /etc, so bootc is fine with it):
# /etc/cloud/cloud.cfg.d/99-disable-vendor-data.cfg
vendor_data:
enabled: false
vendor_data2:
enabled: false
That stops cloud-init from processing DO’s agent scripts entirely, but leaves the rest of cloud-init (your user-data, network config, SSH keys) intact. No need to disable cloud-init wholesale.
Since the vendor-data runs at first boot, you want this config present before that happens. Add it during your image build so it ships baked in, e.g. in your Containerfile:
RUN printf 'vendor_data:\n enabled: false\nvendor_data2:\n enabled: false\n' \
> /etc/cloud/cloud.cfg.d/99-disable-vendor-data.cfg
Now every VM built from that image comes up with vendor-data already disabled, so the agent scripts never get a chance to spam the console.
To see exactly what DO is sending before you disable it:
cloud-init query vendordata cat /var/lib/cloud/instance/vendor-data.txt
And if you ever do want the agent on a normal (non-bootc) box later, it’s just the droplet-agent package via your package manager — nothing lost by disabling the auto-install here.
If you’re spinning these up programmatically, add "with_droplet_agent": false to your API create call and DO won’t inject the vendor-data agent bits in the first place — belt and suspenders alongside the image-baked config.
Hope that gets your boot console quiet again.