当前位置: 首页 > 后端技术 > Java

什么是java开发的Dockerfile

时间:2023-04-01 13:47:05 Java

Dockerfile是构建docker镜像的基础文件。文件里面有几个指令:from,maintainer,expose,env,user,workdir,copy,add,run,cmd,entrypoint,volume,onbuild。所有命令都将在上一个命令创建的图像的基础上执行。entrypoint和cmd命令只有在容器java训练真正运行的时候才会执行。下面我们一一介绍每个命令的具体含义和用法:?FROM的基本格式:FROMimageURL:获取基础镜像的基本格式:?MAINTAINER维护者信息?EXPOSE暴露容器中的端口?ENV基础格式:ENVJAVA_HOME/user/home/jdk1.8设置环境变量,其他指令参考环境变量生效?USER基本格式:USER用户名指定容器运行时的用户?WORKDIR基本格式:WORKDIRdirectory绝对路径相当于linuxcd命令?ONBUILD如果其他镜像是基于这个镜像构建的,那么其他镜像在构建时也会执行这个命令?COPY基本格式:COPY复制宿主目录下的文件(src)到图像目录(dest)。需要注意的是,src路径必须是当前dockerfile目录下的相对路径。不能写../xxx/,/Users/dockeruser/xxx/xx,镜像目录必须是绝对路径?ADD基本格式:ADD与COPY命令功能相同,只是ADD命令还有如果附加2个功能复制出来的文件是压缩文件,可以自动解压src。不一定是宿主机的目录,可以是网络文件(http://www.bjcoder.com/file)?RUN基本格式:RUN或RUN["executable","param1","param"]执行RUN命令时,会根据之前的镜像创建一个容器,然后在容器上执行这条命令。该命令执行后,容器将作为一个新的镜像提交,以供下一个命令使用。RUN该类型的格式是调用容器中的shell命令。如果shell命令太长,可以用\包起来RUN["executable.sh","param1","param"]在容器中执行与dockerfile同目录下的shell脚本。?CMD基本格式CMDorCMD["executable","param1","param2"]orCMD["param1","param2"]CMD命令只会在我们每次运行容器时执行,在Dockerfile允许指定多个CMD命令,但只有一个会生效。CMD该类型的格式是调用容器中的shell命令。CMD["executable.sh","param1","param2"]在容器中执行shell脚本。CMD["param1","param2"]与ENTRYPOINT命令配合使用,主要是为其提供参数。如果我们在dockerruncontainer/bin/bashxx中指定命令参数,那么它将覆盖CMD命令。?ENTRYPOINTENTRYPOINTorENTRYPOINT["executable","param1","param2"]每次运行容器时,也会执行ENTRYPOINT命令。Dockerfile允许指定多个ENTRYPOINT命令,但只有一个会生效。由于CMD和ENTRYPOINT命令的功能相似,将它们结合起来会是什么样子呢?我们根据具体情况进行讨论。ENTRYPOINT使用该类型时,所有CMD命令均无效,包括dockerrun传入的命令参数。ENTRYPOINT["executable","param1","param2"]当使用这种格式时,CMD命令将附加到ENTRYPOINT的命令参数中。?VOLUME基本格式VOLUME["path1","path2"]将docker创建的数据卷挂载到指定路径(容器目录)。该命令不能指定数据卷的路径,docker容器在构建镜像时默认会自动创建一个数据卷并挂载到该路径。之所以VOLUME命令不允许我们指定挂载的目录,是为了保证docker镜像的可移植性,因为我们不能保证每台机器都会有我们指定的目录。我们可以通过命令dockerinspect查看容器中的目录对应的是哪个数据卷。如果我们想把宿主机的指定目录作为数据卷挂载到容器的指定目录,怎么办呢?使用以下命令执行:dockerrun-vhostdirectorypath:容器中要挂载的目录路径。为了更直观地理解数据卷、主机目录和容器目录之间的关系,请参考图1-1。docker提供的数据卷有什么用?因为只要删除docker容器,容器之前运行的数据就会被删除。引入数据卷后,我们可以保证容器中的数据不会丢失,因为数据卷的生命周期是独立于docker容器的。