Build Docker Image From Go Code

后端 未结 6 1652
鱼传尺愫
鱼传尺愫 2020-12-03 15:29

I\'m trying to build a Docker image using the Docker API and Docker Go libraries (https://github.com/docker/engine-api/). Code example:

package main
import (         


        
6条回答
  •  死守一世寂寞
    2020-12-03 16:01

    The following works for me;

    package main
    
    import (
        "archive/tar"
        "bytes"
        "context"
        "io"
        "io/ioutil"
        "log"
        "os"
    
        "github.com/docker/docker/api/types"
        "github.com/docker/docker/client"
    )
    
    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 := "myDockerfile"
        dockerFileReader, err := os.Open("/path/to/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{
                Context:    dockerFileTarReader,
                Dockerfile: dockerFile,
                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")
        }
    }
    

提交回复
热议问题