container-fleet
Emit one Containerfile per workload for many hosts from a single manifest. The batch form of migrate --format container: each host is read and planned once, and every workload the manifest names on it is rendered with its own entrypoint.
vrtmv container-fleet --manifest fleet.txt --target rocky9 -o out/
vrtmv container-fleet --manifest fleet.txt --json
| Flag | Purpose |
|---|---|
--manifest <file> | Hosts and their workloads, one workload per line. |
--target <spec> | Default target for a host line that names none (default rocky9). |
-o, --out <dir> | Root output directory (default vrtmv-container-fleet). Each workload writes <out>/<host>/<workload>/Containerfile and, when the host carries config, stage-carried.sh beside it. Run that script against the host's source root before building (Staging the carried config). |
--json | Print the per-workload result list as JSON instead of the text summary. |
The manifest
The host columns are the ones readiness and cve-scan-fleet read, [name] kind locator [target], followed by per-workload fields:
web01 image /vmfs/web01.vmdk rocky9 entrypoint=/usr/sbin/httpd -DFOREGROUND
app01 image /vmfs/app01.vmdk rocky9 workload=api entrypoint=/usr/bin/apid --port 8080
app01 image /vmfs/app01.vmdk rocky9 workload=worker entrypoint=/usr/bin/workerd
entrypoint= is the operator's assertion and must be last on the line. workload= names the workload within the host and defaults to the host name. preserve=<path> is repeatable. data=<path>=<class> is repeatable and declares where a data directory goes, as migrate --data does; a host with a data directory left undeclared is refused by name. assume-undetermined=<check> is repeatable and proceeds without a feasibility check that could not be determined, as migrate --assume-undetermined does, for the workload on that line. The host name and the workload id are directory names under --out, so each must be a single plain name. A fleet of hosts has the full rules, including what is refused.
A host read over SSH
An SSH collection reads /etc, the package database, the crontabs and a listing of /opt, /usr/local and /srv. It does not read /var, /home or /root, so whether those hold data is not determined, and a workload on such a host is refused until its line says assume-undetermined=local-state:
web01 ssh web01 rocky9 data=/srv/site=volume assume-undetermined=local-state entrypoint=/usr/sbin/httpd -DFOREGROUND
Declare the data directories you know with data=; the token covers what was not read, on your word. It does not cover a data directory the collection did find, such as files in /root: that one is refused by name until its own data= is on the line. The Containerfile says the check was assumed, gives the reason it could not answer, and lists what was not read; stderr gives the same reason. A data=<path>=image is still refused on an SSH host: the files of a data directory are not fetched, so there is nothing to stage. In 2.3.0 the token was not taken and every host read over SSH was refused.
Result and exit status
Every workload the manifest names ends in one of three states, and the summary names each one by host and workload: emitted, refused with the reason, or not collected when the host could not be read. One host's refusal does not stop the rest. The exit status is zero only when every named workload emitted.
Billing follows migrate: each host that is read, planned and authorized records one depersonalized migration usage event, billable per your plan and target (see Accounts, quota & billing). That is one event per host, as a single migrate --format container of that host records, however many workloads the host produces. A host that could not be read records no usage.
Hosts that report one identity
Every host's identity (see identity) is read before any host is planned. Hosts that report one identity are clones of one image, or one host listed under several names. Each of their workloads is refused before anything is emitted or billed for the host, with a reason that names the hosts and the file the identity came from. The other hosts go on, and the exit status is non-zero. Run vrtmv identity on each clone, or remove the second name from the manifest. A host read over SSH is collected once and its collection is kept on disk until its turn, so a large SSH fleet holds every host's collection at once; a disk image is mounted once to read its identity and again to emit.