golang 如何运用 Docker Engine SDKs 开发应用

前言

Docker 提供了包含操作Docker daemon API接口的SDK,目前有GO版本和python版本。通过SDKs你可以很容易的构建出你的Docker 应用。如果你对Go和python都不熟悉的话,可以直接调用Docker Engine API(通过http方式)。

安装SDKs

官网上面说通过以下命令可以安装golang版本的SDK:

go get github.com/docker/docker/client

然而,我通过这种方式安装SDK,并没有成功。后来发现这个开源项目好像改了名称了,现在叫moby。贴一张github截图吧
golang 如何运用 Docker Engine SDKs 开发应用_第1张图片
第一句话,大意是“Moby是由Docker创建的一个开源项目,旨在启用和加速软件容器化”。从这里可以看出它真的改名了!
所以,安装SDK的命令换成下面的语句,试一试:

go get github.com/moby/moby

这里将整个moby项目都down下来,应为后面开发项目的时候可能用到。

官网示例

package main

import (
	"context"
	"io"
	"os"

	"github.com/docker/docker/api/types"
	"github.com/docker/docker/api/types/container"
	"github.com/docker/docker/client"
	"github.com/docker/docker/pkg/stdcopy"
)

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

    reader, err := cli.ImagePull(ctx, "docker.io/library/alpine", types.ImagePullOptions{})
    if err != nil {
        panic(err)
    }
    io.Copy(os.Stdout, reader)

    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)
    }

    statusCh, errCh := cli.ContainerWait(ctx, resp.ID, container.WaitConditionNotRunning)
    select {
    case err := <-errCh:
        if err != nil {
            panic(err)
        }
    case <-statusCh:
    }

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

    stdcopy.StdCopy(os.Stdout, os.Stderr, out)
}

如果你用goland编辑器的话,会报错,提示docker文件夹不存在。这里不能直接使用官网示例啦,别忘了这个项目已经改名为moby。所以,我们应该在导入包名的时候把名称做对应变更。如下:

	"github.com/moby/moby/api/types"
	"github.com/moby/moby/api/types/container"
	"github.com/moby/moby/client"
	"github.com/moby/moby/pkg/stdcopy"

这样改了以后,又报错:
在这里插入图片描述
没办法呀,我只有更改源码目录名称了。下载下来的源码目录为"github.com/moby/moby",我将它更改为"github.com/docker/docker"。代码就用官方示例代码,不做任何更改!OK,这次终于编译通过了,真是好事多磨啊。
好了,完事开头难,我们走过了这一关后,就可以任意掉用SDKs的接口,来实现我们应用的需求啦。

你可能感兴趣的:(问题记录)