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"]