Files
exec/docker/rootfs.go
2025-08-22 21:00:16 -03:00

82 lines
1.7 KiB
Go

package docker
import (
"context"
"io"
"github.com/docker/docker/api/types/image"
"github.com/docker/docker/client"
"github.com/docker/go-connections/nat"
"sirherobrine23.com.br/go-bds/exec"
)
var _ = exec.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(), image.ImportSource{Source: r}, rootfs.DockerImage, image.ImportOptions{
Changes: []string{
"CMD /bin/sh",
},
})
if err == nil {
_, err = io.Copy(io.Discard, r)
}
return err
}
func (rootfs *Rootfs) NewProcess() (exec.Proc, error) {
return &DockerContainer{
DockerClient: rootfs.DockerClient,
Image: rootfs.DockerImage,
Volumes: []string{},
Ports: []nat.Port{},
}, nil
}