以下内容均来自个人笔记并重新梳理,如有错误欢迎指正!
如果对您有帮助,烦请点赞、关注、转发!如果您有其他想要了解的,欢迎私信联系我~
相关概念
1、登录镜像仓库
Dockerfile 是一个文本文件,用于在执行 docker build 命令构建 Docker 镜像时,定义所需的基础镜像以及相关命令。
2、构建上下文
构建上下文是执行 docker build 命令时所在的目录。
默认情况下 Dockerfile 位于该目录,也可以使用 -f 参数来指定其他路径下 Dockerfile 文件。
一般来说,构建上下文应该创建一个空目录,并只放置 Dockerfile 以及构建镜像所需的文件。如果目录中存在多余的文件且不希望构建到镜像中,可以将其写入 .dockerignore 文件,构建镜像时会自动忽略。
常用指令
1、FROM
指定构建 Docker 镜像所使用的基础镜像,如 alpine:latest。
2、RUN
指定 docker build 时执行的命令。可以用 && 符号连接多条命令以精简镜像层数。
代码语言:javascript复制RUN apt-get update
&& apt-get install -y wget
&& rm -rf /var/lib/apt/lists/*
3、CMD
指定 docker run 启动容器时执行的默认命令。存在多个 CMD 时仅最后一个生效。
4、ENTRYPOINT
指定 docker run 启动容器时执行的主要命令。如 MySQL 官方镜像指定的启动入口:
代码语言:javascript复制ENTRYPOINT ["docker-entrypoint.sh"]
5、WORKDIR
指定容器中服务的工作目录,需要使用绝对路径。
6、COPY
将构建上下文中指定的文件、目录复制到镜像中。COPY 命令会增加镜像层数。
7、ADD
将构建上下文中指定的文件、目录、远程URL复制到镜像中,特定格式的压缩文件会直接解压到镜像目录。ADD 命令会增加镜像层数。
8、VOLUME
指定主机、容器之间的映射目录。
9、ENV
指定容器所需的环境变量,key=value 形式。
10、LABEL
指定容器所需的标签信息,key=value 形式。
11、EXPOSE
指定容器中服务的监听端口。
多阶段构建
多阶段构建是通过在一个 Dockerfile 中使用多个 FROM 语句来实现的。
每个 FROM 指令都可以使用不同的基础镜像,并表示开始一个新的构建阶段。
代码语言:javascript复制# 第一阶段:在 golang 镜像中编译go代码
FROM golang AS build-env # 定义索引,用于被其他阶段引用
ADD /go/src/app
WORKDIR /go/src/app
RUN go get -u -v github.com/kardianos/govendor
RUN govendor sync
RUN GOOS=linux GOARCH=amd64 go build -v -o /go/src/app/app-server
# 第二阶段:在 alpine 镜像中直接引用第一阶段产生的二进制文件,并完成其他构建内容
FROM alpine
COPY --from=build-env /go/src/app/app-server /usr/local/bin/app-server
RUN apk add -U tzdata
RUN In -sf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime
EXPOSE 8080
CMD "app-server"
反向解析 Dockerfile
笔者文章【Docker】MySQL 源码构建 Docker 镜像(基于 ARM 64 架构)中曾提到通过镜像获取 Dockerfile,本文再介绍几种通过镜像文件反向解析 Dockerfile 的方法。
1、dfimage 工具
代码语言:javascript复制alias dfimage="docker run --rm -v /var/run/docker.sock:/var/run/docker.sock alpine/dfimage"
dfimage -sV=1.36 nginx:latest