第五章:Dockerfile

[TOC]

常见关键词

  • FROM:在Dockerfile中第一条非注释INSTRUCTION一定是FROM,它决定了以哪一个镜像作为基准,首选本地是否存在,如果不存在则会从公共仓库下载(当然也可以使用私有仓库的格式)。

  • MAINTAINER :使用MAINTAINER指令来为生成的镜像署名作者

  • LABEL:指定label,设置之后,使用docker inspect来查看

      [root@host mysql]# docker inspect mysql |sed -n '/Labels/,/}/p'
                  "Labels": {
                      "build-date": "2019-03-15",
                      "image": "mysql-5.7",
                      "org.label-schema.build-date": "20181205",
                      "org.label-schema.license": "GPLv2",
                      "org.label-schema.name": "CentOS Base Image",
                      "org.label-schema.schema-version": "1.0",
                      "org.label-schema.vendor": "CentOS",
                      "vendor": "fangdm"
                  }
  • WORKDIR:WORKDIR指令用于设置Dockerfile中的RUN、CMD和ENTRYPOINT指令执行命令的工作目录(默认为/目录)。

  • USER:和 WORKDIR 一样,USER 只是帮助你切换到指定用户而已,这个用户必须是事先建立好的,否则无法切换。

  • VOLUME:定义匿名卷。为了防止运行时用户忘记将动态文件所保存目录挂载为卷,在 Dockerfile 中,我们可以事先指定某些目录挂载为匿名卷,这样在运行时如果用户不指定挂载,其应用也可以正常运行,不会向容器存储层写入大量数据。

  • COPY:复制文件

  • ADD:比COPY更高级,会自动下载或者自动解压,如果 <源路径> 为一个 tar 压缩文件的话,压缩格式为 gzip, bzip2 以及 xz 的情况下,ADD 指令将会自动解压缩这个压缩文件到 <目标路径> 去。

  • ENV 设置环境变量,也是可以使用docker inspect查的。当然进入系统之后,使用env命令也是可以输出的。

      [root@host mysql]# docker inspect mysql |sed -n '/"Env"/,/]/p'
                  "Env": [
                      "PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin",
                      "REPO_URL=https://repo.mysql.com//mysql57-community-release-el7-11.noarch.rpm",
                      "MYSQL_ROOT_PASSWORD=**Random**",
                      "MYSQL_VERSION=5.7",
                      "MYSQL_USER=mysql",
                      "MYSQL_GROUP=mysql"
  • ARG 构建参数:和 ENV 的效果一样,都是设置环境变量。所不同的是,ARG 所设置的构建环境的环境变量,在将来容器运行时是不会存在这些环境变量的。

  • RUN:在当前镜像的顶层执行任何命令,并commit成新的(中间)镜像。第一种为shell格式,exec格式,不会触发shell,所以$HOME这样的环境变量无法使用。

      RUN <commnad>  
    
      RUN ["executable", "param1", "param2"]
  • ENTRYPOINT:设置在容器启动时执行命令,如果有多个ENTRYPOINT指令,那只有最后一个生效。

  • CMD指令的主要功能是在build完成后,为了给docker run启动到容器时提供默认命令或参数,这些默认值可以包含可执行的命令,也可以只是参数(此时可执行命令就必须提前在ENTRYPOINT中指定)。它与ENTRYPOINT的功能极为相似,区别在于如果docker run后面出现与CMD指定的相同命令,那么CMD会被覆盖;而ENTRYPOINT会把容器名后面的所有内容都当成参数传递给其指定的命令(不会对命令覆盖)。另外CMD还可以单独作为ENTRYPOINT的所接命令的可选参数。

  • EXPOSE:指令告诉容器在运行时要监听的端口,但是这个端口是用于多个容器之间通信用的(links),外面的host是访问不到的。要把端口暴露给外面的主机,在启动容器时使用-p选项。

  • .dockerignore:这个文件用来忽略上下文目录中包含的一些image用不到的文件,它们不会传送到docker daemon。

http://seanlook.com/2014/11/17/dockerfile-introduction/

Last updated

Was this helpful?