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项功能
  1. 复制的文件如果是压缩文件,能够自动解压
  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的java容器中用命令启动jar包失败_数据

docker提供的数据卷有什么用呢?因为docker容器只要一删除,那么容器之前运行的数据将会被删除,引入了数据卷后我们可以保证容器的数据不丢失,因为数据卷的生命周期是独立于docker容器存在的。