Golang Docker SDK映像构建因COPY而失败

时间:2019-03-22 13:41:54

标签: docker go

因此,我尝试使用Golang SDK构建docker映像,除Dockerfile中使用COPY将文件复制到映像中的部分外,所有内容都可以运行:

COPY testfile.txt /testfile.txt

我的代码如下:

func buildImage() {
    // Run in directory where Dockerfile is found
    os.Chdir("build-dir")

    cli, err := client.NewEnvClient()
    if err != nil {log.Fatal(err, " :unable to init client")}

    // Image Build requiresa tar file
    tar := new(archivex.TarFile)
    tar.Create("dockerfile.tar")
    tar.AddAll(".", true)
    tar.Close()

    // Use tar file as docker context
    dockerBuildContext, err := os.Open("dockerfile.tar")
    defer dockerBuildContext.Close()
    options := types.ImageBuildOptions{
        SuppressOutput: false,
        Remove:         true,
        ForceRemove:    true,
        PullParent:     true,
        Tags:           []string{"latest"},
        Dockerfile:     "Dockerfile",
    }
    buildResponse, err := cli.ImageBuild(context.Background(), dockerBuildContext, options)
    defer buildResponse.Body.Close()
    if err != nil {
        log.Fatal(err, " :unable to build docker image")
    }

    // Copy out response of stream
    _, err = io.Copy(os.Stdout, buildResponse.Body)


    if err != nil {
        log.Fatal(err, " :unable to read image build response")
    }
}

代码失败,并显示以下信息:

{
    "errorDetail": {
        "message":"COPY failed: stat /var/lib/docker/tmp/docker-builder264844317/testfile.txt: no such file or directory"
    },
    "error":"COPY failed: stat /var/lib/docker/tmp/docker-builder264844317/testfile.txt: no such file or directory"
}

到目前为止,我已经尝试在构建之前将文件复制到tar中,然后我还尝试将textfile.txt移到运行命令的目录中,但是我似乎仍然无法克服这一点 >

其他信息:

文件与Dockerfile位于同一目录中

-- build-dir
   |-- Dockerfile
   |-- testfile.txt

2 个答案:

答案 0 :(得分:2)

来自Source

  

docker build命令从Dockerfile和“上下文”构建Docker映像。构建的上下文是位于指定PATH或URL中的文件集。构建过程可以引用上下文中的任何文件。例如,您的构建可以使用COPY指令在上下文中引用文件。

Docker build-context是您发送到docker引擎的整个目录。在构建映像时,Docker引擎将尝试从构建上下文的根目录中查找文件。

对于您而言,该文件未添加到构建上下文中。

答案 1 :(得分:1)

因此,一位同事向我指出,而不只是运行tar.AddAll,我还需要指定我要添加的文件,请参见下面的更新代码:

func buildCIImage() {
    os.Chdir("ci-cd")
    cli, err := client.NewEnvClient()
    if err != nil {log.Fatal(err, " :unable to init client")}

    // open the file to pass into the tar
    file, err := os.OpenFile("testfile.txt", os.O_RDWR, os.ModePerm)
    // Used to get the files information
    fileInfo, err := os.Stat("testfile.txt")

    tar := new(archivex.TarFile)
    tar.Create("dockerfile.tar")
    tar.AddAll(".", true)

    // Add file into tar
    tar.Add("testfile.txt", file, fileInfo)
    tar.Close()
    dockerBuildContext, err := os.Open("dockerfile.tar")
    defer dockerBuildContext.Close()
    options := types.ImageBuildOptions{
        SuppressOutput: false,
        Remove:         true,
        ForceRemove:    true,
        PullParent:     true,
        Tags:           []string{"bootstrap"},
        Dockerfile:     "Dockerfile",
    }
    buildResponse, err := cli.ImageBuild(context.Background(), dockerBuildContext, options)
    defer buildResponse.Body.Close()
    if err != nil {
        log.Fatal(err, " :unable to build docker image")
    }
    _, err = io.Copy(os.Stdout, buildResponse.Body)
    if err != nil {
        log.Fatal(err, " :unable to read image build response")
    }
}