【发布时间】:2016-12-12 18:13:24
【问题描述】:
我正在尝试使用 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)
}
}
错误总是一样的:
来自守护进程的错误响应:找不到指定的 Dockerfile:dockerSrc/docker-debug-container/Dockerfile
或
来自守护进程的错误响应:找不到指定的 Dockerfile:Dockerfile
我检查过的内容:
- 该文件夹存在于构建路径中
- 我尝试了相对路径和绝对路径
- 路径中没有软链接
- 我尝试了二进制和
Dockerfile相同的文件夹 -
docker build <path>工作 - 还有一堆其他的东西
我的另一个选择是使用RemoteContext,它看起来很有效,但仅适用于完全自包含的 dockerfile,而不是具有“本地文件存在”的那些。
更新:
尝试将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)
【问题讨论】:
标签: go docker dockerfile docker-api