docker SDK 的基本学习

 

```

package main

import(
    "fmt"
    "context"
    "os"
    "io"
    // "reflect"
    "time"
"github.com/docker/docker/client"
"github.com/docker/docker/api/types"
"github.com/docker/docker/api/types/container"
// "github.com/docker/docker/pkg/stdcopy"
)

func main(){
    t3:=time.Now()
    fmt.Println("t3",t3)
    fmt.Println("test")
    ctx := context.Background()
    fmt.Println("ctx",ctx)
    cli,err := client.NewClientWithOpts(client.FromEnv)
    if err!=nil{
        panic(err)
    }
    fmt.Println(cli)
    cli.NegotiateAPIVersion(ctx) //切换到于当前能够本机运行的API接口
    fmt.Println(cli)
    reader,err:=cli.ImagePull(ctx,"golang:alpine",types.ImagePullOptions{})
    if err!=nil{
        panic(err)
    }
    fmt.Println(reader)
    writer,err:=io.Copy(os.Stdout,reader)
    if err!=nil{
        panic(err)
    }
    fmt.Println(writer)

    //创建一个容器
    resp, err := cli.ContainerCreate(ctx, &container.Config{
        Hostname :"nodetest",
        Image: "node",
        Cmd: []string{"node", "/workspace/test.js"},
        Tty: true,
    }, &container.HostConfig{
        Binds:[]string{"/home/ysm/nodetest:/workspace"},
    }, nil, "")
    if err!=nil{
        panic(err)
    }
    fmt.Println(resp.ID)
    fmt.Println(resp)

    //运行一个容器
    err = cli.ContainerStart(ctx,resp.ID, types.ContainerStartOptions{})
    if err!=nil{
        panic(err)
    }
    fmt.Println("this is a problem")

    t1:= time.Now()
    fmt.Println("t1",t1)

    //容器状态
    // container.WaitConditionNotRunning 等待不运行

    // statusCh,errCh:= cli.ContainerWait(ctx,resp.ID,container.WaitConditionNotRunning )
    // select{
    // case err:=<-errCh:
    //  if err!=nil{
    //      panic(err)
    //  }
    // case x,ok:=<-statusCh:
    //  fmt.Println("zhe ge shi",reflect.TypeOf(statusCh))
    //  if !ok{
    //      fmt.Println("zhe shi ge bu he ge de ren")
    //  }else{
    //      fmt.Println(x.StatusCode)
    //  }
    // }

    t2 := time.Now()
    fmt.Println("t2",t2)
    if t2.Sub(t1)>6{
        fmt.Println("chao shi jian")
        err = cli.ContainerStop(ctx,resp.ID,nil)
        if err!=nil{
            panic(err)
        }
        err = cli.ContainerRemove(ctx,resp.ID,types.ContainerRemoveOptions{Force:true})
        if err!=nil{
            panic(err)
        }
        return
    }

    //只有当容器结束之后才能获取到数据
    out,err := cli.ContainerLogs(ctx,resp.ID,types.ContainerLogsOptions{ShowStdout:true,ShowStderr:true})
    if err!=nil{
        panic(err)
    }
    fmt.Println(out)
    io.Copy(os.Stdout,out)
}
```

转载于:https://www.cnblogs.com/MyUniverse/p/11219589.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值