Docker 镜像制作和管理
- [Docker 镜像制作和管理](#Docker 镜像制作和管理)
-
- [1. 将现有容器通过 docker commit 手动构建镜像](#1. 将现有容器通过 docker commit 手动构建镜像)
-
- [1.1 基于容器手动制作镜像步骤](#1.1 基于容器手动制作镜像步骤)
- [2. 利用 DockerFile 文件执行 docker build 自动构建镜像](#2. 利用 DockerFile 文件执行 docker build 自动构建镜像)
-
- [2.1 Dockerfile 文件格式](#2.1 Dockerfile 文件格式)
- [2.2 Dockerfile 相关指令](#2.2 Dockerfile 相关指令)
-
- [2.2.1 FROM: 指定基础镜像](#2.2.1 FROM: 指定基础镜像)
- [2.2.2 LABEL: 指定镜像元数据](#2.2.2 LABEL: 指定镜像元数据)
- [2.2.3 RUN: 执行 shell 命令](#2.2.3 RUN: 执行 shell 命令)
- [2.2.4 ENV: 设置环境变量](#2.2.4 ENV: 设置环境变量)
- [2.2.5 COPY: 复制文本](#2.2.5 COPY: 复制文本)
- [2.2..6 ADD: 复制和解包文件](#2.2..6 ADD: 复制和解包文件)
- [2.2.7 CMD: 容器启动命令](#2.2.7 CMD: 容器启动命令)
- [2.2.8 ENTRYPOINT: 入口点](#2.2.8 ENTRYPOINT: 入口点)
- [2.2.9 ARG: 构建参数](#2.2.9 ARG: 构建参数)
- [2.2.10 VOLUME: 匿名卷](#2.2.10 VOLUME: 匿名卷)
- [2.2.11 EXPOSE: 暴露端口](#2.2.11 EXPOSE: 暴露端口)
- [2.2.12 WORKDIR: 指定工作目录](#2.2.12 WORKDIR: 指定工作目录)
- [2.2.13 ONBUILD: 子镜像引用父镜像的指令](#2.2.13 ONBUILD: 子镜像引用父镜像的指令)
- [2.2.14 USER: 指定当前用户](#2.2.14 USER: 指定当前用户)
- [2.2.15 HEALTHCHECK: 健康检查](#2.2.15 HEALTHCHECK: 健康检查)
- [2.2.16 .dockerignore 文件](#2.2.16 .dockerignore 文件)
- [2.2.17 Dockerfile 指令总结](#2.2.17 Dockerfile 指令总结)
- [3. 构建镜像 docker build 命令](#3. 构建镜像 docker build 命令)
Docker 镜像制作和管理
Docker 镜像中有没有内核
从镜像大小上面来说,一个比较小的镜像只有 1MB 多点或几 MB,而内核文件需要几十 MB, 因此镜像里 面是没有内核的,镜像在被启动为容器后将直接使用宿主机的内核,而镜像本身则只提供相应的 rootfs,即系统正常运行所必须的用户空间的文件系统,比如: /dev/,/proc,/bin,/etc 等目录,容器 当中 /boot 目录是空的,而 /boot 当中保存的就是与内核相关的文件和目录。
为什么没有内核
由于容器启动和运行过程中是直接使用了宿主机的内核,不会直接调用物理硬件,所以也不会涉及到硬件驱动,因此也无需容器内拥有自已的内核和驱动。而如果使用虚拟机技术,对应每个虚拟机都有自已独立的内核。
容器中的程序后台运行会导致此容器启动后立即退出
Docker 容器如果希望启动后能持续运行,就必须有一个能前台持续运行的进程,如果在容器中启动传统的服务,如: httpd,php-fpm 等均为后台进程模式运行,就导致 docker 在前台没有运行的应用,这样的容器启 动后会立即退出。所以一般会将服务程序以前台方式运行,对于有一些可能不知道怎么实现前台运行的 程序,只需要在你启动的该程序之后添加类似于 tail ,top 这种可以前台运行的程序即可。比较常用的方 法,如 tail -f /etc/hosts 。
制作镜像方式
Docker 镜像制作类似于虚拟机的镜像(模版)制作,即按照公司的实际业务需求将需要安装的软件、相关配置等基础环境配置完成,然后将其做成镜像,最后再批量从镜像批量生成容器实例,这样可以极大 的简化相同环境的部署工作。
Docker的镜像制作
- 手动制作(基于容器)
- 自动制作(基于 DockerFile)
企业通常都是基于 Dockerfile 制作镜像。
1. 将现有容器通过 docker commit 手动构建镜像
1.1 基于容器手动制作镜像步骤
bash
[root@Ubuntu2204 ~]#docker commit --help
用法: docker commit [选项] 容器 [仓库[:标签]]
从容器的更改创建一个新的镜像
选项:
-a, --author 字符串 作者信息(例如:"John Hannibal Smith <hannibal@a-team.com>")
-c, --change 列表 对创建的镜像应用 Dockerfile 指令
-m, --message 字符串 提交信息
-p, --pause 在提交期间暂停容器(默认值:true)
# 说明:
制作镜像和 CONTAINER 状态无关,停止状态也可以制作镜像
如果没有指定 [REPOSITORY[:TAG]],REPOSITORY 和 TAG 都为 <none>
提交的时候标记 TAG 号: 生产当中常用,后期可以根据 TAG 标记创建不同版本的镜像以及创建不同版本的容器
[root@Ubuntu2204 ~]#docker commit -m "add webapps app" -a "anan" 3816ed653caf tomcat:9.0.37-v1
基于容器手动制作镜像步骤具体如下:
- 下载一个系统的官方基础镜像,如: CentOS 或 Ubuntu
- 基于基础镜像启动一个容器,并进入到容器
- 在容器里面做配置操作
- 安装基础命令
- 配置运行环境
- 安装服务和配置服务
- 放业务程序代码
- 提交为一个新镜像 docker commit
- 基于自己的的镜像创建容器并测试访问
2. 利用 DockerFile 文件执行 docker build 自动构建镜像
DockerFile 是一种被 Docker 程序解释执行的脚本,由一条条的命令组成的,每条命令对应 linux 下面的一条命令,Docker 程序将这些 DockerFile 指令再翻译成真正的 linux 命令,其有自己的书写方式和支持的命令,Docker 程序读取 DockerFile 并根据指令生成 Docker 镜像,相比手动制作镜像的方式,DockerFile 更能直观的展示镜像是怎么产生的,有了 DockerFile,当后期有额外的需求时,只要在之前的 DockerFile 添加或者修改响应的命令即可重新生成新的 Docker 镜像,避免了重复手动制作镜像的麻烦,类似与 shell 脚本一样,可以方便高效的制作镜像
Docker 守护程序 Dockerfile 逐一运行指令,如有必要,将每个指令的结果提交到新镜像,然后最终输 出新镜像的 ID。Docker 守护程序将自动清理之前发送的上下文
请注意,每条指令都是独立运行的,并会导致创建新镜像,比如 RUN cd /tmp 对下一条指令不会有任何影响。
Docker 将尽可能重用中间镜像层(缓存),以显著加速 docker build 命令的执行过程,这由 Using cache 控制台输出中的消息指示
bash
# 按照业务类型或系统类型等方式划分创建目录环境,方便后期镜像比较多的时候进行分类
[root@Ubuntu2204 ~]#mkdir /data/dockerfile/{web/{nginx,apache,tomcat,jdk},system/{centos,ubuntu,alpine,debian}} -p
[root@Ubuntu2204 ~]#tree /data/dockerfile/
/data/dockerfile/
├── system
│ ├── alpine
│ ├── centos
│ ├── debian
│ └── ubuntu
└── web
├── apache
├── jdk
├── nginx
└── tomcat
10 directories, 0 files
2.1 Dockerfile 文件格式
dockerfile 官方说明: https://docs.docker.com/engine/reference/builder/
Dockerfile 文件说明
- 每一行以 Dockerfile 的指令开头,指令不区分大小写,但是惯例使用大写
- 使用 # 开始作为注释
- 每一行只支持一条指令,每条指令可以携带多个参数
- 指令按文件的顺序从上至下进行执行
- 每个指令的执行会生成一个新的镜像层,为了减少分层和镜像大小,尽可能将多条指令合并成一条 指令
- 制作镜像一般可能需要反复多次,每次执行 dockfile 都按顺序执行,从头开始,已经执行过的指令 已经缓存,不需要再执行,如果后续有一行新的指令没执行过,其往后的指令将会重新执行,所以为加速镜像制作,将最常变化的内容放下 dockerfile 的文件的后面
2.2 Dockerfile 相关指令
Dockerfile 构建过程
- 从基础镜像运行一个容器
- 执行一条指令,对容器做出修改
- 执行类似 docker commit 的操作,提交一个新的中间镜像层(可以利用中间层镜像创建容器进行调试 和排错)
- 再基于刚提交的镜像运行一个新容器
- 执行 Dockerfile中 的下一条指令,直至所有指令执行完毕
2.2.1 FROM: 指定基础镜像
定制镜像,需要先有一个基础镜像,在这个基础镜像上进行定制。
FROM 就是指定基础镜像,此指令通常必需放在 Dockerfile 文件第一个非注释行。后续的指令都是运行 于此基准镜像所提供的运行环境
基础镜像可以是任何可用镜像文件,默认情况下,docker build 会在 docker 主机上查找指定的镜像文 件,在其不存在时,则会从 Docker Hub Registry 上拉取所需的镜像文件.如果找不到指定的镜像文件, docker build 会返回一个错误信息
如何选择合适的镜像呢? 对于不同的软件官方都提供了相关的 docker 镜像,比如: nginx、redis、mysql、httpd、tomcat 等服务 类的镜像,也有操作系统类,如: centos、ubuntu、debian 等。建议使用官方镜像,比较安全。
bash
FROM [--platform=<platform>] <image> [AS <name>]
FROM [--platform=<platform>] <image>[:<tag>] [AS <name>]
FROM [--platform=<platform>] <image>[@<digest>] [AS <name>]
# 说明:
--platform 指定镜像的平台,比如: linux/amd64, linux/arm64, or windows/amd64
tag 和 digest 是可选项,如果不指定,默认为 latest
关于 scratch 镜像
FROM scratch
参考链接:
https://hub.docker.com/_/scratch?tab=description
https://docs.docker.com/develop/develop-images/baseimages/
该镜像是一个空的镜像,可以用于构建 busybox 等超小镜像,可以说是真正的从零开始构建属于自己的镜像 该镜像在构建基础镜像(例如 debian 和 busybox)或超最小镜像(仅包含一个二进制文件及其所需内容,例 如:hello-world)的上下文中最有用。
2.2.2 LABEL: 指定镜像元数据
可以指定镜像元数据,如: 镜像作者等
一个镜像可以有多个 label ,还可以写在一行中,即多标签写法,可以减少镜像的的大小
bash
LABEL <key>=<value> <key>=<value> <key>=<value> ...
2.2.3 RUN: 执行 shell 命令
RUN 指令用来在构建镜像阶段需要执行 FROM 指定镜像所支持的 Shell 命令。
通常各种基础镜像一般都支持丰富的 shell 命令
注意: RUN 可以写多个,每一个 RUN 指令都会建立一个镜像层,所以尽可能合并成一条指令,比如将多个 shell 命令通过 && 连接一起成为一条指令
每个 RUN 都是独立运行的,和前一个 RUN 无关
bash
# shell 格式: 相当于 /bin/sh -c <命令> 此种形式支持环境变量
RUN <命令>
# exec 格式: 此种形式不支持环境变量,注意:是双引号,不能是单引号
RUN ["executable","param1","param2"...]
# exec格式可以指定其它shell
RUN ["/bin/bash","-c","echo hello wang"]
shell 格式中,<command> 通常是一个 shell 命令,且以 "/bin/sh -c" 来运行它,这意味着此进程在容器中的 PID 不为 1,不能接收Unix 信号,因此,当使用 docker stop <container> 命令停止容器时,此进程接收不到 SIGTERM 信号
exec 格式中的参数是一个 JSON 格式的数组,其中 <executable> 为要运行的命令,后面的 <paramN> 为传递给命令的选项或参数;然而,此种格式指定的命令不会以 "/bin/sh -c" 来发起,因此常见的 shell 操作如变量替换以及通配符(?,*等)替换将不会进行;不过,如果要运行的命令依赖于此 shell 特性的话,可以将其替换为类似下面的格式。
RUN ["/bin/bash", "-c", "<executable>", "<param1>"]
2.2.4 ENV: 设置环境变量
ENV 可以定义环境变量和值,会被后续指令(如:ENV,ADD,COPY,RUN 等)通过 $KEY 或 ${KEY} 进行引用, 并在容器运行时保持
bash
# 变量赋值格式1 此格式只能对一个 key 赋值,<key> 之后的所有内容均会被视作其 <value> 的组成部分
ENV <key> <value>
# 变量赋值格式2 此格式可以支持多个 key 赋值,定义多个变量建议使用,减少镜像层
ENV <key1>=<value1> <key2>=<value2> \
<key3>=<value3> ...
# 如果 <value> 中包含空格,可以以反斜线\进行转义,也可通过对 <value> 加引号进行标识;另外,反斜线也可用于续行
# 只使用一次变量
RUN <key>=<value> <command>
# 引用变量
RUN $key .....
# 变量支持高级赋值格式
${key:-word}
${kye:+word}
如果运行容器时如果需要修改变量,可以执行通过基于 exec 机制实现
注意: 此方式只影响容器运行时环境,而不影响构建镜像的过程,即只能覆盖 docker run 时的环境变量,而 不会影响 docker build 时环境变量的值
bash
docker run -e|--env <key>=<value>
#说明
-e, --env list #Set environment variables
--env-file filename #Read in a file of environment variables
2.2.5 COPY: 复制文本
复制本地宿主机的到容器中的 。
bash
COPY [--chown=<user>:<group>] <src>... <dest>
COPY [--chown=<user>:<group>] ["<src>",... "<dest>"] #路径中有空白字符时,建议使用此格式
说明:
- 可以是多个,可以使用通配符,通配符规则满足 Go 的 filepath.Match 规则 filepath.Match 参考链接: https://pkg.go.dev/path/filepath#Match
- 必须是 build 上下文中的路径(为 Dockerfile 所在目录的相对路径),不能是其父目录中的文件
- 如果是目录,则其内部文件或子目录会被递归复制,但目录自身不会被复制
- 如果指定了多个, 或在中使用了通配符,则必须是一个目 录,且必须以 / 结尾
- 可以是绝对路径或者是 WORKDIR 指定的相对路径
- 使用 COPY 指令,源文件的各种元数据都会保留。比如读、写、执行权限、文件变更时间等
- 如果事先不存在,它将会被自动创建,这包括其父目录路径,即递归创建目录
2.2...6 ADD: 复制和解包文件
该命令可认为是增强版的 COPY,不仅支持 COPY,还支持自动解压缩。可以将复制指定的到容器中的
bash
ADD [--chown=<user>:<group>] <src>... <dest>
ADD [--chown=<user>:<group>] ["<src>",... "<dest>"]
说明:
- 可以是 Dockerfile 所在目录的一个相对路径;也可是一个 URL;还可是一个 tar 文件(自动解压)
- 可以是绝对路径或者是 WORKDIR 指定的相对路径
- 如果是目录,只复制目录中的内容,而非目录本身
- 如果是一个 URL ,下载后的文件权限自动设置为 600
- 如果为 URL 且不以 / 结尾,则指定的文件将被下载并直接被创建为,如果以 / 结尾,则文件名 URL 指定的文件将被直接下载并保存为 /< filename>
- 如果是一个本地文件系统上的打包文件,如: gz, bz2 ,xz ,它将被解包 ,其行为类似于 "tar -x" 命令, 但是通过 URL 获取到的 tar 文件将不会自动展开
- 如果有多个,或其间接或直接使用了通配符,则必须是一个以 / 结尾的目录路径;如果不以 / 结尾,则其被视作一个普通文件,的内容将被直接写入到
2.2.7 CMD: 容器启动命令
一个容器中需要持续运行的进程一般只有一个,CMD 用来指定启动容器时默认执行的一个命令,且其运 行结束后,容器也会停止,所以一般CMD 指定的命令为持续运行且为前台命令.
- 如果 docker run 没有指定任何的执行命令或者 dockerfile 里面也没有 ENTRYPOINT 命令,那么开启 容器时就会使用执行 CMD 指定的默认的命令
- 前面介绍过的 RUN 命令是在构建镜像时执行的命令,注意二者的不同之处
- 每个 Dockerfile 只能有一条 CMD 命令。如指定了多条,只有最后一条被执行
- 如果用户启动容器时用 docker run xxx 指定运行的命令,则会覆盖 CMD 指定的命令
bash
# 使用 exec 执行,推荐方式,第一个参数必须是命令的全路径,此种形式不支持环境变量
CMD ["executable","param1","param2"]
# 在 /bin/sh 中执行,提供给需要交互的应用;此种形式支持环境变量
CMD command param1 param2
# 提供给 ENTRYPOINT 命令的默认参数
CMD ["param1","param2"]
2.2.8 ENTRYPOINT: 入口点
功能类似于 CMD,配置容器启动后执行的命令及参数
bash
# 使用 exec 执行
ENTRYPOINT ["executable", "param1", "param2"...]
# shell中执行
ENTRYPOINT command param1 param2
- ENTRYPOINT 不能被 docker run 提供的参数覆盖,而是追加,即如果 docker run 命令有参数,那 么参数全部都会作为 ENTRYPOINT 的参数
- 如果 docker run 后面没有额外参数,但是 dockerfile 中有 CMD 命令(即上面 CMD 的第三种用 法),即 Dockerfile 中即有 CMD 也有 ENTRYPOINT,那么 CMD 的全部内容会作为 ENTRYPOINT 的参 数
- 如果 docker run 后面有额外参数,同时 Dockerfile 中即有 CMD 也有 ENTRYPOINT,那么 docker run 后面的参数覆盖掉 CMD 参数内容,最终作为 ENTRYPOINT 的参数
- 可以通过 docker run --entrypoint string 参数在运行时替换,注意 string 不要加空格
- 使用 CMD 要在运行时重新写命令本身,然后在后面才能追加运行参数,ENTRYPOINT 则可以运行时 无需重写命令就可以直接接受新参数
- 每个 Dockerfile 中只能有一个 ENTRYPOINT,当指定多个时,只有最后一个生效
- 通常会利用 ENTRYPOINT 指令配合脚本,可以为 CMD 指令提供环境配置
2.2.9 ARG: 构建参数
ARG 指令在 build 阶段指定变量,和 ENV 不同的是,容器运行时不会存在这些环境变量
bash
ARG <name>[=<default value>]
如果和 ENV 同名,ENV 覆盖 ARG 变量
可以用 docker build --build-arg <参数名>=<值> 来覆盖
FROM 指令支持 ARG 指令放在第一个 FROM 之前声明变量
在 FROM 之前声明的 ARG 在构建阶段之外,所以它不能在 FROM 之后的任何指令中使用。 要使用在第一个FROM 之前声明的 ARG 的默认值,请在构建阶段内使用没有值的 ARG 指令
2.2.10 VOLUME: 匿名卷
在容器中创建一个可以从本地主机或其他容器挂载的挂载点,一般用来存放数据库和需要保持的数据 等,默认会将宿主机上的目录挂载至 VOLUME 指令指定的容器目录。即使容器后期被删除,此宿主机的目录仍会保留,从而实现容器数据的持久保存。
宿主机目录为
bash
/var/lib/docker/volumes/<volume_id>/_data
VOLUME <容器内路径>
VOLUME ["<容器内路径1>", "<容器内路径2>"...]
注意:
<容器内路径>如果在容器内不存在,在创建容器时会自动创建
<容器内路径>如果是存在的,同时目录内有内容,将会把此目录的内容复制到宿主机的实际目录
Dockerfile 中的 VOLUME 实现的是匿名数据卷,无法指定宿主机路径和容器目录的挂载关系
通过docker rm -fv <容器ID> 可以删除容器的同时删除 VOLUME 指定的卷
2.2.11 EXPOSE: 暴露端口
指定服务端的容器需要对外暴露(监听)的端口号,以实现容器与外部通信。
EXPOSE 仅仅是声明容器打算使用什么端口而已,并不会真正暴露端口,即不会自动在宿主进行端口映射
因此,在启动容器时需要通过 -P 或 -p ,Docker 主机才会真正分配一个端口转发到指定暴露的端口才可 使用
注意: 即使 Dockerfile 没有 EXPOSE 端口指令,也可以通过 docker run -p 临时暴露容器内程序真正监听的端口,所以 EXPOSE 相当于指定默认的暴露端口,可以通过 docker run -P 进行真正暴露
bash
EXPOSE <port>[/ <protocol>] [<port>[/ <protocol>] ..]
# 说明
<protocol> 用于指定传输层协议,可为 tcp 或 udp 二者之一,默认为 TCP 协议
2.2.12 WORKDIR: 指定工作目录
为后续的 RUN、CMD、ENTRYPOINT 指令配置工作目录,当容器运行后,进入容器内 WORKDIR 指定的默认目录
WORKDIR 指定工作目录(或称当前目录),以后各层的当前目录就被改为指定的目录,如该目录不存 在,WORKDIR 会自行创建
可以使用多个 WORKDIR 指令,后续命令如果参数是相对路径,则会基于之前命令指定的路径。
bash
WORKDIR /path/to/workdir
2.2.13 ONBUILD: 子镜像引用父镜像的指令
可以用来配置当构建当前镜像的子镜像时,会自动触发执行的指令,但在当前镜像构建时,并不会执行,即 延迟到子镜像构建时才执行
bash
ONBUILD [INSTRUCTION]
说明:
- 尽管任何指令都可注册成为触发器指令,但 ONBUILD 不能自我能套,且不会触发 FROM 和 MAINTAINER 指令
- 使用 ONBUILD 指令的镜像,推荐在标签中注明
2.2.14 USER: 指定当前用户
指定运行容器的用户名或 UID,在后续 dockerfile 中的 RUN ,CMD 和 ENTRYPOINT 指令时使用此用户
当服务不需要管理员权限时,可以通过该命令指定运行用户
这个用户必须是事先建立好的,否则无法切换
如果没有指定 USER,默认是 root 身份执行
bash
USER <user>[:<group>]
USER <UID>[:<GID>]
2.2.15 HEALTHCHECK: 健康检查
检查容器的健康性
bash
HEALTHCHECK [选项] CMD <命令> #设置检查容器健康状况的命令,如果命令执行失败,则返回 1,即 unhealthy
HEALTHCHECK NONE #如果基础镜像有健康检查指令,使用这行可以屏蔽掉其健康检查指令
HEALTHCHECK 支持下列选项:
--interval=<间隔> #两次健康检查的间隔,默认为 30 秒
--timeout=<时长> #健康检查命令运行超时时间,如果超过这个时间,本次健康检查就被视为失败,默认 30 秒
--retries=<次数> #当连续失败指定次数后,则将容器状态视为 unhealthy,默认 3 次
--start-period=<FDURATION> #default: 0s
#检查结果返回值:
0 #success the container is healthy and ready for use
1 #unhealthy the container is not working correctly
2 #reserved do not use this exit code
2.2.16 .dockerignore 文件
官方文档: https://docs.docker.com/reference/dockerfile/#dockerignore-file与 .gitignore 文件类似,生成构建上下文时 Docker客户端应忽略的文件和文件夹指定模式
.dockerignore 使用 Go 的文件路径规则 filepath.Match
完整的语法
bash
# # 以#开头的行为注释
* # 匹配任何非分隔符字符序列
? # 匹配任何单个非分隔符
\\ # 表示 \
** # 匹配任意数量的目录(包括零)例如,**/*.go 将排除在所有目录中以 .go 结尾的所有文件,包括构建上下文的根。
! # 表示取反,可用于排除例外情况
2.2.17 Dockerfile 指令总结
BUILD | RUN | BOTH |
---|---|---|
FROM | CMD | WORKDIR |
LABEL | VOLUME | USER |
COPY | EXPOSE | ENV |
ADD | ENTRYPOINT | |
RUN | ||
ONBUILD | ||
.dockerignore |
3. 构建镜像 docker build 命令
docker build 命令使用 Dockerfile 文件创建镜像
bash
[root@Ubuntu2204 ~]#docker build --help
用法: docker build [选项] 路径 | URL | -
从 Dockerfile 构建镜像
选项:
--add-host list 添加自定义主机到 IP 的映射 (格式: host:ip)
--build-arg list 设置构建时变量
--cache-from strings 指定用作缓存源的镜像
--cgroup-parent string 容器的可选父 cgroup
--compress 使用 gzip 压缩构建上下文
--cpu-period int 限制 CPU CFS(完全公平调度器)周期
--cpu-quota int 限制 CPU CFS(完全公平调度器)配额
-c, --cpu-shares int CPU 共享(相对权重)
--cpuset-cpus string 允许执行的 CPU(格式: 0-3, 0,1)
--cpuset-mems string 允许执行的内存节点(格式: 0-3, 0,1)
--disable-content-trust 跳过镜像验证 (默认值: true)
-f, --file string Dockerfile 的名称 (默认值为 'PATH/Dockerfile')
--force-rm 总是删除中间容器
--iidfile string 将镜像 ID 写入文件
--isolation string 容器隔离技术
--label list 为镜像设置元数据
-m, --memory bytes 内存限制
--memory-swap bytes 交换限制等于内存加交换: '-1' 表示启用无限交换
--network string 在构建过程中为 RUN 指令设置网络模式 (默认值: "default")
--no-cache 构建镜像时不使用缓存
--pull 总是尝试拉取更新版本的镜像
-q, --quiet 抑制构建输出,成功时打印镜像 ID
--rm 成功构建后删除中间容器 (默认值: true)
--security-opt strings 安全选项
--shm-size bytes /dev/shm 的大小
-t, --tag list 镜像名称及可选标签,格式为 'name:tag'
--target string 设置要构建的目标构建阶段
--ulimit ulimit Ulimit 选项 (默认值: [])