Skip to content

Instantly share code, notes, and snippets.

@Dentrax
Last active August 14, 2022 20:41
Show Gist options
  • Select an option

  • Save Dentrax/bab093c4d8348c21da65be7e34c75efc to your computer and use it in GitHub Desktop.

Select an option

Save Dentrax/bab093c4d8348c21da65be7e34c75efc to your computer and use it in GitHub Desktop.

Revisions

  1. Dentrax renamed this gist Jul 2, 2021. 1 changed file with 0 additions and 0 deletions.
    File renamed without changes.
  2. Dentrax created this gist Jul 2, 2021.
    118 changes: 118 additions & 0 deletions gistfile1.txt
    Original file line number Diff line number Diff line change
    @@ -0,0 +1,118 @@
    package main

    import (
    "archive/tar"
    "bytes"
    "fmt"
    "github.com/google/go-containerregistry/pkg/crane"
    "github.com/google/go-containerregistry/pkg/name"
    v1 "github.com/google/go-containerregistry/pkg/v1"
    "github.com/google/go-containerregistry/pkg/v1/mutate"
    "github.com/google/go-containerregistry/pkg/v1/tarball"
    "io"
    "log"
    "os"
    )

    func main() {
    log.Printf("pulling the image...")

    img, err := crane.Pull("registry.trendyol.com/platform/base/poc/simple-golang-app:latest")
    if err != nil {
    panic(err)
    }

    log.Printf("creating layer...")

    l, err := createLayer("./dlv")
    if err != nil {
    panic(err)
    }

    log.Printf("appending layer...")

    i, err := mutate.AppendLayers(img, l)
    if err != nil {
    panic(err)
    }

    log.Printf("tagging layer...")

    tag, err := name.NewTag("furkanturkal/delve:foo")
    if err != nil {
    panic(err)
    }

    log.Printf("image %s pushed to the registry succesfully\n", tag.String())

    cfg, err := i.ConfigFile()
    if err != nil {
    log.Fatalf("getting config: %v", err)
    }
    cfg = cfg.DeepCopy()

    fmt.Printf("%+v", cfg.Config.Entrypoint)

    cfg.Config.Entrypoint = []string{"./dlv", "--listen=:40000", "--headless=true", "--api-version=2", "exec", cfg.Config.Entrypoint[0]}

    li, err := mutate.Config(i, cfg.Config)
    if err != nil {
    log.Fatalf("mutating config: %v", err)
    }

    fmt.Printf("update entrypoint to: %+v", cfg.Config.Entrypoint)

    log.Printf("pushing layer...")

    //if s, err := daemon.Write(tag, newImg); err != nil {
    // panic(err)
    //} else {
    // fmt.Println(s)

    if err := crane.Push(li, tag.String()); err != nil {
    panic(err)
    }

    log.Printf("DONE")
    }

    func createLayer(fpath string) (v1.Layer, error) {
    var b bytes.Buffer
    tw := tar.NewWriter(&b)

    file, err := os.Open(fpath)
    if err != nil {
    return nil, err
    }
    defer file.Close()

    stat, err := file.Stat()
    if err != nil {
    return nil, err
    }

    header := &tar.Header{
    Name: "/src/" + fpath,
    Size: stat.Size(),
    Mode: int64(stat.Mode()),
    ModTime: stat.ModTime(),
    }

    header.Typeflag = tar.TypeReg

    err = tw.WriteHeader(header)
    if err != nil {
    return nil, err
    }

    _, err = io.Copy(tw, file)
    if err != nil {
    return nil, err
    }

    if err := tw.Close(); err != nil {
    return nil, fmt.Errorf("failed to finish tar: %w", err)
    }

    return tarball.LayerFromReader(&b)
    }