Dockerfile构建相关指令解释

Dockerfile构建相关指令解释

Dockerfile构建相关指令解释

  • FROM 指令

FROM指令是最重要的一个且必须为dockerfile文件开篇的第一个非注释行,用于为映像文件构建过程指令指定基准镜像,后续的指令运行于此基准镜像所提供的运行环境。

实践中,基准镜像可以是任何可用镜像文件,默认情况下,docker build会在docker主机上查找指定的镜像文件,在其存在时,则会从Docker Hub Registry上拉取所需的镜像文件。

如果找不到指定的镜像文件,dokker build会返回一个错误信息

Syntax

FROM <repository仓库>[:<tag>标签]或

FROM <repository仓库>@<digest>

  •     <repository仓库>:指定作为仓库可使用的镜像名称;
  • <tag>:base image 的标签,为可选项,省略时默认为latest;

FROM 实验

指定基础镜像

FROM centos:latest
  • MAINTANIER指令

  • 用于让dockerfile制作者提供本人的详细信息
  • dockerfile并不限制MAINTANIER指令可在出现位置,但推荐将其放置于FROM指令之后
  • Syntax
  •     MAINTANIER <auhtor's detail>
  • <auhtor's detail>可是任何文本信息,但约定俗成地使用作者名称及邮件地址

MAINTANIER 实验

注释写入dockerfile写信息介绍

 

FROM centos:latest
MAINTAINER "NaMe ZengFangQuan <blog www.gylinux.cn>"
  • LABEL指令

LABEL 实验

定义一些元数据信息,比如作者、版本、关于镜像的描述信息

FROM centos:latest
LABEL maintainer="ZengFangQuan <zengfq8008606262@163.com>"  description="Install tree vim*"
  • COPY指令

用于从Docker主机复制文件至创建的新映像文件

Syntax

COPY <src>...<dest>或

COPY ["<src>"..."<dest>"]

<src>:    要复制源文件或目录,支持使用通配符

<dest>:目录路径,即在创建的image的文件系统路径;建议为<dest>使用绝对路径,否则,COPY指定则以workdir为起始路径;

注意:在路径中有空白字符时,通常使用第二种格式

文件复制准则

<src>必须是build上下文中的路径,不能为是其他父目录中的文件

如果<src>是目录,则其内部文件或子目录会被递归复制,但<src>目录自身不会被复制

如果指定了多个<src>,或在<src>中使用了统配符,则<dest>必须是一个目录,且必须以/结尾

如果<dest>事先不存在,它将会自动创建,这包括其父目录路径

COPY 实验

1、拷贝文件到指定容器文件

FROM centos:latest
LABLE NaMe="ZengFangQuan" Blog="www.gylinux.cn" Emil="Zengfq_8008606262@163.com"
COPY index.html /usr/local/nginx/html/

2、如果<src>是源目录,则其内部文件或子目录会被递归复制,但<src>源目录自身不会被复制,只复制源目录以下内容到指定路径。

FROM centos:latest
LABEL NaMe="ZengFangQuan" Blog="www.gylinux.cn" Emil="Zengfq_8008606262@163.com"
COPY /etc/yum.repos.d /etc/yum.repos.d/
  • ADD 指令

ADD指令类似于COPY指令,ADD支持使用TAR文件和URL路径

Syntax

ADD <src>...<dest>或

ADD ["<src>"..."<dest>"]

操作准则

同copy指令

如果<src>为URL且<dest>不以/结尾,则 <src>指定的文件将被下载并直接被创建为<dest>;如果以<dest>/结尾,则文件名URL指定的文件将被直接下载并保存为 <dest>/<filename>

如果 <src>是一个本地系统上的压缩格式的tar文件,它将被展开为一个目录,其行为类似于“tar -x”命令;然而,通过URL获取到的tar文件将不会自动展开;

如果 <src>有多个,或其间接或直接使用了通配符,则 <dest>必须是一个以/结尾的目录路径;如果 <dest>不以/结尾,则其被视作一个普通文件, <src>的内容将被直接写入到 <dest>。

ADD实验

  • 如果<src>为URL且<dest>不以/结尾,则 <src>指定的文件将被下载并直接被创建为<dest>;如果以<dest>/结尾,则文件名URL指定的文件将被直接下载并保存为 <dest>/<filename>
