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
調用docker sdk的ImageBuild方法構建docker鏡像
最新推荐文章于 2025-07-05 10:23:14 发布

最低0.47元/天 解锁文章
3124

被折叠的 条评论
为什么被折叠?



