docker build [OPTIONS] PATH | URL | -
该命令默认读取指定路径下的Dockerfile(也可使用 -f 指定),并将该路径下的所有数据作为上下文发送给Docker服务端。逐条执行指令,生成镜像。
一般情况下都需要使用FROM来指定父镜像,所以父镜像会影响到新生成镜像的大小和功能。
通常有两种镜像可作为父镜像:基础镜像和普通镜像(由第三方创建,基于基础镜像)。基础镜像一般是基于scratch或者Dockerfile中不存在FROM指令。
对于编译型语言通常需要编译环境和运行环境两个镜像:
编译环境镜像:包括完整的编译环境、依赖库等,体积较大。作用是将代码编译为二进制程序。
运行环境镜像:运行二进制程序,而不需要与编译环境,体积比较小。
app.go
package main import "fmt" func main() { fmt.Println("Hello World") }Dockerfile中使用两次FROM
FROM golang:1.14-alpine as builder WORKDIR /go/src/test COPY app.go . RUN CGO_ENABLED=0 GOOS=linux go build -o app app.go FROM alpine:latest COPY --from=builder /go/src/test/app /root/ #此处 --from=builder 也可以改为 --from=0 CMD ["/root/app"]构建、运行
-> [feifei@ffmac.local] [~/work/docker] docker build -t hello . -> [feifei@ffmac.local] [~/work/docker] docker run --rm hello Hello World 清理untagged镜像多阶段构建会生成编译环境镜像,也会将之前的同名镜像变为<none>:<none>,清理此类镜像可执行以下命令:
docker rmi $(docker images --filter dangling=true -q) 注意事项使用.dockerignore文件,避免发送不必要的数据
提供注释和维护者信息
正确使用镜像版本号
每条RUN都会提交为新的镜像层,尽量合并RUN指令
删除缓存和临时文件