gpt4 book ai didi

go - Docker客户端构建错误

转载 作者:数据小太阳 更新时间:2023-10-29 03:26:32 26 4
gpt4 key购买 nike

这打败了我。我不确定我做错了什么。文档太少,搜索结果不好。我很高兴看到这种奇怪行为背后的原因是什么。

我在 MAC (10.11.6) 上运行 docker for MAC(测试版)

这是我要运行的代码

package main

import (
"fmt"

"github.com/docker/docker/api/types"
"github.com/docker/docker/client"
"golang.org/x/net/context"
)

func main() {
defaultHeaders := map[string]string{"User-Agent": "ego-v-0.0.1"}
cli, _ := client.NewClient("unix:///var/run/docker.sock", "v1.24", nil, defaultHeaders)
options := types.ImageBuildOptions{
Dockerfile: "/path/to/my/Dockerfile",
SuppressOutput: false,
Remove: true,
ForceRemove: true,
PullParent: true}
buildResponse, err := cli.ImageBuild(context.Background(), nil, options)
if err != nil {
fmt.Printf("%s", err.Error())
}
fmt.Printf("%s", buildResponse.OSType)
}

这给了我这个错误 -

Error response from daemon: {"message":"Cannot locate specified Dockerfile: /path/to/my/Dockerfile"}

而当我运行此命令时(从我的 Go 代码所在的同一目录)

docker build /path/to/my

它工作得很好。

我做错了什么?我现在想用头撞墙。请帮忙。

------------ 编辑/添加------------我最终这样做了 -

package main

import (
"archive/tar"
"fmt"
"io"
"os"
"path/filepath"
"strings"

"golang.org/x/net/context"

"github.com/docker/docker/api/types"
"github.com/docker/docker/client"
)

func tarit(source, target string) error {
filename := filepath.Base(source)
target = filepath.Join(target, fmt.Sprintf("%s.tar", filename))
fmt.Println(target)
tarfile, err := os.Create(target)
if err != nil {
return err
}
defer tarfile.Close()

tarball := tar.NewWriter(tarfile)
defer tarball.Close()

info, err := os.Stat(source)
if err != nil {
return nil
}

var baseDir string
if info.IsDir() {
baseDir = filepath.Base(source)
}

return filepath.Walk(source,
func(path string, info os.FileInfo, err error) error {
if err != nil {
return err
}
header, err := tar.FileInfoHeader(info, info.Name())
if err != nil {
return err
}
if baseDir != "" {
header.Name = filepath.Join(baseDir, strings.TrimPrefix(path, source))
}

if err := tarball.WriteHeader(header); err != nil {
return err
}

if info.IsDir() {
return nil
}

file, err := os.Open(path)
if err != nil {
return err
}
defer file.Close()
_, err = io.Copy(tarball, file)
return err
})
}

func main() {
tarit("/dir/with/files/and/dockerfile", "repo")
dockerBuildContext, err := os.Open("./repo.tar")
defer dockerBuildContext.Close()
defaultHeaders := map[string]string{"User-Agent": "ego-v-0.0.1"}
cli, _ := client.NewClient("unix:///var/run/docker.sock", "v1.24", nil, defaultHeaders)
options := types.ImageBuildOptions{
Dockerfile: "repo/Dockerfile",
SuppressOutput: false,
Remove: true,
ForceRemove: true,
PullParent: true}
buildResponse, err := cli.ImageBuild(context.Background(), dockerBuildContext, options)
if err != nil {
fmt.Printf("%s", err.Error())
}
fmt.Printf("********* %s **********", buildResponse.OSType)
}

现在它没有提示任何事情,我可以看到 tar 正在正确制作并且最后一个 println 正在打印

********* linux **********

这是服务器的回复。但它不构建任何东西。我知道回复几乎是即时的,因为在后台它只是一个 POST 请求。但不确定为什么它没有 build 任何东西。

最佳答案

Dockerfile 必须是获取 TARd 并发送到引擎的构建上下文的一部分。您不应该使用 Dockerfile 的绝对路径,它 must be relative to the context ,所以您只需传递名称即可。

我认为您演示的 CLI 命令不正确 - 除非 Dockerfile 实际上是您的目录名称:

> ls /tmp/path/to/context 
Dockerfile
> docker build /tmp/path/to/context/Dockerfile
unable to prepare context: context must be a directory: /tmp/path/to/context/Dockerfile

当您仅发送路径(其中包含 Dockerfile 文件)时,这有效:

> docker build /tmp/path/to/context
Sending build context to Docker daemon 2.048 kB
Step 1 : FROM alpine
---> ee4603260daa
Successfully built ee4603260daa

关于go - Docker客户端构建错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39893116/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com