Docker学习笔记(三):Dockerfile及多步骤构建镜像 (2)

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指令

删除缓存和临时文件

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/wpwgpx.html