This defeats me. I am not sure what I am doing wrong. There is so less documentation that searching did not produce good result. I will be happy to see what is the reason behind this strange behaviour.
I am on a MAC (10.11.6) and I am running docker for MAC (beta)
Here is the code I am trying to run
package main
import (
    "fmt"
    "github.com/docker/docker/api/types"
    "github.com/docker/docker/client"
    "golang.org/x/net/context"
)
func main() {
    defaultHeaders := map[string]string{"User-Agent": "ego-v-0.0.1"}
    cli, _ := client.NewClient("unix:///var/run/docker.sock", "v1.24", nil, defaultHeaders)
    options := types.ImageBuildOptions{
        Dockerfile:     "/path/to/my/Dockerfile",
        SuppressOutput: false,
        Remove:         true,
        ForceRemove:    true,
        PullParent:     true}
    buildResponse, err := cli.ImageBuild(context.Background(), nil, options)
    if err != nil {
        fmt.Printf("%s", err.Error())
    }
    fmt.Printf("%s", buildResponse.OSType)
}
This gives me this error -
Error response from daemon: {"message":"Cannot locate specified Dockerfile: /path/to/my/Dockerfile"}
Whereas when I run this command (from the same directory where my Go code is)
docker build /path/to/my
It works absolutely fine.
What am I doing wrong? I feel like banging my head against a wall now. Please help.
------------ EDIT / ADD ------------ I ended up doing this -
package main
import (
    "archive/tar"
    "fmt"
    "io"
    "os"
    "path/filepath"
    "strings"
    "golang.org/x/net/context"
    "github.com/docker/docker/api/types"
    "github.com/docker/docker/client"
)
func tarit(source, target string) error {
    filename := filepath.Base(source)
    target = filepath.Join(target, fmt.Sprintf("%s.tar", filename))
    fmt.Println(target)
    tarfile, err := os.Create(target)
    if err != nil {
        return err
    }
    defer tarfile.Close()
    tarball := tar.NewWriter(tarfile)
    defer tarball.Close()
    info, err := os.Stat(source)
    if err != nil {
        return nil
    }
    var baseDir string
    if info.IsDir() {
        baseDir = filepath.Base(source)
    }
    return filepath.Walk(source,
        func(path string, info os.FileInfo, err error) error {
            if err != nil {
                return err
            }
            header, err := tar.FileInfoHeader(info, info.Name())
            if err != nil {
                return err
            }
            if baseDir != "" {
                header.Name = filepath.Join(baseDir, strings.TrimPrefix(path, source))
            }
            if err := tarball.WriteHeader(header); err != nil {
                return err
            }
            if info.IsDir() {
                return nil
            }
            file, err := os.Open(path)
            if err != nil {
                return err
            }
            defer file.Close()
            _, err = io.Copy(tarball, file)
            return err
        })
}
func main() {
    tarit("/dir/with/files/and/dockerfile", "repo")
    dockerBuildContext, err := os.Open("./repo.tar")
    defer dockerBuildContext.Close()
    defaultHeaders := map[string]string{"User-Agent": "ego-v-0.0.1"}
    cli, _ := client.NewClient("unix:///var/run/docker.sock", "v1.24", nil, defaultHeaders)
    options := types.ImageBuildOptions{
        Dockerfile:     "repo/Dockerfile",
        SuppressOutput: false,
        Remove:         true,
        ForceRemove:    true,
        PullParent:     true}
    buildResponse, err := cli.ImageBuild(context.Background(), dockerBuildContext, options)
    if err != nil {
        fmt.Printf("%s", err.Error())
    }
    fmt.Printf("********* %s **********", buildResponse.OSType)
}
Now it is not complaining about anything and I can see that the tar is getting made properly and the last println is printing
********* linux **********
Which is a reply from the server. But it does not build anything. I understand that reply is almost immediate as under the hood it is just a POST request. But not sure why it is not building anything although.