当前位置: 首页 > 科技观察

Dockerfile:Docker中用来构建镜像的文本文档

时间:2023-03-13 18:13:07 科技观察

我们在开发JavaEE的时候,经常会使用Maven或者Gradle来进行包管理。当我们需要某个包时,只需要在Maven或Gradle中添加唯一的包名即可。logo,这个包可以从远程仓库拉到本地,搭建私服的也会先从私服拉包。当我们自己封装一个比较好的包的时候,我们也可以通过这些工具推送到远程仓库。正好,Docker镜像的pulling或者pushing都是一样的原理。通过前两章的讲解,相信大家对Docker的相关概念和常用命令有了基本的了解,也知道了如何远程拉取镜像。远程镜像是怎么来的呢?如果我们想自己创建一个镜像怎么办呢?今天就来说说Dockerfile吧!Dockerfile是一个文本文档,包含了用户可以构建镜像的所有命令。它有自己的语法和命令。Docker可以从Dockerfile中读取指令自动构建镜像!Dockerfiler本质是一个文本文件。由于是文本文档,因此需要了解该文档的书写规则,即了解Dockerfile的语法和命令。说说它的相关说明吧!1.FROM语法:FROM[AS]FROM[:][AS]FROM[@][AS]from是哪里它来自,对于Docker官方的说法是指定基础镜像,当前镜像基于哪个镜像,有点类似于Java中的类继承。FROM指令必须是Dockerfile中的第一个命令。2.MAINTAINER语法:MAINTAINER镜像维护者的信息,该命令已废弃。3.LABEL语法:LABEL===...4.ENVENVENV=...设置环境变量!5、WORKDIRWORKDIR/path/to/workdir设置工作目录,该指令之后的RUN、CMD、ENTRYPOINT、COPY、ADD指令都会在该目录下执行。如果该目录不存在,将创建它!6.RUNRUNRUN["executable","param1","param2"]RUN会在当前图像之上新建一层,可以执行任意命令,然后提交执行结果。提交后生成的镜像可以在Dockerfile的后续步骤中使用。7.ADDADD[--chown=:]...ADD[--chown=:]["",...""]从宿主机复制文件或文件夹到镜像,也可以复制一个网络文件!如果复制的文件是压缩包,会自动解压!8.COPYCOPY[--chown=:]...COPY[--chown=:]["",...""]从宿主机复制文件或文件夹到镜像,网络文件不能复制,也不会自动解压!9.VOLUMEVOLUME["/data"]VOLUME用于创建挂载点,一般与运行命令的-v参数一起使用。10.EXPOSEEXPOSE[/...]指定容器运行时对外暴露的端口,但这个指定不会真正发布端口。它的功能介于镜像生成器和容器操作员记录文件之间。回到容器命令中的运行命令部分,运行命令有两个参数-p和-P。如果是-P,则为随机端口映射,容器会随机映射到EXPOSE指定的端口;如果是-p,就是指定的端口映射,告诉运维人员容器中需要映射的端口号。11、CMDCMD["executable","param1","param2"]CMD["param1","param2"]CMDcommandparam1param2指定容器启动时默认运行的命令。在一个Dockerfile中,如果有多个CMD命令,只有最后一个才会生效!12.ENTRYPOINTENTRYPOINT["executable","param1","param2"]ENTRYPOINTcommandparam1param2该指令类似于CMD指令,指定启动容器时运行的命令。如果指定了ENTRYPOINT,CMD指定的命令将不会被执行!在一个Dockerfile中,如果有多个ENTRYPOINT命令,只有最后一个会生效!不同的是,通过dockerrun命令的命令会覆盖掉CMD命令!执行的命令不会覆盖ENTRYPOINT,dockerrun命令中指定的任何参数都会作为参数传递给ENTRYPOINT!RUN、CMD、ENTRYPOINT的区别:---RUN指令是在构建镜像时运行的,后两者是在容器启动时执行的!---设置CMD指令command是容器启动时默认运行的命令。如果dockerrun没有指定任何命令,Dockerfile中也没有指定ENTRYPOINT,那么容器启动的时候就会执行CMD指定的命令!类似于代码中的默认参数!---如果设置了ENTRYPOINT命令,则优先!并且可以通过dockerrun给命令设置的命令传递参数!---CMD有点类似于代码中的默认参数。13.USERUSER[:]USER[:]用于指定运行镜像的用户。14.ARGARG[=]指定构建镜像时可以传递的变量,定义的变量可以在构建时通过dockerbuild--build-arg=设置。15.ONBUILDONBUILD[INSTRUCTION]当构建的镜像作为其他镜像的基础镜像时,会触发ONBUILD指定的命令!16.STOPSIGNALSTOPSIGNALsignal设置容器停止时发送的系统调用信号!17.HEALTHCHECKHEALTHCHECK[OPTIONS]CMDcommand(运行容器中运行的命令,检测容器的运行状态)HEALTHCHECKNONE(禁止从父镜像继承检查)这条指令可以告诉Docker如何检查容器的运行状态!18.SHELLSHELL["executable","parameters"]用来设置执行命令的默认shell类型!这个命令在Windows操作系统下比较有用,因为通常有两个shell,CMD和Powershell,甚至在Windows下还有SH。以上是Dockerfile的相关说明。现在我们对这些指令有了大致的了解,那么如何构建它们呢?当然是使用Docker提供的构建命令:dockerbuild[OPTIONS]PATH|网址|--f:指定要使用的Dockerfile路径,不指定则在当前工作目录下查找Dockerfile!-t:镜像的名称和标签,一般为name:tag或name格式;可以在一个构建中为一个图像设置多个标签。查看redis和nodejs的Dockerfile长什么样: