1、docker build 基本命令

docker build [OPTIONS] PATH | URL | -

PATH: 包含 Dockerfile 的目录路径或 .(当前目录)。
URL: 指向包含 Dockerfile 的远程存储库地址(如 Git 仓库)。
-: 从标准输入读取 Dockerfile。

常用选项:

-t, --tag: 为构建的镜像指定名称和标签。

-f, --file: 指定 Dockerfile 的路径(默认是 PATH 下的 Dockerfile)。

--build-arg: 设置构建参数。

--no-cache: 不使用缓存层构建镜像。

--rm: 构建成功后删除中间容器(默认开启)。

--force-rm: 无论构建成功与否,一律删除中间容器。

--pull: 始终尝试从注册表拉取最新的基础镜像。

更多选项说明:

--build-arg=[]: 设置构建镜像时的变量。
--cpu-shares: 设置 CPU 使用权重。
--cpu-period: 限制 CPU CFS 周期。
--cpu-quota: 限制 CPU CFS 配额。
--cpuset-cpus: 指定可使用的 CPU ID。
--cpuset-mems: 指定可使用的内存节点 ID。
--disable-content-trust: 忽略内容信任验证(默认启用)。
-f: 指定 Dockerfile 的路径。
--force-rm: 强制在构建过程中删除中间容器。
--isolation: 使用指定的容器隔离技术。
--label=[]: 设置镜像的元数据。
-m: 设置内存的最大值。
--memory-swap: 设置交换空间的最大值(内存 + 交换空间),-1 表示不限制交换空间。
--no-cache: 构建镜像时不使用缓存。
--pull: 尝试拉取基础镜像的最新版本。
--quiet, -q: 安静模式,构建成功后只输出镜像 ID。
--rm: 构建成功后删除中间容器(默认启用)。
--shm-size: 设置 /dev/shm 的大小,默认值为 64M。
--ulimit: 设置 Ulimit 配置。
--squash: 将 Dockerfile 中所有步骤压缩为一层。
--tag, -t: 为镜像指定名称和标签,格式为 name:tag 或 name;可以在一次构建中为一个镜像设置多个标签。
--network: 在构建期间设置 RUN 指令的网络模式,默认值为 default。

构建镜像  

docker build -t myimage:latest .

这会从当前目录读取 Dockerfile 并构建一个名为 myimage:latest 的镜像。

指定 Dockerfile 路径

docker build -f /path/to/Dockerfile -t myimage:latest .

这会从 /path/to/ 目录读取 Dockerfile 并构建一个名为 myimage:latest 的镜像。

设置构建参数

docker build --build-arg HTTP_PROXY=http://proxy.example.com -t myimage:latest .

这会在构建过程中使用 HTTP_PROXY 环境变量。

不使用缓存层构建镜像

docker build --no-cache -t myimage:latest .

这会在构建镜像时忽略所有缓存层,确保每一步都重新执行。

2、Dockerfile 基本命令

FROM 指定基础镜像
RUN 执行命令
COPY 复制文件
ADD 更高级的复制文件
CMD 用于指定容器启动时要运行的默认命令
ENTRYPOINT 容器运行过程的起点
ENV 设置环境变量
ARG 用于指定容器启动时要运行的默认命令
VOLUME 定义匿名卷
EXPOSE 需要暴露的端口
WORKDIR 指定工作目录
USER 指定当前用户
HEALTHCHECK 定义健康检查
ONBUILD 为镜像添加触发器
LABEL 添加元数据标签
STOPSIGNAL 停止容器时发送的信号 
SHELL 指定在执行RUN、CMD和ENTRYPOINT指令时使用的shell解释器

注意:

Dockerfile 的指令每执行一次都会在 docker 上新建一层。所以过多无意义的层,会造成镜像膨胀过大。

FROM 指定基础镜像

FROM 指令用于指定其后构建新镜像所使用的基础镜像。FROM 指令必是 Dockerfile 文件中的首条命令,启动构建流程后,Docker 将会基于该镜像构建新镜像,FROM 后的命令也会基于这个基础镜像。

语法格式如下:

FROM <image>
# 或
FROM <image>:<tag>
# 或
FROM <image>:<digest>

FROM 有以下限制:

1、FROM 必须 是 Dockerfile 中第一条非注释命令。

2、在一个 Dockerfile 文件中创建多个镜像时,FROM 可以多次出现。只需在每个新命令 FROM 之前,记录提交上次的镜像 ID。

3、tag 或 digest 是可选的,如果不使用这两个值时,会使用 latest 版本的基础镜像。

RUN 执行命令

RUN 指令在镜像的构建过程中执行特定的命令,并生成一个中间镜像。

RUN 命令将在当前 image 中执行任意合法命令并提交执行结果。命令执行提交后,就会自动执行 Dockerfile 中的下一个指令。

RUN 指令创建的中间镜像会被缓存,并会在下次构建中使用。如果不想使用这些缓存镜像,可以在构建时指定 --no-cache 参数,如:docker build --no-cache

语法格式如下(有两种格式):

1、RUN <命令行命令>
# <命令行命令> 等同于,在终端操作的 shell 命令。

2、RUN ["可执行文件", "参数1", "参数2"]
# 例如:
# RUN ["./test.php", "dev", "offline"] 等价于 RUN ./test.php dev offline

COPY 复制文件

复制指令,从上下文目录中复制文件或者目录到容器里指定路径。

指令从 <源路径1> 复制新的文件或目录,并将它们添加到 Docker 容器文件系统的 <目标路径> 的路径下。

语法格式如下:

