This repository has been archived on 2024-03-03. You can view files and clone it, but cannot push or open issues or pull requests.
minifaas/engine/docker/docker.go

84 lines
1.6 KiB
Go

package docker
import (
"context"
"io"
"github.com/docker/docker/api/types"
"github.com/docker/docker/api/types/container"
"github.com/docker/docker/api/types/mount"
"github.com/docker/docker/api/types/network"
"github.com/docker/docker/client"
oci "github.com/opencontainers/image-spec/specs-go/v1"
)
func newCli() (*client.Client, error) {
return client.NewClientWithOpts(client.FromEnv)
}
func Ps() ([]types.Container, error) {
cli, err := newCli()
if err != nil {
return nil, err
}
containers, err := cli.ContainerList(context.Background(), types.ContainerListOptions{})
if err != nil {
return nil, err
}
return containers, nil
}
func Run(image string, cmd []string, mounts []mount.Mount) (string, error) {
cli, err := newCli()
if err != nil {
return "", err
}
ctnr, err := cli.ContainerCreate(
context.Background(),
&container.Config{
AttachStdout: true,
AttachStderr: true,
Image: image,
Cmd: cmd,
Volumes: map[string]struct{}{
"/data": {},
},
},
&container.HostConfig{
Mounts: mounts,
},
&network.NetworkingConfig{},
&oci.Platform{
Architecture: "amd64",
OS: "linux",
},
"",
)
if err != nil {
return "", err
}
err = cli.ContainerStart(context.Background(), ctnr.ID, types.ContainerStartOptions{})
if err != nil {
return "", err
}
return ctnr.ID, nil
}
func Logs(id string) (io.ReadCloser, error) {
cli, err := newCli()
if err != nil {
return nil, err
}
return cli.ContainerLogs(context.Background(), id, types.ContainerLogsOptions{
ShowStdout: true,
ShowStderr: true,
Follow: true,
})
}