3

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

    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.

2
  • Link to tutorial? Commented Mar 15, 2017 at 17:59
  • My bad! should have added this! Updated my question with the docs! Commented Mar 15, 2017 at 20:49

3 Answers 3

1

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.

Sign up to request clarification or add additional context in comments.

1 Comment

Just finished testing, io.copy(nil,pullstat) Will not work.
1

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.

Comments

0

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.

3 Comments

Can you point out on what specific tweaks would i need to do for "create" function? I tried appending "latest" string, but it was of no help
The problem is that 'docker run's CLI equivalent in Golang is not working (at least from what Docker has in its site). Not entirely sure if its really the go code or something with my native docker configurations. If you can see above the equivalent docker run command works just fine
I'm not sure where your code is having issues and haven't had time to try the tutorial myself. The above was more to answer what docker is doing in their code to implement this.

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.