Files
exec/docker/rootfs.go
T
2026-06-18 22:39:18 -03:00

81 lines
1.6 KiB
Go

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
}