Skip to content

Commit

Permalink
Merge pull request #6 from daytonaio/pull-image-on-workspace-start
Browse files Browse the repository at this point in the history
fix: pull image on workspace create
  • Loading branch information
Tpuljak authored Mar 8, 2024
2 parents 4e8af05 + a46b274 commit df3dc77
Show file tree
Hide file tree
Showing 3 changed files with 72 additions and 35 deletions.
10 changes: 10 additions & 0 deletions pkg/provider/provider.go
Original file line number Diff line number Diff line change
Expand Up @@ -97,6 +97,16 @@ func (p DockerProvider) CreateWorkspace(workspaceReq *provider.WorkspaceRequest)
return new(types.Empty), err
}

targetOptions, err := provider_types.ParseTargetOptions(workspaceReq.TargetOptions)
if err != nil {
return new(types.Empty), err
}

err = util.PullImage(client, targetOptions.ContainerImage)
if err != nil {
return new(types.Empty), err
}

err = util.CreateNetwork(client, workspaceReq.Workspace.Id)
return new(types.Empty), err
}
Expand Down
36 changes: 1 addition & 35 deletions pkg/provider/util/init_container.go
Original file line number Diff line number Diff line change
Expand Up @@ -3,51 +3,17 @@ package util
import (
"context"
"fmt"
"io"
"path"
"strings"

"github.com/daytonaio/daytona/pkg/types"
docker_types "github.com/docker/docker/api/types"
"github.com/docker/docker/api/types/container"
"github.com/docker/docker/api/types/mount"
"github.com/docker/docker/client"

log "github.com/sirupsen/logrus"
)

func InitContainer(client *client.Client, project *types.Project, workdirPath, imageName, serverDownloadUrl, serverVersion, serverUrl, serverApiUrl string) error {
ctx := context.Background()

images, err := client.ImageList(ctx, docker_types.ImageListOptions{})
if err != nil {
return err
}

found := false
for _, image := range images {
for _, tag := range image.RepoTags {
if strings.HasPrefix(tag, imageName) {
found = true
break
}
}
}

if !found {
log.Info("Image not found, pulling...")
responseBody, err := client.ImagePull(ctx, imageName, docker_types.ImagePullOptions{})
if err != nil {
return err
}
defer responseBody.Close()
_, err = io.Copy(io.Discard, responseBody)
if err != nil {
return err
}
log.Info("Image pulled successfully")
}

mounts := []mount.Mount{
{
Type: mount.TypeVolume,
Expand All @@ -67,7 +33,7 @@ func InitContainer(client *client.Client, project *types.Project, workdirPath, i
"DAYTONA_SERVER_API_URL=" + serverApiUrl,
}

_, err = client.ContainerCreate(ctx, &container.Config{
_, err := client.ContainerCreate(ctx, &container.Config{
Hostname: project.Name,
Image: imageName,
Labels: map[string]string{
Expand Down
61 changes: 61 additions & 0 deletions pkg/provider/util/pull_image.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,61 @@
package util

import (
"context"
"io"
"strings"

"github.com/docker/docker/api/types"
"github.com/docker/docker/api/types/filters"
"github.com/docker/docker/client"

log "github.com/sirupsen/logrus"
)

func PullImage(client *client.Client, imageName string) error {
ctx := context.Background()

tag := "latest"
tagSplit := strings.Split(imageName, ":")
if len(tagSplit) == 2 {
tag = tagSplit[1]
}

if tag != "latest" {
images, err := client.ImageList(ctx, types.ImageListOptions{
Filters: filters.NewArgs(filters.Arg("reference", imageName)),
})
if err != nil {
return err
}

found := false
for _, image := range images {
for _, tag := range image.RepoTags {
if strings.HasPrefix(tag, imageName) {
found = true
break
}
}
}

if found {
log.Info("Image found")
return nil
}
}

log.Info("Pulling image...")
responseBody, err := client.ImagePull(ctx, imageName, types.ImagePullOptions{})
if err != nil {
return err
}
defer responseBody.Close()
_, err = io.Copy(io.Discard, responseBody)
if err != nil {
return err
}
log.Info("Image pulled successfully")

return nil
}

0 comments on commit df3dc77

Please sign in to comment.