前言

好记性不如烂笔头,边学边记,学完基础语法后,最少你能看得懂一个 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

用法:

  1. shell 格式:CMD <命令>
  2. exec 格式:CMD ["可执行文件", "参数1", "参数2"...]
  3. 参数列表格式: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),以键值对的形式。


code_shuai
818 声望32 粉丝

love money = love code