前言
好记性不如烂笔头,边学边记,学完基础语法后,最少你能看得懂一个 Dockfile 干了哪些事儿。折腾起来。
作用
Dockfile 是一个用来构建镜像的文本文件,在一个项目中如果有此文件,语法正确,就可以使用命令(docker build -t name:tag .)来构建一个镜像了.
1.FROM
语法: FROM <image>
eg: FROM node:14.17.0 // 指定node 14.17.0 版本
解释: 指定一个构建镜像的基础源镜像,如果本地没有就会从公共仓库中拉取,没有指定镜像的标签会使用默认的latest 标签。 必须有。
2.WORKDIR
语法: WORKDIR <工作目录路径>
eg: WORKDIR /usr/src/app
解释:指定工作目录。用 WORKDIR 指定的工作目录,会在构建镜像的每一层中都存在。(WORKDIR 指定的工作目录,必须是提前创建好的)。
docker build 构建镜像过程中的,每一个 RUN 命令都是新建的一层。只有通过 WORKDIR 创建的目录才会一直存在。
3.MAINTAINER
语法: MATAINER <name> <email>
eg: MATAINER test test@163
解释:描述镜像的创建者,名称和邮箱。不是必须的。
4.RUN
用法: RUN "command" "param1" "param2"
eg: RUN yarn install
描述:运行一个命令,比如依赖的安装,脚本的执行等。RUN 命令可以有多个,但是可以用 && 连接多个命令来减少层级。例如
RUN npm install && cd /app && mkdir logs
注意: Dockerfile 的指令每执行一次都会在 docker 上新建一层。所以过多无意义的层,会造成镜像膨胀过大。所以多个 RUN 可以使用 && 连接。
// 如 这里会创建 3 层镜像
FROM centos
RUN yum -y install wget
RUN wget -O redis.tar.gz "http://download.redis.io/releases/redis-5.0.3.tar.gz"
RUN tar -xvf redis.tar.gz
// 简化后 创景一层
FROM centos
RUN yum -y install wget \
&& wget -O redis.tar.gz "http://download.redis.io/releases/redis-5.0.3.tar.gz" \
&& tar -xvf redis.tar.gz
5.CMD
用法:
- shell 格式:CMD <命令>
- exec 格式:CMD ["可执行文件", "参数1", "参数2"...]
- 参数列表格式:CMD ["参数1", "参数2"...]。在指定了 ENTRYPOINT 指令后,用 CMD 指定具体的参数。
eg: CMD cd /app && ./start.sh
描述:CMD 指令只能一个,是容器启动后执行的命令,算是程序的入口。CMD 在一个Dockfile 中只能出现一次,写了多个只会执行最后一个,作用是在启动容器的时候提供一个默认的命令,如果用户执行docker run 时提供了命令项会覆盖掉文件内的命令,没有提供就会使用此命令。 如果需要执行多个命令 可以 使用 & 链接.CMD 在docker run 时运行。RUN 是在 docker build。
6.COPY (ADD 命令效果一样)
用法:COPY [--chown=<user>:<group>] <源路径1>... <目标路径>
eg: COPY hom?.txt /mydir/
描述:复制指令,从上下文目录中复制文件或者目录到容器里指定路径。<目标路径>:容器内的指定路径,该路径不用事先建好,路径不存在的话,会自动创建。
7.ENTRYPOINT
用法:ENTRYPOINT ["<executeable>","<param1>","<param2>",...]
eg: ENTRYPOINT ["nginx", "-c"] # 定参
描述:类似于 CMD 指令,但其不会被 docker run 的命令行参数指定的指令所覆盖,而且这些命令行参数会被当作参数送给 ENTRYPOINT 指令指定的程序。但是, 如果运行 docker run 时使用了 --entrypoint 选项,将覆盖 ENTRYPOINT 指令指定的程序。在执行 docker run 的时候可以指定 ENTRYPOINT 运行所需的参数。如果 Dockerfile 中如果存在多个 ENTRYPOINT 指令,仅最后一个生效。
8.ENV
用法:ENV <key> <value>
eg: ENV NODE_VERSION 14.17.0
描述:置环境变量,定义了环境变量,那么在后续的指令中,就可以使用这个环境变量。
9.ARG
用法:ARG <参数名>[=<默认值>]
eg: ARG NODE_VERSION 14.17.0
描述:构建参数,与 ENV 作用一致。不过作用域不一样。ARG 设置的环境变量仅对 Dockerfile 内有效,也就是说只有 docker build 的过程中有效,构建好的镜像内不存在此环境变量。构建命令 docker build 中可以用 --build-arg <参数名>=<值> 来覆盖.
10.VOLUME
用法:
1.VOLUME ["<路径1>", "<路径2>"...]
2.VOLUME <路径1>
eg:
描述:定义匿名数据卷。在启动容器时忘记挂载数据卷,会自动挂载到匿名卷。避免重要的数据,因容器重启而丢失,这是非常致命的。避免容器不断变大。
11.EXPOSE
用法:EXPOSE <端口1> [<端口2>...]
eg: EXPOSE 8080:80
描述: 帮助镜像使用者理解这个镜像服务的守护端口,以方便配置映射。在运行时使用随机端口映射时,也就是 docker run -P 时,会自动随机映射 EXPOSE 的端口。
12.HEALTHCHECK
用法:
1.HEALTHCHECK [选项] CMD <命令>:设置检查容器健康状况的命令
2.HEALTHCHECK NONE:如果基础镜像有健康检查指令,使用这行可以屏蔽掉其健康检查指令
3.HEALTHCHECK [选项] CMD <命令> : 这边 CMD 后面跟随的命令使用,可以参考 CMD 的用法。
描述: 用于指定某个程序或者指令来监控 docker 容器服务的运行状态。
13.LABEL
用法: LABEL <key>=<value> <key>=<value> <key>=<value> ...
eg: LABEL org.opencontainers.image.authors="runoob"
描述: LABEL 指令用来给镜像添加一些元数据(metadata),以键值对的形式。
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。