Signed-off-by: Matheus Sampaio Queiroga <srherobrine20@gmail.com>
82 lines
1.7 KiB
Go
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
|
|
}
|