diff --git a/go.mod b/go.mod index f6c768c..8430715 100644 --- a/go.mod +++ b/go.mod @@ -10,7 +10,7 @@ require ( github.com/google/go-containerregistry v0.20.7 github.com/gorilla/websocket v1.5.3 github.com/itchyny/json2yaml v0.1.4 - github.com/kernel/hypeman-go v0.9.8 + github.com/kernel/hypeman-go v0.10.0 github.com/muesli/reflow v0.3.0 github.com/stretchr/testify v1.11.1 github.com/tidwall/gjson v1.18.0 diff --git a/go.sum b/go.sum index 9ff0435..b924838 100644 --- a/go.sum +++ b/go.sum @@ -72,8 +72,8 @@ github.com/grpc-ecosystem/grpc-gateway/v2 v2.27.2 h1:8Tjv8EJ+pM1xP8mK6egEbD1OgnV github.com/grpc-ecosystem/grpc-gateway/v2 v2.27.2/go.mod h1:pkJQ2tZHJ0aFOVEEot6oZmaVEZcRme73eIFmhiVuRWs= github.com/itchyny/json2yaml v0.1.4 h1:/pErVOXGG5iTyXHi/QKR4y3uzhLjGTEmmJIy97YT+k8= github.com/itchyny/json2yaml v0.1.4/go.mod h1:6iudhBZdarpjLFRNj+clWLAkGft+9uCcjAZYXUH9eGI= -github.com/kernel/hypeman-go v0.9.8 h1:DGx3em3Bzu/MR3mgVgu7sCe8NZxujlEUGVctnrzopXA= -github.com/kernel/hypeman-go v0.9.8/go.mod h1:guRrhyP9QW/ebUS1UcZ0uZLLJeGAAhDNzSi68U4M9hI= +github.com/kernel/hypeman-go v0.10.0 h1:terBKYBwHAtDic425oUrb3RZMo0Q0DrXjPiVNmDXblE= +github.com/kernel/hypeman-go v0.10.0/go.mod h1:guRrhyP9QW/ebUS1UcZ0uZLLJeGAAhDNzSi68U4M9hI= github.com/klauspost/compress v1.18.1 h1:bcSGx7UbpBqMChDtsF28Lw6v/G94LPrrbMbdC3JH2co= github.com/klauspost/compress v1.18.1/go.mod h1:ZQFFVG+MdnR0P+l6wpXgIL4NTtwiKIdBnrBd8Nrxr+0= github.com/kr/pretty v0.3.1 h1:flRD4NNwYAUpkphVc1HcthR4KEIFJ65n8Mw5qdRn3LE= diff --git a/pkg/cmd/lifecycle.go b/pkg/cmd/lifecycle.go index 530c466..cc51159 100644 --- a/pkg/cmd/lifecycle.go +++ b/pkg/cmd/lifecycle.go @@ -19,9 +19,19 @@ var stopCmd = cli.Command{ } var startCmd = cli.Command{ - Name: "start", - Usage: "Start a stopped instance", - ArgsUsage: "", + Name: "start", + Usage: "Start a stopped instance", + ArgsUsage: "", + Flags: []cli.Flag{ + &cli.StringSliceFlag{ + Name: "entrypoint", + Usage: "Override image entrypoint for this run (can be repeated for multiple args)", + }, + &cli.StringSliceFlag{ + Name: "cmd", + Usage: "Override image CMD for this run (can be repeated for multiple args)", + }, + }, Action: handleStart, HideHelpCommand: true, } @@ -89,9 +99,18 @@ func handleStart(ctx context.Context, cmd *cli.Command) error { opts = append(opts, debugMiddlewareOption) } + params := hypeman.InstanceStartParams{} + + if entrypoint := cmd.StringSlice("entrypoint"); len(entrypoint) > 0 { + params.Entrypoint = entrypoint + } + if cmdArgs := cmd.StringSlice("cmd"); len(cmdArgs) > 0 { + params.Cmd = cmdArgs + } + fmt.Fprintf(os.Stderr, "Starting %s...\n", args[0]) - instance, err := client.Instances.Start(ctx, instanceID, opts...) + instance, err := client.Instances.Start(ctx, instanceID, params, opts...) if err != nil { return err } diff --git a/pkg/cmd/run.go b/pkg/cmd/run.go index a58a2c1..771d557 100644 --- a/pkg/cmd/run.go +++ b/pkg/cmd/run.go @@ -108,6 +108,21 @@ Examples: Name: "skip-kernel-headers", Usage: "Skip kernel headers installation during boot for faster startup (DKMS will not work)", }, + // Entrypoint and CMD overrides + &cli.StringSliceFlag{ + Name: "entrypoint", + Usage: "Override image entrypoint (can be repeated for multiple args)", + }, + &cli.StringSliceFlag{ + Name: "cmd", + Usage: "Override image CMD (can be repeated for multiple args)", + }, + // Metadata flags + &cli.StringSliceFlag{ + Name: "metadata", + Aliases: []string{"l"}, + Usage: "Set metadata key-value pair (KEY=VALUE, can be repeated)", + }, // Volume mount flags &cli.StringSliceFlag{ Name: "volume", @@ -244,6 +259,29 @@ func handleRun(ctx context.Context, cmd *cli.Command) error { params.SkipKernelHeaders = hypeman.Opt(cmd.Bool("skip-kernel-headers")) } + // Entrypoint and CMD overrides + if entrypoint := cmd.StringSlice("entrypoint"); len(entrypoint) > 0 { + params.Entrypoint = entrypoint + } + if cmdArgs := cmd.StringSlice("cmd"); len(cmdArgs) > 0 { + params.Cmd = cmdArgs + } + + // Metadata + metadataSpecs := cmd.StringSlice("metadata") + if len(metadataSpecs) > 0 { + metadata := make(map[string]string) + for _, m := range metadataSpecs { + parts := strings.SplitN(m, "=", 2) + if len(parts) == 2 { + metadata[parts[0]] = parts[1] + } else { + fmt.Fprintf(os.Stderr, "Warning: ignoring malformed metadata: %s\n", m) + } + } + params.Metadata = metadata + } + // Volume mounts volumeSpecs := cmd.StringSlice("volume") if len(volumeSpecs) > 0 {