package docker import ( "context" "io" "github.com/moby/moby/api/types/network" "github.com/moby/moby/client" "sirherobrine23.com.br/go-bds/exec/v2/process" ) var _ = process.RegisterRootfs("docker", func(a ...any) (*Rootfs, error) { container := "debian:latest" var dockerClient *client.Client if len(a) > 0 { switch v := a[0].(type) { case string: container = v case *client.Client: dockerClient = v if len(a) > 1 { if cont, ok := a[1].(string); ok { container = cont } } } } if dockerClient == nil { var err error if dockerClient, err = client.NewClientWithOpts(client.FromEnv); err != nil { return nil, err } } return &Rootfs{ DockerClient: dockerClient, DockerImage: container, }, nil }) type Rootfs struct { DockerClient *client.Client DockerImage string } func (rootfs *Rootfs) Close() error { return rootfs.DockerClient.Close() } func (rootfs *Rootfs) Tar(w io.Writer) error { r, err := rootfs.DockerClient.ImageSave(context.Background(), []string{rootfs.DockerImage}) if err != nil { return err } defer r.Close() _, err = io.Copy(w, r) return err } func (rootfs *Rootfs) FromTar(r io.Reader) error { r, err := rootfs.DockerClient.ImageImport(context.Background(), client.ImageImportSource{Source: r}, rootfs.DockerImage, client.ImageImportOptions{ Changes: []string{ "CMD /bin/sh", }, }) if err == nil { _, err = io.Copy(io.Discard, r) } return err } func (rootfs *Rootfs) NewProcess() (process.Proc, error) { return &DockerContainer{ DockerClient: rootfs.DockerClient, Image: rootfs.DockerImage, Volumes: []string{}, Ports: []network.Port{}, }, nil }