1、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
标签:RUN,CMD,指定,学习,指令,格式,镜像,Dockerfile From: https://www.cnblogs.com/luxiaojun/p/18404301