調用docker sdk的ImageBuild方法構建docker鏡像

package main

import (
	"archive/tar"
	"bytes"
	"context"
	"fmt"
	"io"
	"io/ioutil"
	"os"
	"strings"

	"github.com/docker/docker/api/types"
	"github.com/docker/docker/client"

)

func createDockerTarFile(dockerfile string) (io.Reader, error) {
   
   

	var buf bytes.Buffer
	tw := tar.NewWriter(&buf)
	f, err := os.Open(dockerfile)
	if err != nil {
   
   
		return nil, err
	}
	defer f.Close()

	body, err := ioutil.ReadAll(f)
	if err != nil {
   
   
		return nil, err
	}

	hdr := &tar.Header{
   
   
		Name: f.Name(),
		Mode: 0600,
		Size: int64(len(body)),
	}

	tw.WriteHeader(hdr)
	_,err = tw.Write(body)
	if err != nil {
   
   
		return nil, err
	}
	return &buf, nil
}

func BuildImage(cli *client.Client, dockerfile, project, imageName string,tagVersion string) error {
   
   
	
	dockerBuildContext, err := createDockerTarFile(dockerfile)
	if err != nil {
   
   
		return err
	}
	tags := fmt.Sprintf("%s:%s",imageName,tagVersion)

	buildOptions := types.ImageBuildOptions{
   
   
		Dockerfile: "Dockerfile", // optional, is the default
		Tags:       []string{
   
   tags},
		Labels: map[string]string{
   
   
			project: "project",
		},
	}

	output, err := cli.ImageBuild(context.Background(), dockerBuildContext, buildOptions)
	if err != nil {
   
   
		return err
	}

	body, err := ioutil.ReadAll(output.Body)
	if err != nil {
   
   
		return err
	}
	fmt.Printf("Build resource image output: %v\n", string(body))

	if strings.Contains(string(body), "error") {
   
   
		return fmt.Errorf("build image to docker error")
	}

	return nil
}

func main() {
   
   

	//ctx := context.Background()
	cli, err := client.NewClientWithOpts(client.FromEnv, client.WithAPIVersionNegotiation())
	if err != nil {
   
   
		panic(err)
	}

	err = BuildImage(cli, "Dockerfile", "test", "nginx","latest")
	if err != nil {
   
   
		panic(err)
	}
}

#dockerfile文件內容
FROM nginx


#構建二進制文件
go build -o build dockerBuildTools.go

#執行結果
sudo ./build 
Build resource image output: {
   
   "stream":"Step 1/2 : FROM nginx"}
{
   
   "stream":"\n"}
{
   
   "status":"Pulling from library/nginx","id":"latest"}
{
   
   "status":"Pulling fs layer","progressDetail":{
   
   },"id":"33847f680f63"}
{
   
   "status":"Pulling fs layer","progressDetail":{
   
   },"id":"dbb907d5159d"}
{
   
   "status":"Pulling fs layer","progressDetail":{
   
   },"id":"8a268f30c42a"}
{
   
   "status":"Pulling fs layer","progressDetail":{
   
   },"id":"b10cf527a02d"}
{
   
   "status":"Pulling fs layer","progressDetail":{
   
   },"id":"c90b090c213b"}
{
   
   "status":"Pulling fs layer","progressDetail":{
   
   },"id":"1f41b2f2bf94"}
{
   
   "status":"Waiting","progressDetail":{
   
   },"id":"b10cf527a02d"}
{
   
   "status":"Waiting","progressDetail":{
   
   },"id":"c90b090c213b"}
{
   
   "status":"Downloading","progressDetail":{
   
   "current":601,"total":601},"progress":"[==================================================\u003e]     601B/601B","id":"8a268f30c42a"}
{
   
   "status":"Verifying Checksum","progressDetail":{
   
   },"id":"8a268f30c42a"}
{
   
   "status":"Download complete","progressDetail":{
   
   },"id":"8a268f30c42a"}
{
   
   "status":"Downloading","progressDetail":{
   
   "current":277744,"total":27145795},"progress":"[\u003e                                                  ]  277.7kB/27.15MB","id":"33847f680f63"}
{
   
   "status":"Downloading","progressDetail":{
   
   "current":277743,"total":26596573},"progress":"[\u003e                                                  ]  277.7kB/26.6MB","id":"dbb907d5159d"}
{
   
   "status":"Downloading","progressDetail":{
   
   "current":556272,"total":27145795},"progress":"[=\u003e                                                 ]  556.3kB/27.15MB","id":"33847f680f63"}
{
   
   "status":"Downloading","progressDetail":{
   
   "current":834800,"total":27145795
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值