Dockerfile是一个构建docker镜像的根底文件,文件外部严格标准了几个指令: from、maintainer、expose、env、user、workdir、copy、add、run、cmd、entrypoint、volume、onbuild。所有指令都会再上一个指令创立进去的镜像根底上执行,其中entrypoint和cmd指令只有在真正运行容器java培训的时候才执行。上面咱们逐个介绍每个指令的具体含意和用法:
• FROM 根本格局:FROM imageURL:< tag >
获取根底镜像 根本格局:
• MAINTAINER维护者信息
• EXPOSE裸露容器中的端口
• ENV 根本格局:ENV JAVA_HOME /user/home/jdk1.8
设置环境变量,前面其余指令援用该环境变量都是失效的
• USER 根本格局:USER 用户名
指定容器运行时的用户
• WORKDIR 根本格局:WORKDIR 目录绝对路径
相当于 linux中的cd 命令
• ONBUILD如果其它镜像是基于此镜像进行构建的,那么其它镜像在构建时会执行该指
• COPY 根本格局:COPY < src > < dest >将宿主机目录(src)下的文件 复制到镜像目录(dest)。须要留神的是src门路必须是以后dockerfile目录下的相对路径。不能写../xxx/ 、/Users/dockeruser/xxx/xx,镜像目录必须是绝对路径
• ADD 根本格局:ADD < src > < dest >和COPY指令的性能是一样的,只不过ADD指令还有额定的2项性能
- 复制的文件如果是压缩文件,可能主动解压
- src 不肯定是宿主机的目录,能够是网络文件(http://www.bjcoder.com/file)
• RUN 根本格局: RUN或者 RUN ["executable","param1","param"]RUN指令执行时会基于上一个镜像创立出一个容器,而后在该容器上执行此指令,指令执行结束后,将该容器又提交为一个新的镜像,供下一个指令应用。
RUN < command > 此类型的格局,就是在容器中调用shell命令,如果shell命令过长可通过 \ 进行 换行
RUN ["executable.sh","param1","param"] 在容器中执行dockerfile同目录下的shell脚本。
• CMD 根本格局 CMD < command > 或者 CMD ["executable","param1","param2"] 或者 CMD ["param1","param2"]CMD指令只会在咱们每次运行容器的时候执行,Dockerfile中容许指定多个CMD指令,然而只会有一个失效。CMD < command > 此类型的格局,就是在容器中调用shell命令。
CMD ["executable.sh","param1","param2"] 执行容器中的shell脚本。
CMD ["param1","param2"] 它是联合 ENTRYPOINT命令应用的,次要是为它提供参数的。如果咱们在docker run container /bin/bash xx 指定了命令参数那么将会笼罩CMD指令。
• ENTRYPOINT ENTRYPOINT < command > 或者 ENTRYPOINT ["executable","param1","param2"]ENTRYPOINT指令也是在咱们每次运行容器的时候执行,Dockerfile中容许指定多个ENTRYPOINT指令,然而只会有一个失效。因为CMD和ENTRYPOINT命令性能类似,那么它们两者联合又会是什么样的呢?咱们分状况进行探讨。ENTRYPOINT < command > 当应用此类型,所有CMD指令都有效,包含 docker run 传入的命令参数。
ENTRYPOINT ["executable","param1","param2"] 当应用此类的格局,CMD指令会附加到ENTRYPOINT的指令参数中。
• VOLUME 根本格局 VOLUME ["path1","path2"]将docker创立的数据卷挂载到指定的path(容器目录)。此指令不能指定数据卷的门路,docker容器在构建镜像的时候会默认主动创立一个数据卷挂载到path上。VOLUME的指令之所以不让咱们指定挂载的目录,是为了保障docker镜像的可移植性,因为咱们并不能保障每台机器都会有咱们指定的目录,咱们能够通过命令docker inspect 查看容器中的目录具体对应了哪个数据卷。如果咱们想要宿主机的指定目录作为数据卷挂载到容器的指定目录,如何操作呢?通过以下命令执行:docker run -v 宿主机目录门路:容器内需挂载目录门路。为了更直观的意识数据卷、宿主机目录、容器目录之间的关系请看图1-1
docker提供的数据卷有什么用呢?因为docker容器只有一删除,那么容器之前运行的数据将会被删除,引入了数据卷后咱们能够保障容器的数据不失落,因为数据卷的生命周期是独立于docker容器存在的。