【问题标题】:Golang Docker SDK image build failing with COPYGolang Docker SDK 镜像构建失败并出现 COPY
【发布时间】:2019-08-13 12:26:01
【问题描述】:

所以我正在尝试使用 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

【问题讨论】:

  • Docker 将从根目录(即保存 youDockerfile 的位置)中查找文件 testfile.txt。所以请确保 testfile 和 Dockerfile 在同一级别。
  • 同级(问题更新显示)
  • 不过,你可以试试这个,看看它是否有效 - COPY build-dir/testfile.txt /testfile.txt
  • 我仍然遇到同样的错误
  • 奇怪。我的疑问来自tar.AddAll(".", true) 这一行,您说要在当前目录中添加所有文件。我假设您的 tar 程序没有将 build-dir 作为您的上下文根。你能打印出dockerBuildContext的值吗?

标签: docker go


【解决方案1】:

来自Source

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

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

在您的情况下,该文件未添加到构建上下文中。

【讨论】:

    【解决方案2】:

    所以一位同事向我指出,除了运行 `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")
        }
    }
    

    【讨论】:

      猜你喜欢
      • 2022-01-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-01-27
      • 2021-09-04
      • 1970-01-01
      • 2020-05-03
      • 2021-11-03
      相关资源
      最近更新 更多