command-runner/internal/containers/docker/docker_service.go (56 lines of code) (raw):

package docker import ( "context" "fmt" "os" "github.com/aws/codecatalyst-runner-cli/command-runner/internal/containers/types" "github.com/docker/docker/client" "github.com/rs/zerolog/log" ) type ServiceProvider struct{} func (sp *ServiceProvider) Available(ctx context.Context) bool { if os.Getenv("NODOCKER") != "" { return false } cli, err := getDockerClient(ctx) if err != nil { log.Debug().Err(err).Msg("docker is unavailable") return false } defer cli.Close() _, err = cli.ServerVersion(ctx) if err != nil { log.Debug().Err(err).Msg("docker is unavailable") return false } return true } func (sp *ServiceProvider) NewContainerService() types.ContainerService { return &dockerContainerService{} } type dockerContainerService struct{} func (dcs *dockerContainerService) NewContainer(input types.NewContainerInput) types.Container { cr := new(dockerContainer) cr.input = input return cr } // ImageExistsLocally returns a boolean indicating if an image with the // requested name, tag and architecture exists in the local docker image store func (dcs *dockerContainerService) ImageExistsLocally(ctx context.Context, imageName string, platform string) (bool, error) { return imageExistsLocally(ctx, imageName, platform) } func imageExistsLocally(ctx context.Context, imageName string, platform string) (bool, error) { cli, err := getDockerClient(ctx) if err != nil { return false, err } defer cli.Close() inspectImage, _, err := cli.ImageInspectWithRaw(ctx, imageName) if client.IsErrNotFound(err) { return false, nil } else if err != nil { return false, err } if platform == "" || platform == "any" || fmt.Sprintf("%s/%s", inspectImage.Os, inspectImage.Architecture) == platform { return true, nil } return false, nil }