dockerfile指令介绍

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 触发器会按照在父镜像中指定的顺序执行,并且只能被继承一次(也就是只能在子镜像中执行,而不会再孙子镜像中运行)


你可能感兴趣的:(docker,指令介绍)