#vm #cloud #gcp #aws #cli

app ice-tool

CLI for managing cloud VM instances and marketplace offers

5 releases

Uses new Rust 2024

new 0.1.4 Mar 10, 2026
0.1.3 Mar 6, 2026
0.1.2 Mar 4, 2026
0.1.1 Mar 2, 2026
0.1.0 Mar 2, 2026

#244 in Network programming

AGPL-3.0-only

665KB
18K SLoC

ice

Minimal CLI for deploying and managing workloads on vast.ai, gcp, aws, and local.

Install

cargo install ice-tool

Installed command: ice

Quick start

ice login --cloud vast.ai
ice deploy test-crate
ice list --cloud vast.ai
ice logs --cloud vast.ai <instance> --follow
ice delete --cloud vast.ai <instance>

Clouds

Supported cloud identifiers:

  • vast.ai
  • gcp
  • aws
  • local

Commands

  • ice login [--cloud CLOUD] [--force]
  • ice config list
  • ice config get <KEY>
  • ice config set <KEY=VALUE>
  • ice config unset <KEY>
  • ice list [--cloud CLOUD]
  • ice logs [--cloud CLOUD] <INSTANCE> [--tail N] [--follow]
  • ice shell [--cloud CLOUD] <INSTANCE>
  • ice pull [--cloud CLOUD] <INSTANCE> <REMOTE_PATH> [LOCAL_PATH]
  • ice push [--cloud CLOUD] <INSTANCE> <LOCAL_PATH> [REMOTE_PATH]
  • ice stop [--cloud CLOUD] <INSTANCE>
  • ice start [--cloud CLOUD] <INSTANCE>
  • ice delete [--cloud CLOUD] <INSTANCE>
  • ice deploy [--cloud CLOUD] [--hours HOURS] [--machine MACHINE] [--custom] [--dry-run] [--ssh | --container IMAGE_REF | --unpack SOURCE | --arca [ARTIFACT] | TARGET]

<INSTANCE> accepts an instance id or label.

Config

Config file: ~/.ice/config.toml

Use:

  • ice config list to view supported keys and current values
  • ice config get <KEY> to read one key
  • ice config set <KEY=VALUE> to write one key
  • ice config unset <KEY> to clear one key

Auth values are redacted in config output.

Config keys

  • default.cloud: vast.ai|gcp|aws|local
  • default.runtime_hours
  • default.vast_ai.min_cpus|min_ram_gb|allowed_gpus|max_price_per_hr
  • default.gcp.min_cpus|min_ram_gb|allowed_gpus|max_price_per_hr
  • default.aws.min_cpus|min_ram_gb|allowed_gpus|max_price_per_hr
  • default.gcp.region|zone|image_family|image_project|boot_disk_gb
  • default.aws.region|ami|key_name|ssh_key_path|ssh_user|security_group_id|subnet_id|root_disk_gb
  • auth.vast_ai.api_key
  • auth.gcp.project|service_account_json
  • auth.aws.access_key_id|secret_access_key

ice deploy

ice deploy now takes exactly one deployment target mode explicitly, or defaults to local arca unpack deployment when none is given.

Target modes:

  • --ssh
  • --container IMAGE_REF
  • --unpack SOURCE
  • --arca [ARTIFACT]
  • bare TARGET

Behavior:

  • ice deploy test-crate means ice deploy --arca test-crate.
  • Bare ice deploy means ice deploy --arca, which selects the newest local arca artifact.
  • --arca NAME is shorthand for --unpack arca:NAME.
  • --container accepts a remote container image ref such as us-central1-docker.pkg.dev/my-project/arca/my-image:tag.
  • --container arca:... is rejected because local arca artifacts are an unpack-only flow.
  • --unpack accepts:
    • arca:selector
    • a local image name such as arca-local:my-crate-deadbeef
    • a saved image.tar path
    • a full remote container ref
  • --hours overrides runtime duration for the deploy. If omitted, ice uses default.runtime_hours and otherwise falls back to 1.0.
  • --custom prompts for search filters on marketplace-backed clouds.
  • --machine pins a specific marketplace machine type.
  • --dry-run reports the chosen machine and exits before provisioning.

Examples:

ice deploy test-crate
ice deploy --arca test-crate --hours 0.25
ice deploy --unpack arca:test-crate --cloud vast.ai
ice deploy --container us-central1-docker.pkg.dev/my-project/arca/my-image:tag --cloud vast.ai
ice deploy --ssh --cloud gcp --machine g2-standard-4

Workload behavior

  • container runs a real container image on the target machine.
  • unpack extracts the layer that introduced the image entrypoint plus all higher layers, uploads only that staged filesystem diff, and starts the image entrypoint detached with persisted logs.
  • local supports container and unpack. It does not support --ssh.
  • vast.ai container workloads use entrypoint mode, not SSH mode.
  • vast.ai, gcp, and aws unpack workloads boot a shell-capable machine, upload the unpack bundle over SSH, and run the workload detached from the SSH session.
  • Deploy flows print explicit stages for machine creation, SSH readiness, unpack upload, workload start, and log following.
  • If Vast offer acceptance fails, ice deploy can immediately retry the search interactively.

Logs and shell

  • ice logs shows stdout and stderr for managed workloads.
  • For unpack, logs come from the persisted detached stdio.log and --follow exits automatically after the workload finishes and the final output is drained.
  • For container on vast.ai, logs use Vast's provider API.
  • ice shell opens the workload shell when possible and otherwise falls back to the host shell.

Notes

  • --cloud can be omitted when default.cloud is configured.
  • ice list --cloud local reports both managed local containers and managed local unpack workloads.
  • Private GCP registry pulls use your configured GCP credentials or active gcloud authentication.
  • External commands used by some flows: ssh, rsync, gcloud, aws, docker, podman.

Dependencies

~15–37MB
~528K SLoC