сборка докера в Go клиенте не работает на COPY - PullRequest
0 голосов
/ 14 июня 2019

Я пытаюсь создать образ с помощью док-клиента Go. Вот программа Go, которую я запускаю:

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

    buf := new(bytes.Buffer)
    tw := tar.NewWriter(buf)
    defer tw.Close()

    dockerFile := "Dockerfile"
    dockerFileReader, err := os.Open("./Dockerfile")
    if err != nil {
        log.Fatal(err, " :unable to open Dockerfile")
    }
    readDockerFile, err := ioutil.ReadAll(dockerFileReader)
    if err != nil {
        log.Fatal(err, " :unable to read dockerfile")
    }

    tarHeader := &tar.Header{
        Name: dockerFile,
        Size: int64(len(readDockerFile)),
    }
    err = tw.WriteHeader(tarHeader)
    if err != nil {
        log.Fatal(err, " :unable to write tar header")
    }
    _, err = tw.Write(readDockerFile)
    if err != nil {
        log.Fatal(err, " :unable to write tar body")
    }
    dockerFileTarReader := bytes.NewReader(buf.Bytes())

    imageBuildResponse, err := cli.ImageBuild(
        ctx,
        dockerFileTarReader,
        types.ImageBuildOptions{
            Dockerfile: dockerFile,
            Tags:       []string{"devbuild"},
            Remove:     true})
    if err != nil {
        log.Fatal(err, " :unable to build docker image")
    }
    defer imageBuildResponse.Body.Close()
    _, err = io.Copy(os.Stdout, imageBuildResponse.Body)
    if err != nil {
        log.Fatal(err, " :unable to read image build response")
    }
}

Он помещает Dockerfile (расположенный в текущем каталоге) в файл tar и создает изображение, используя cli.ImageBuild. Это решение было взято из этой записи , и мой Dockerfile выглядит так:

FROM alpine:latest

WORKDIR /gopath/src/build
COPY ./binary_build/ /usr/local/bin/

Я постоянно получаю сообщение об ошибке на последнем шаге:

{"stream":"Step 3/3 : COPY /binary_build/ /usr/local/bin/"}
{"stream":"\n"}
{"errorDetail":{"message":"COPY failed: stat /var/lib/docker/tmp/docker-builder389608393/binary_build: no such file or directory"},"error":"COPY failed: stat /var/lib/docker/tmp/docker-builder389608393/binary_build: no such file or directory"}

Кажется, в прошлом сообщалось о похожей проблеме здесь , но, похоже, она исправлена. Я запустил go get github.com/docker/docker@latest, и моя версия докера в go.mod была github.com/docker/docker v1.13.1. Проблема все еще сохраняется.

1 Ответ

0 голосов
/ 14 июня 2019

Если вы просто создаете образ докера, этот код ничего не значит, потому что процесс сборки докера не запустит программу.Вы должны поместить свой Dockerfile и исполняемый файл «binary_build» в отдельную папку ,, возможно, Dockerfile должен выглядеть так:

FROM alpine:latest
WORKDIR /gopath/src/build
COPY binary_build /usr/local/bin/
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...