Сбой сборки образа Golang Docker SDK с помощью COPY - PullRequest
0 голосов
/ 22 марта 2019

Итак, я пытаюсь создать образ докера с помощью Golang SDK, все выполняется, кроме раздела в 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 ]

2 голосов
/ 22 марта 2019

Из Источник

Команда сборки docker создает образы Docker из Dockerfile и «контекста».Контекст сборки - это набор файлов, расположенных в указанном PATH или URL.Процесс сборки может ссылаться на любой из файлов в контексте.Например, ваша сборка может использовать инструкцию COPY для ссылки на файл в контексте.

Docker build-context - это весь каталог, который вы отправляете в механизм докера.При сборке образа движок Docker попытается найти файлы в корне контекста сборки.

В вашем случае файл не был добавлен в контекст сборки.

1 голос
/ 22 марта 2019

Итак, коллега указал мне, вместо того, чтобы просто запустить 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")
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...