从Go代码构建Docker镜像

我正在尝试使用Docker API和Docker Go库(https://github.com/docker/engine-api/)构建Docker镜像.代码示例:

package main
import (
    "fmt"
    "github.com/docker/engine-api/client"
    "github.com/docker/engine-api/types"
    "golang.org/x/net/context"
)
func main() {
    defaultHeaders := map[string]string{"User-Agent": "engine-api-cli-1.0"}
    cli, err := client.NewClient("unix:///var/run/docker.sock", "v1.22", nil, defaultHeaders)
    if err != nil {
        panic(err)
    }
    fmt.Print(cli.ClientVersion())
    opt := types.ImageBuildOptions{
        CPUSetCPUs:   "2",
        CPUSetMems:   "12",
        CPUShares:    20,
        CPUQuota:     10,
        CPUPeriod:    30,
        Memory:       256,
        MemorySwap:   512,
        ShmSize:      10,
        CgroupParent: "cgroup_parent",
        Dockerfile:   "dockerSrc/docker-debug-container/Dockerfile",
    }
    _, err = cli.ImageBuild(context.Background(), nil, opt)
    if err == nil || err.Error() != "Error response from daemon: Server error" {
        fmt.Printf("expected a Server Error, got %v", err)
    }
}

错误始终相同:

Error response from daemon: Cannot locate specified Dockerfile: dockerSrc/docker-debug-container/Dockerfile

要么

Error response from daemon: Cannot locate specified Dockerfile: Dockerfile

我检查过的事情:

>该文件夹存在于构建路径中
>我尝试了相对和绝对路径
>路径中没有软链接
>我为二进制文件和Dockerfile尝试了相同的文件夹
> docker build< path>作品
>和其他一堆东西

我的另一个选择是使用看起来像它的RemoteContext,但仅适用于完全自包含的dockerfiles,而不是具有“本地文件存在”的那些.

更新:
尝试将tar作为缓冲区传递,但得到的结果与以下内容相同:

  dockerBuildContext, err := os.Open("<path to>/docker-debug-    container/docker-debug-container.tar")
  defer dockerBuildContext.Close()

    opt := types.ImageBuildOptions{
        Context:      dockerBuildContext,
        CPUSetCPUs:   "2",
        CPUSetMems:   "12",
        CPUShares:    20,
        CPUQuota:     10,
        CPUPeriod:    30,
        Memory:       256,
        MemorySwap:   512,
        ShmSize:      10,
        CgroupParent: "cgroup_parent",
        //  Dockerfile:   "Dockerfile",
    }

    _, err = cli.ImageBuild(context.Background(), nil, opt)
最佳答案
@Mangirdas:盯着屏幕足够长的帮助 – 至少在我的情况下.一段时间以来,我一直困扰着同样的问题.
你是正确的使用tar文件(你的第二个例子).如果您在这里查看API文档https://docs.docker.com/engine/reference/api/docker_remote_api_v1.24/#/build-image-from-a-dockerfile,您可以看到它需要tar.
真正帮助我的是在我的案例中查看客户端的其他实现,perl和ruby.当被要求从目录构建映像时,它们都会动态创建tar.
无论如何,你只需要将dockerBuildContext放在其他地方(参见cli.ImageBuild())

dockerBuildContext, err := os.Open("/Path/to/your/docker/tarfile.tar")
defer dockerBuildContext.Close()

buildOptions := types.ImageBuildOptions{
    Dockerfile:   "Dockerfile", // optional, is the default
}

buildResponse, err := cli.ImageBuild(context.Background(), dockerBuildContext, buildOptions)
if err != nil {
    log.Fatal(err)
}
defer buildResponse.Body.Close()

我还没有正确命名图像,但至少我可以创建它们……
希望这可以帮助.
干杯

转载注明原文:从Go代码构建Docker镜像 - 代码日志