COPY [--chown=<user>:<group>] <源路径1>...  <目标路径>
COPY [--chown=<user>:<group>] ["<源路径1>",...  "<目标路径>"]

参数说明:
1、[--chown=<user>:<group>]:可选参数,用户改变复制到容器内文件的拥有者和属组。
2、<目标路径>:容器内的指定路径,该路径不用事先建好,路径不存在的话,会自动创建。
3、<源路径>:源文件或者源目录,这里可以是通配符表达式,其通配符规则要满足 Go 的 filepath.Match 规则。例如
	COPY hom* /mydir/
	COPY hom?.txt /mydir/

ADD 指令和 COPY 指令的格式和性质基本一致,但是在 COPY 基础上增加了一些功能。

1、ADD指令可以让你使用 URL 作为 <源路径1> 参数。当遇到 URL 时候,可以通过 URL 下载文件并且复制到 <目标路径>(容器中目标路径)。
2、ADD的另一个特性是自动解压文件的能力。如果 <源路径1> 参数是一个可识别压缩格式(tar, gzip, bzip2…)的本地文件(注:无法实现同时下载并解压),就会被解压到指定容器文件系统的路径 <目标路径> 下。

CMD

类似于 RUN 指令,用于运行程序,但二者运行的时间点不同:

CMD 在 docker run 时运行,在构建时不进行任何操作。如果 Dockerfile 中如果存在多个 CMD 指令,仅最后一个生效。

RUN 是在 docker build,并生成一个新的镜像。

语法格式如下(有三种格式):

CMD <shell 命令> 

CMD ["<可执行文件或命令>","<param1>","<param2>",...] 

CMD ["<param1>","<param2>",...]  # 该写法是为 ENTRYPOINT 指令指定的程序提供默认参数

推荐使用第二种格式,执行过程比较明确。第一种格式实际上在运行的过程中也会自动转换成第二种格式运行,并且默认可执行文件是sh。

ENTRYPOINT

ENTRYPOINT 用于给容器配置一个可执行程序。也就是说,每次使用镜像创建容器时,通过 ENTRYPOINT 指定的程序都会被设置为默认程序。

类似于 CMD 指令,但其不会被 docker run 的命令行参数指定的指令所覆盖,而且这些命令行参数会被当作参数送给 ENTRYPOINT 指令指定的程序。

但是,如果运行 docker run 时使用了 --entrypoint 选项,将覆盖 ENTRYPOINT 指令指定的程序。

优点:在执行 docker run 的时候可以指定 ENTRYPOINT 运行所需的参数。

注意:如果 Dockerfile 中如果存在多个 ENTRYPOINT 指令,仅最后一个生效。

语法格式如下:

ENTRYPOINT ["<executeable>","<param1>","<param2>",...]
可以搭配 CMD 命令使用:一般是变参才会使用 CMD ,这里的 CMD 等于是在给 ENTRYPOINT 传参。

ENV 设置环境变量

设置环境变量,定义了环境变量,那么在后续的指令中,就可以使用这个环境变量。

语法格式如下(有两种格式):

ENV <key> <value>

ENV <key1>=<value1> <key2>=<value2>...
这个指令很简单,就是设置环境变量而已,无论是后面的其它指令,如 RUN,还是运行时的应用,都可以直接使用这里定义的环境变量。

ENV VERSION=1.0 DEBUG=on \
    NAME="Happy Feet"

ARG

构建参数,与 ENV 作用一致。不过作用域不一样。ARG 设置的环境变量仅对 Dockerfile 内有效,也就是说只有 docker build 的过程中有效,构建好的镜像内不存在此环境变量。
构建命令 docker build 中可以用 --build-arg <参数名>=<值> 来覆盖。

语法格式如下:

ARG <参数名>[=<默认值>]

VOLUME 定义匿名卷

定义匿名数据卷。在启动容器时忘记挂载数据卷,会自动挂载到匿名卷。

EXPOSE

  • 为构建的镜像设置监听端口,使容器在运行时监听(仅仅只是声明端口)。
  • 作用:
    • 帮助镜像使用者理解这个镜像服务的守护端口,以方便配置映射。
    • 在运行时使用随机端口映射时,也就是 docker run -P 时,会自动随机映射 EXPOSE 的端口。

语法格式如下:

EXPOSE <port> [<port>...]

WORKDIR 指定工作目录

指定工作目录。用 WORKDIR 指定的工作目录,会在构建镜像的每一层中都存在。以后各层的当前目录就被改为指定的目录,如该目录不存在,WORKDIR 会帮你建立目录。
docker build 构建镜像过程中的,每一个 RUN 命令都是新建的一层。只有通过 WORKDIR 创建的目录才会一直存在。

语法格式如下:

WORKDIR <工作目录路径>

USER 指定当前用户

用于指定执行后续命令的用户和用户组,这边只是切换后续命令执行的用户(用户和用户组必须提前已经存在)。

语法格式如下:

USER <用户名>[:<用户组>]

HEALTHCHECK

用于指定某个程序或者指令来监控 docker 容器服务的运行状态。

语法格式如下:

HEALTHCHECK [选项] CMD <命令>:设置检查容器健康状况的命令
HEALTHCHECK NONE:如果基础镜像有健康检查指令,使用这行可以屏蔽掉其健康检查指令

HEALTHCHECK [选项] CMD <命令> : 这边 CMD 后面跟随的命令使用,可以参考 CMD 的用法。

https://blog.csdn.net/m0_51913750/article/details/131563704

posted on 2024-09-09 12:06  23云恋49枫  阅读(12)  评论(0编辑  收藏  举报