dockerfile指令介绍
DOCKERFILE指令:CMD,ENTRYPOINT,ADD,COPY,VOLUME,WORKDIR,USER,ONBUILD,ENV等
1.CMD:用于指定一个容器启动时要运行的命令。类似于RUN指令,只是RUN指令是指定镜像被构建时的命令,而CMD是指容器被启动时要运行的命令
docker run -i -t zhoufujin/apache /bin/true 和 CMD ["/bin/true"] 等效
这里需要注意:使用docker run命令可以覆盖CMD指令。如果我们在Dockerfile中指定了CMD指令,同时在docker run中也指定了要运行的命令。命令行中的命令会覆盖dockerfile中的CMD指令
在dockerfile中只能指定一条CMD指令。如果指定了多条CMD指令,也只有最后一条CMD指令会被使用。如果想在启动容器时运行多个进程或多条命令,可以考虑使用类似的supervisor的服务管理工具。
2.ENTRYPOINT :ENTRYPOIN指令提供的命令不容易在启动容器时被覆盖。实际上,在docker run命令行中指定的任何参数都会被当做参数再次传递给ENTRYPOIN指定中指定的命令。
ENTRYPOINT ["/usr/sbin/nginx", "-g" "daemon off;"]
如果需要,我们可以在运行时通过docker run的--entrypoint标志覆盖ENTRYPOINT指令
3.WORKDIR:用来在从镜像创建一个新容器时,在容器内部设置一个工作目录。ENTRYPOINT,CMD指定的程序都会 在这个目录中执行。
可以通过-w 标志在运行时覆盖工作目录
4.ENV:用来设置在镜像构建过程中的环境变量
例:ENV TARGET_DIR /opt/app
WORKDIR $TARGET_DIR
设置环境变量,WORKDIR引用环境变量
也可以使用docker run命令行中的 -e标志来传递环境变量
5.USER:用来指定该镜像以什么样的用户去运行
也可以在docker run 中通过-u选项来覆盖指定指令的值。
6.VOLUME:用来向基于镜像创建的容器添加卷。
卷功能,可以让我们将数据(如源代码),数据库或者其他内容添加到镜像中,而不是将这些内容提交到镜像汇总,并且运行我们在多个容器中共享
这些内容
例:VOLUME ["/opt/project"] 这条指令将会为基于此镜像创建的任何容器创建一个名为/opt/project的挂载点、
7.ADD:用来将构建环境下的文件和目录复制到镜像中。
不能对构建目录或者上下文之外的文件进行操作
ADD software.lic /opt/project/software.lic 这里的ADD指令会将构建目录下的software.lic复制到镜像中的/opt/project/software.lic
在ADD文件时,docker通过目的地址参数末尾的字符来判断文件源是目录还是文件。如果以/结尾就是目录,如果不是就是文件!
值得一提的一个ADD功能:如果将一个归档文件(gzip,bzip2,xz)指定为源文件,docker将会自动将归档文件解开
如:ADD latest.tar.gz /var/www/wordpress/
这条命令会将归档文件latest.tar.gz解开到/var/www/wordpress/ 中。如果目的位置不存在的话,docker将会为我们创建这个全路径,新创建的而文件和目录的模式为0755,并且uid和gid都是0.
8.COPY:类似于ADD,他们的根本不同是COPY 只关心在结构上下文中复制本地文件,而不会去做文件提取和解压的工作。
例:
COPY conf.d/ /etc/apache2/ 这条指令将会将本地conf.d目录 中的文件复制到/etc/apache2/
这里注意:文件路径必须是一个与当前构建环境相对应的文件或者目录,本地文件都放到和Dockerfile同一个目录下。COPY指令的目的位置必须是容器内的一个绝对路径。
任何由该指令创建的文件或者目录的uid和gid都会设置为0.
如果源文件是一个目录,那么这个目录将整个被复制到容器中,包括文件系统元数据。如果源文件为任何类型的文件,则该文件会随同元数据一起被复制。如果目的位置不存在,docker将会自动创建所有需要的目录结构。
9:ONBUILD:为镜像添加触发器。当一个镜像被用作其他镜像的基础镜像时,改镜像中的触发器将被执行。
触发器可以是任何构建指令
ONBUILD RUN cd app/src
ONBUILD 触发器会按照在父镜像中指定的顺序执行,并且只能被继承一次(也就是只能在子镜像中执行,而不会再孙子镜像中运行)