FROM centos:latest
LABEL NaMe="ZengFangQuan" Blog="www.gylinux.cn" Emil="Zengfq_8008606262@163.com"
COPY index.html /usr/local/nginx/html/
ADD https://dev.mysql.com/get/Downloads/MySQL-8.0/mysql-8.0.18-linux-x86_64-minimal.tar /usr/local/

说明:通过URL方式下载MySQL保存到镜像当中/usr/local/下并不解压。

 

  • 如果 <src>是一个本地系统上的压缩格式的tar文件,它将被展开为一个目录,其行为类似于“tar -x”命令;然而,通过URL获取到的tar文件将不会自动展开;
FROM centos:latest
LABEL NaMe="ZengFangQuan" Blog="www.gylinux.cn" Emil="Zengfq_8008606262@163.com"
COPY index.html /usr/local/nginx/html/
ADD mysql-5.7.22-linux-glibc2.12-x86_64.tar.gz /usr/local/

说明:如果源文件和Dockerfile在同一级子目录首先拷贝文件MySQL到镜像指定的路径下并且解压为

mysql-5.7.22目录。

  • WORKDIR 指令

用于为dockerfile中所有的RUN\CMD\ENTRYPOINT\COPY\ADD指定设定工作目录

Syntax

workdir <dirpath>

在dockerfile文件中 ,workdir指令可出现多次,其路径也可为相对路径,不过,其是相对此前一个workdir指令指定的路径

另外,workdir也可调用有ENV指定定义的变量

例如:

workdir /var/log/

workdir $STATEPATH

 

WORKDIR 实验

FROM centos:latest
LABEL NaMe="ZengFangQuan" \
Blog="www.gylinux.cn" \
Emil="Zengfq_8008606262@163.com"
COPY index.html /usr/local/nginx/html/
WORKDIR /usr/
ADD mysql-5.7.22-linux-glibc2.12-x86_64.tar.gz ./local/

说明:意思是将本地MySQL拷贝到/usr/local下的文件当中并且解压为mysql-5.7.22的目录

 

  • VOLUME指令

用于在image中创建一个挂载点目录,以挂载docker host上的卷或其他容器的卷

syntax

VOLUME <mountpoint>或

VOLUME ["mountpoint"]

如果挂载点目录路径下此前在文件存在,docker run 命令会在卷挂载完成后将此前的所有文件复制到新挂载的卷中。

VOLUME实验

FROM centos:latest
LABEL NaMe="ZengFangQuan" Blog="www.gylinux.cn"
VOLUME /data/mysql/mysql3306/data/ \
      /data/mysql/mysql3306/tmp/  \
      /data/mysql/mysql3306/logs/

 

  • EXPOSE

用于为容器打开指定要监听的端口以实现与外部通信

Syntax

EXPOSE <post>[/protocol>][<port>][<protocol>]...]

<protocol>用于指定传输层协议,可为tcp或udp二者之一,默认为TCP协议

EXPOSE指令可一次指定多个端口,例如:

EXPOSE实验

FROM centos:latest
LABEL NaMe="ZengFangQuan" Blog="www.gylinux.cn"
VOLUME /data/mysql/mysql3306/data/ \
      /data/mysql/mysql3306/tmp/  \
      /data/mysql/mysql3306/logs/
EXPOSE 3306/tcp

 

ENV指令

用于为镜像定义所需的环境变量,并可被dockerfile文件中位置于其后的其他指令(ENV\ADD\COPY等)所调用

调用格式为$variable_name或${variable_name}

Syntax

  • ENV <key><value>或
  • ENV <key>=<value>...

第一种格式中,<key>之后的所有内容均会被视作其<value>的组成部分,因此,一次只能设置一个变量;

第二种格式可用一次设置多个变量,每个变量为一个"<key>=<value>"的键值对,如果<value>种包含空格,可以反斜线(\)进行转义,也可通过对<value>加引号进行标识;另外,反斜线也可以用于学行;

定义多个变量,建议实验第二种方式,以便在同一层中完成所有功能

  • 我的微信
  • 这是我的微信扫一扫
  • weinxin
  • 我的微信公众号
  • 我的微信公众号扫一扫
  • weinxin
百度已收录
Linux

发表评论

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen: