`docker run` using Golang API (Docker docs)

I am trying to use Docker’s tutorial in recreating a docker run. Here is the following code from online tutorial

 package main

 import (
 "io"
 "os"

"github.com/docker/docker/client"
"github.com/docker/docker/api/types"
"github.com/docker/docker/api/types/container"
"golang.org/x/net/context"
 )

 func main() {
ctx := context.Background()
cli, err := client.NewEnvClient()
if err != nil {
    panic(err)
}

_, err = cli.ImagePull(ctx, "alpine", types.ImagePullOptions{})
if err != nil {
    panic(err)
}

resp, err := cli.ContainerCreate(ctx, &container.Config{
    Image: "alpine",
    Cmd:   []string{"echo", "hello world"},
}, nil, nil, "")
if err != nil {
    panic(err)
}

if err := cli.ContainerStart(ctx, resp.ID, types.ContainerStartOptions{});     err != nil {
    panic(err)
}

if _, err = cli.ContainerWait(ctx, resp.ID); err != nil {
    panic(err)
}

out, err := cli.ContainerLogs(ctx, resp.ID, types.ContainerLogsOptions{ShowStdout: true})
if err != nil {
    panic(err)
}

io.Copy(os.Stdout, out)
}

The problem I see with this is, if ‘alpine’ docker, is not available locally, it doesn’t pull the latest and ends up throwing an error.
e.g
XXXXX$ go run go_docker.go
panic: Error: No such image: alpine

  • sudo docker build -t=“nisevi/static_web” is not working
  • docker-compose service version error
  • Filebeat vs Java logging appenders
  • Docker and Splash to render website does not work
  • Syntax highlighting for Dockerfile in Sublime Text?
  • Inter docker communication (mqtt and python)
  •     goroutine 1 [running]:
          panic(0x27ffa0, 0xc4202afa50)
        /usr/local/go/src/runtime/panic.go:500 +0x1a1
        main.main()
        /Users/rvenkatesh/go_coding/raghu_test_code/go_docker.go:30 +0x592
        exit status 2
    

    But when I run the commandline equivalent, I see

        XXXX$ docker run alpine echo hello world
        Unable to find image 'alpine:latest' locally
        latest: Pulling from library/alpine 
        627beaf3eaaf: Pull complete
    
            Digest:sha256:58e1a1bb75db1b5a24a462dd5e2915277ea06438c3f105138f97eb53149673c4
        Status: Downloaded newer image for alpine:latest
        hello world
    

    I tried looking through Go client, do I need to tweak anything with ImagePull function? Any help here would be appreciated!

    Here is the link to the docs https://docs.docker.com/engine/api/getting-started/

    Update: I had tested the same tutorial for python version, and it worked just fine. I wonder if the Golang page needs update.

  • Docker automated build shows empty Dockerfile
  • Remove existing image when using `docker commit`?
  • Docker image for windows components
  • Visual Studio 2015 Docker Integration wont attach for debuging
  • Windows Server 2016 Docker - cant install webfarm components to microsoft/iis image
  • How to check if a process is running inside docker container
  • 3 Solutions collect form web for “`docker run` using Golang API (Docker docs)”

    The docker client is open source and written in Go, so you can see exactly how they’ve implemented their version. I believe the relevant code is in the container/create.go pullImage function.

    Image.Pull returns an io.Reader which you must read and close; if you do not the connection will be closed before the image is pulled.

    You can just discard the contents of it and close it, then the pull will work.

    Was having the same issue, the “Pull” didn’t seem to be working. Found a Fix though.

    1) Modify your pull line to

    pullstat, err = cli.ImagePull(ctx, "alpine", types.ImagePullOptions{})
    

    and add

    io.Copy(os.StdOut,pullstat) 
    

    after the ImagePull

    I haven’t tried doing an

    io.Copy(nil,pullstat) 
    

    but that’s on my list of things to try next.

    Docker will be the best open platform for developers and sysadmins to build, ship, and run distributed applications.