使用Dockerfile

docker build [选项] <上下文路径/URL/->

其他构建方法

直接用Git repo 进行构建

用给定的tar压缩包构建

从标准输入中读取Dockerfile进行构建

从标准输入中读取上下文压缩包进行构建

FROM指定基础镜像

是必备指令,必须是第一条指令

FROM就是指定基础镜像

LABEL

镜像添加标签来帮助组织镜像、记录许可信息、辅助自动化构建等

一个镜像可以包含多个标签,但建议将多个标签放入到一个 LABEL 指令中

RUN 执行指令

  • shell 格式 RUN 命令

  • exec格式 RUN ["可执行文件","参数1","参数2"]

支持Shell类的行尾添加 \ 的命令换行 首位#进行注释

最后添加清理工具的命令,删除为了编译所构建所需的软件

COPY复制文件

  • COPY <源路径>...<目标路径>

  • COPY ["<源路径1>",..."<目标路径>"]

ADD更加高级的复制文件

<源路径> 可以是一个URL,这种情况下会去下载这个链接文件放到<目标路径>去,并设置文件权限为600

如果<源路径> 为一个tar 压缩文件的话,压缩格式为gzip,bzip2以及xz

CMD容器启动命令 (只可出现一次)

  • shell 格式 CMD <命令>

  • exec 格式 CMD ["可执行文件","参数1","参数2"....]

  • 参数列表格式 CMD ["参数1","参数2"... ]. 在指定了ENTRYPOINT指令后,用CMD指定具体的参数

CMD指令就是用于指定默认的容器主进程的启动命令

在运行时可以指定新的命令来替代镜像设置中的这个默认名利

shell格式 相当于 exec格式 CMD ["sh","-c","shell 命令"]

ENTRYPOINT 入口点(只可出现一次)

是将CMD的内容作为参数传给ENTRYPOINT

<ENTRYPOINT> "<CMD>"

  • 使用CMD时加个参数可能会遇到报错 希望在容器运行,就必须重新输入完整命令

使用ENTRYPOINT 就可以避免

  • 启动容器就是启动主进程,有些时候,启动主进程前,需要一写准备工作

可以将这些预处理的工作写成一个脚本,放在ENTRYPOINT中执行

ENV 设置环境变量

  • ENV <key><value>

  • ENV <key1>=<value1><key2>=<value2>

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

ARG 构建参数

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

构建参数和ENV 的效果一样,都是设置环境变量

ARG所设置的构建环境的环境变量,在将来容器运行时是不会存在这些环境变量的

VOLUME 定义匿名卷

VOLUME ["<路径1>","<路径2>"...]

VOLUME <路径>

事先制定某些目录挂载为匿名卷

EXPOSE 声明端口

EXPOSE <端口1>[<端口2>...]

声明运行容器提供服务端口。

-p 是映射宿主机端口和容器端口,就是将容器对应端口服务公开给外界访问

EXPOSE仅仅是声明容器打算使用什么端口

WORKDIR 指定工作目录

WORKDIR <工作目录路径>

WORKDIR 指令可以来指定工作目录(当前目录)目录不存在,会自动建立

USER 指定当前用户

USER <用户名>

切换到指定用户,这个用户必须是事先建立好的,否则无法切换

HEALTHCHECK 健康检查 (只可出现一次)

HEALTHCHECK [选项] CMD <命令> 设置检查容器健康状态的命令

HEALTHCHECK NONE 屏蔽掉基础镜像健康检查指令

设置好后 启动容器,初始状态为starting 在指令检查成功后 变为 healthy 有一定次数失败变为unhealthy

--interval=<间隔> 两次健康检查的间隔,默认30S

--timeout=<时长> 健康检查命令运行超时时间,如果超过这个时间,本次健康检查就被视为失败,默认30秒

--retries=<次数> 当连续失败指定次数后,则将容器是为unhealthy,默认3次

分为 shell 格式 和 exec 格式

命令的返回值决定健康检查的成功与否 0:成功 1:失败 2:保留

ONBUILD 为他人做嫁衣

ONBUILD <其它指令> 比如 RUN COPY  等

在当前镜像构建时并不会被执行,只有被当成基础镜像去构建下一级镜像的时候才会被执行