scratch镜像是一个空的镜像文件,特别适合创建超级小的镜像。

生成go可执行程序的方法

go可执行程序生成的时候依赖的一些库如libc还是动态链接的,但是scratch 镜像完全是空的,什么东西也不包含,所以生成go可执行程序时候要按照下面的方式生成,使生成的go可执行程序静态链接所有的库:

CGO_ENABLED=0 GOOS=linux go build -a -ldflags '-extldflags "-static"' -o howie_tcp .

创建dockerfile

FROM scratch
ADD howie_tcp /var/howie_tcp
WORKDIR /var
ENTRYPOINT ["/var/howie_tcp"]

build 镜像

docker build -t tcp:v1 .

创建一个带配置文件的dockerfile

FROM scratch
ADD  main /var/main
ADD  conf /var/conf/
WORKDIR /var
ENTRYPOINT ["/var/main"]

//项目目录
.
├── conf
│   └── app.ini
├── Dockerfile
├── main
└── main.go

//main.go 代码
package main

import (
	"os"
	"path/filepath"
	"github.com/go-ini/ini"
	"fmt"
)

func main() {
	checkErr := func(err error) {
		if err != nil {
			panic(err)
		}
	}
	dir, err := os.Getwd()
	checkErr(err)
	appConfigPath := filepath.Join(dir, "conf", "app.ini")
	conf, err := ini.Load(appConfigPath)
	checkErr(err)
	user := conf.Section("admin").Key("user").String()
	pass := conf.Section("admin").Key("pass").String()
	fmt.Println("user :", user)
	fmt.Println("pass :", pass)
}

创建dockerfile

FROM scratch
ADD howie_tcp /var/howie_tcp
WORKDIR /var
ENTRYPOINT ["/var/howie_tcp"]

联系 QQ: 3355168235