六、Dockerifle指令记录
什么是Dockerfile
Dockerfile 是一个用来构建镜像的文本文件,文本内容包含了一条条构建镜像所需的指令和说明。Dockerfile其内部包含了一条条的指令,每一条指令构建一层,因此每一条指令的内容,就是描述该层应当如何构建。
简单的Dockerfile案例
Dockerfile结构大致分为四个部分:
- 基础镜像信息
- 维护者信息
- 镜像操作指令
- 容器启动时执行指令
Dockerfile常用指令
指令详解
FORM 指定所创建镜像的基础镜像
格式
<span style="box-sizing: border-box;padding-right: 0.1px">FROM <image> [AS <name>]</span><br></br><span style="box-sizing: border-box;padding-right: 0.1px"># 或</span><br></br><span style="box-sizing: border-box;padding-right: 0.1px">FROM <image>:<tag> [AS <name>]</span><br></br><span style="box-sizing: border-box;padding-right: 0.1px"># 或</span><br></br><span style="box-sizing: border-box;padding-right: 0.1px">FROM <image>@<digest> [as <NAME>]</span>
任何Dockerfile中的第一条指令必须是FROM指令。
ARG 定义创建镜像过程中使用的变量
格式
<span style="box-sizing: border-box;padding-right: 0.1px">ARG <name> [=<default value>]</span><br></br><span style="box-sizing: border-box;padding-right: 0.1px">ARG <参数名>[=<默认值>]</span>
在执行docker build时,可以通过 -build-arg [=] 来为变量赋值。
案例
ARG version=1.0
LABEL 为生成的镜像添加元数据标签信息
格式
LABEL <key>=<value> <key>=<value> ...
案例
<span style="box-sizing: border-box;padding-right: 0.1px">LABEL version="1.0.1"</span><br></br><span style="box-sizing: border-box;padding-right: 0.1px">LABEL author="457969743@qq.com" date="2020-08-09"</span>
EXPOSE 声明镜像内服务监听的端口
格式
EXPOSE <port> [<port>/<protocal>...]
案例
EXPOSE 22 80 8843
该指令只是起到声明作用,并不会自动完成端口映射
ENV 指定环境变量
镜像生成过程中会被后续的RUN指令使用,在镜像启动的容器中也会存在。
格式
ENV <key> <value> 或 ENV <key>=<value> ...
案例
<span style="box-sizing: border-box;padding-right: 0.1px">ENV APP_VERSION=1.0.0</span><br></br><span style="box-sizing: border-box;padding-right: 0.1px">ENV APP_HOME=/home/src</span><br></br><span style="box-sizing: border-box;padding-right: 0.1px">ENV PATH $PATH:/usr/local/bin</span>
ENTRYPOINT 指定镜像的默认入口命令
该入口命令会在启动容器时作为根命令执行,所有传入的值作为该命令的参数。
格式
<span style="box-sizing: border-box;padding-right: 0.1px"># 格式一</span><br></br><span style="box-sizing: border-box;padding-right: 0.1px">ENTRYPOINT ["executable","paraml","param2"]: exec 调用执行;</span><br></br><span style="box-sizing: border-box;padding-right: 0.1px"><span style="box-sizing: border-box"></span></span><br></br><span style="box-sizing: border-box;padding-right: 0.1px"># 格式二</span><br></br><span style="box-sizing: border-box;padding-right: 0.1px">ENTRYPOINT command param1 param2: shell中执行</span>
VOLUME 创建一个数据卷挂在点
格式
VOLUME ["/data"]
案例
VOLUME /www
USER 指定运行容器时的用户名或UID
后续的RUN等指令也会使用指定的用户身份
格式
USER daemon
案例
USER www
WORKDIR 指定工作目录
格式
WORKDIR <工作目录路径>
案例
<span style="box-sizing: border-box;padding-right: 0.1px">WORKDIR /WWW</span><br></br><span style="box-sizing: border-box;padding-right: 0.1px">WORKDIR /home</span>
操作指令
RUN 运行指定指令
格式
<span style="box-sizing: border-box;padding-right: 0.1px">RUN <command></span><br></br><span style="box-sizing: border-box;padding-right: 0.1px"># 或</span><br></br><span style="box-sizing: border-box;padding-right: 0.1px"># 该指令会被解析为JSON数组,因此必须用双引号</span><br></br><span style="box-sizing: border-box;padding-right: 0.1px">RUN ["executable","param1","param2"] </span>
案例
RUN yum -y install vim
CMD 用来指定启动容器时默认执行的命令
格式
<span style="box-sizing: border-box;padding-right: 0.1px"># 方式一 推荐</span><br></br><span style="box-sizing: border-box;padding-right: 0.1px">CMD ["executable","param1","param2"]</span><br></br><span style="box-sizing: border-box;padding-right: 0.1px"><span style="box-sizing: border-box"></span></span><br></br><span style="box-sizing: border-box;padding-right: 0.1px"># 方式二</span><br></br><span style="box-sizing: border-box;padding-right: 0.1px">CMD command param1 param2</span><br></br><span style="box-sizing: border-box;padding-right: 0.1px"><span style="box-sizing: border-box"></span></span><br></br><span style="box-sizing: border-box;padding-right: 0.1px"># 方式三</span><br></br><span style="box-sizing: border-box;padding-right: 0.1px">CMD ["param1","param2"]</span>
每个Dockerfile只能有一条CMD命令。若有多个,则执行最后一个
ADD 添加内容到镜像
格式
ADD <src> <dest>
案例
ADD nginx /usr/local/src
该命令将复制指定的<src>路径下内容到容器中的<dest>路径下。
其中<src>可以是Dockerfile所在目录的一个相对路径(文件或目录);也可以是一个URL;
COPY 复制内容到镜像
格式
COPY <src> <dest>
案例
COPY nginx /usr/local/src
复制本地主机的<src>(为Dockerfile所在目录的相对路径,文件或目录)下内容到镜像中的<dest>。目录路径不存在,则自动创建。
我是夕阳何处寻,期待和优秀的你一起同行!
夕阳何处寻
2020年08月10日
请登录后再评论