podman-build/cmd/podman/volumes/import.go
2025-10-11 12:30:35 +09:00

60 lines
1.5 KiB
Go

package volumes
import (
"context"
"fmt"
"os"
"github.com/containers/podman/v5/cmd/podman/common"
"github.com/containers/podman/v5/cmd/podman/parse"
"github.com/containers/podman/v5/cmd/podman/registry"
"github.com/containers/podman/v5/pkg/domain/entities"
"github.com/spf13/cobra"
)
var (
importDescription = `Imports contents into a podman volume from specified tarball (.tar, .tar.gz, .tgz, .bzip, .tar.xz, .txz).`
importCommand = &cobra.Command{
Use: "import VOLUME [SOURCE]",
Short: "Import a tarball contents into a podman volume",
Long: importDescription,
RunE: importVol,
Args: cobra.ExactArgs(2),
ValidArgsFunction: common.AutocompleteVolumes,
Example: `podman volume import my_vol /home/user/import.tar
cat ctr.tar | podman volume import my_vol -`,
}
)
func init() {
registry.Commands = append(registry.Commands, registry.CliCommand{
Command: importCommand,
Parent: volumeCmd,
})
}
func importVol(cmd *cobra.Command, args []string) error {
opts := entities.VolumeImportOptions{}
filepath := args[1]
if filepath == "-" {
opts.Input = os.Stdin
} else {
if err := parse.ValidateFileName(filepath); err != nil {
return err
}
targetFile, err := os.Open(filepath)
if err != nil {
return fmt.Errorf("unable open input file: %w", err)
}
defer targetFile.Close()
opts.Input = targetFile
}
containerEngine := registry.ContainerEngine()
ctx := context.Background()
return containerEngine.VolumeImport(ctx, args[0], opts)
}