百度360必应搜狗淘宝本站头条
当前位置:网站首页 > IT技术 > 正文

Dockerfile常用指令大全及详解

wptr33 2025-01-09 16:34 25 浏览

1、FROM

FROM指令是最重要的一个且必须为Dockerfile文件开篇的第一个非注释行,用于为映像文件构建过程指定基准镜像,后续的指令运行于此基准镜像所提供的运行环境,实践中,基准镜像可以是任何可用镜像文件,默认情况下,docker build会在 docker主机上查找指定的镜像文件,在其不存在时,则会从Docker Hub Registry上拉取所需的镜像文件,如果找不到指定的镜像文件,docker build会返回一个错误信息。

FROM <repository>:<tag>

<repository>:指定作为base image的名称。

<tag>:base image的标签,为可选项,省略时默认为latest。

2、LABLE

LABEL用于为镜像添加元数据,元数以键值对的形式指定。

LABEL version="1.0" description="这是一个Web服务器" by="IT笔录"

指定后可以通过docker inspect查看镜像的元数据信息。

docker inspect <REPOSITORY>:<TAG>或者<镜像ID>

3、COPY

用于从 Docker主机复制文件至创建的新映像文件。

COPY <src> ... <dest> 或 . COPY ["<src>",... "<dest>"]

<src>:要复制的源文件或目录,支持使用通配符

<dest>:目标路径,即正在创建的 image的文件系统路径;建议为使用绝对路径,<dest>绝对路径为镜像中的路径,而不是宿主机的路径。否则,COPY指定则以WORKDIR为其起始路径。

4、ADD

ADD指令类似于COPY指令,ADD支持使用TAR文件和URL路径。

ADD <src> ... <dest> 或 ADD ["<src>",... "<dest>"]

同COPY

5、WORKDIR

workdir为工作目录,指当前容器环境的工作目录,用于为 Dockerfile中所有的 RUN、CMD、ENTRYPOINT、COPY和 ADD指定设定工作目录。

WORKDIR <dirpath>

6、VOLUME

定义卷,只能是docker管理的卷,VOLUME为容器上的目录,用于在 image中创建一个挂载点目录,以挂载 Docker host上的卷或其它容器上的卷。

VOLUME <mountpoint> 或 VOLUME ["<mountpoint>"]

如果挂载点目录路径下此前在文件存在, docker run命令会在卷挂载完成后将此前的所有文件复制到新挂载的卷中。

7、EXPOSE

暴露指定端口,用于为容器打开指定要监听的端口以实现与外部通信

EXPOSE <port>[/<protocol>] [<port>[/<protocol>] ...]

<protocol>:用于指定传输层协议,可为 tcp或udp二者之一,默认为 TCP协议。

8、ENV

ENV用于为镜像定义所需的环境变量,并可被 Dockerfile文件中位于其后的其它指令(如 ENV、ADD、COPY等)所调用 ,即先定义后调用,调用格式为 $variable_name或${variable_name}。

ENV <key> <value>或 . ENV <key>=<value> ...

第一种格式,<key>之后的所有内容均会被视作其 <value>的组成部分,因此一次只能设置一个变量。

第二种格式,可用一次设置多个变量,每个变量为一个“<key>=<value>”的键值对,如果<value>包含空格,可以以反斜线(\)进行转义,也可通过对<value>加引号进行标识;另外反斜线也可以用于续行。

定义多个变量时,建议使用第二种方式,以便在同一层中完成所有功能。

9、RUN

RUN用于指定 docker build过程中运行的程序,其可以是任何命令,但是这里有个限定,一般为基础镜像可以运行的命令,如基础镜像为centos,安装软件命令为yum而不是ubuntu里的apt-get命令。

RUN和CMD都可以改变容器运行的命令程序,但是运行的时间节点有区别,RUN表示在docker build运行的命令,而CMD是将镜像启动为容器运行的命令。因为一个容器正常只用来运行一个程序,因此CMD一般只有一条命令,如果CMD配置多个,则只有最后一条命令生效。而RUN可以有多个。

RUN <command>或 . RUN ["<executable>", "<param1>", "<param2>"]

第一种格式中,<command>通常是一个shell命令,且以“/bin/sh -c”作为父进程来运行它,这意味着此进程在容器中的PID不为1,不能接收Unix信号,因此,当使用 docker stop <container>命令停止容器时,此进程接收不到SIGTERM信号。

第二种语法格式中的参数是一个JSON格式的数组,其中<executable>为要运行的命令,后面的<paramN>为传递给命令的选项或参数;然而,此种格式指定的命令不会以“/bin/sh -c”来发起,表示这种命令在容器中直接运行,不会作为shell的子进程,因此常见的shell操作如变量替换以及通配符(?,*等)替换将不会进行,不过,如果要运行的没能力依赖此shell特性的话,可以将其替换为类似下面的格式。

10、CMD

类似于 RUN指令,CMD指令也可用于运行任何命令或应用程序,不过,二者的运行时间点不同。RUN指令运行于映像文件构建过程中,而 CMD指令运行于基于 Dockerfile构建出的新映像文件启动一个容器时。 CMD指令的首要目的在于为启动的容器指定默认要运行的程序,且其运行结束后,容器也将终止;不过,CMD指定的命令其可以被docker run的命令行选项所覆盖。在Dockerfile中可以存在多个CMD指令,但仅最后一个会生效。

CMD <command> 或 CMD ["<executable>","<param1>","<param2>"] 或 CMD["<param1>","<param2>"]

前两种语法格式的意义同 RUN。

第三种则用于为 ENTRYPOINT指令提供默认参数。

11、ENTRYPOINT

类似CMD指令的功能,用于为容器指定默认运行程序,从而使得容器像是一个单独的可执行程序。

与CMD不同的是,由ENTRYPOINT启动的程序不会被docker run命令行指定的参数所覆盖,而且,这些命令行参数会被当作参数传递给 ENTRYPOINT指定指定的程序。不过,docker run命令的--entrypoint选项的参数可覆盖ENTRYPOINT指令指定的程序。

ENTRYPOINT <command> 或 ENTRYPOINT ["<excutable>","<param1>","<param2>"]

docker run命令传入的命令参数会覆盖CMD指令的内容并且附加到ENTRYPOINT命令最后做为其参数使用。Dockerfile文件中也可以存在多个 ENTRYPOINT指令,但仅有最后一个会生效。

12、ARG

ARG用于指定传递给构建运行时的变量。

ARG <name>[=<default value>]

在使用docker build 构建镜像时,可以通过--build-arg <varname>=<value>参数来指定或重设置这些变量的值。

13、STOPSIGNAL

STOPSIGNAL用于设置停止容器所要发送的系统调用信号。

STOPSIGNAL signal

所使用的信号必须是内核系统调用表中的合法的值,如:SIGKILL。

14、SHELL

SHELL用于设置执行命令(shell式)所使用的默认shell类型。

SHELL ["executable", "parameters"]

SHELL在Windows环境下比较有用,Windows下通常会有cmd和powershell两种shell,可能还会有sh。这时就可以通过SHELL 来指定所使用的shell类型。

15、USER

USER用于指定运行image时的或运行Dockerfile中任何RUN、CMD或ENTRYPOINT指令指定的程序时的用户名或UID,即改变容器中运行程序的身份。

默认情况下,container的运行身份为root用户。

USER <UID>|<UserName>

<UID>可以为任意数字,但实践中其必须为/etc/passwd中某用户的有效UID,否则docker run命令将运行失败,使用USER指定用户时,可以使用用户名、UID或GID,或是两者的组合。以下都是合法的指定试:

  • USER user
  • USER user:group
  • USER uid
  • USER uid:gid
  • USER user:gid
  • USER uid:group

使用USER指定用户后,Dockerfile中其后的命令RUN、CMD、ENTRYPOINT都将使用该用户。镜像构建完成后,通过docker run 运行容器时,可以通过-u参数来覆盖所指定的用户。

16、ONBUILD

ONBUILD用于在Dockerfile中定义一个触发器,用来指定运行docker指令。

Dockerfile用于 build映像文件,此映像文件亦可作为base image被另一个 Dockerfile用作FROM指令的参数,并以之构建新的映像文件,

在后面的这个Dockerfile中的FROM指令在build过程中被执行时,将会 “触发 ”创建其base image的Dockerfile文件中的ONBUILD指令定义的触发器。

ONBUILD <INSTRUCTION>

尽管任何指令都可注册成为触发器指令,但是ONBUILD不能自我嵌套,且不会触发FROM和MAINTAINER指令。

使用包含ONBUILD指令的Dockerfile构建的镜像应该使用特殊的标签,例如ruby:2.0-onbuild。

在ONBUILD指令中使用ADD或COPY指令应该格外小心,因为新构建过程的上下文在缺少指定的源文件时会失败。

ONBUILD在构建镜像时不会运行,是别人基于这个镜像作为基础镜像构建时,才会运行。

相关推荐

oracle数据导入导出_oracle数据导入导出工具

关于oracle的数据导入导出,这个功能的使用场景,一般是换服务环境,把原先的oracle数据导入到另外一台oracle数据库,或者导出备份使用。只不过oracle的导入导出命令不好记忆,稍稍有点复杂...

继续学习Python中的while true/break语句

上次讲到if语句的用法,大家在微信公众号问了小编很多问题,那么小编在这几种解决一下,1.else和elif是子模块,不能单独使用2.一个if语句中可以包括很多个elif语句,但结尾只能有一个...

python continue和break的区别_python中break语句和continue语句的区别

python中循环语句经常会使用continue和break,那么这2者的区别是?continue是跳出本次循环,进行下一次循环;break是跳出整个循环;例如:...

简单学Python——关键字6——break和continue

Python退出循环,有break语句和continue语句两种实现方式。break语句和continue语句的区别:break语句作用是终止循环。continue语句作用是跳出本轮循环,继续下一次循...

2-1,0基础学Python之 break退出循环、 continue继续循环 多重循

用for循环或者while循环时,如果要在循环体内直接退出循环,可以使用break语句。比如计算1至100的整数和,我们用while来实现:sum=0x=1whileTrue...

Python 中 break 和 continue 傻傻分不清

大家好啊,我是大田。...

python中的流程控制语句:continue、break 和 return使用方法

Python中,continue、break和return是控制流程的关键语句,用于在循环或函数中提前退出或跳过某些操作。它们的用途和区别如下:1.continue(跳过当前循环的剩余部分,进...

L017:continue和break - 教程文案

continue和break在Python中,continue和break是用于控制循环(如for和while)执行流程的关键字,它们的作用如下:1.continue:跳过当前迭代,...

作为前端开发者,你都经历过怎样的面试?

已经裸辞1个月了,最近开始投简历找工作,遇到各种各样的面试,今天分享一下。其实在职的时候也做过面试官,面试官时,感觉自己问的问题很难区分候选人的能力,最好的办法就是看看候选人的github上的代码仓库...

面试被问 const 是否不可变?这样回答才显功底

作为前端开发者,我在学习ES6特性时,总被const的"善变"搞得一头雾水——为什么用const声明的数组还能push元素?为什么基本类型赋值就会报错?直到翻遍MDN文档、对着内存图反...

2023金九银十必看前端面试题!2w字精品!

导文2023金九银十必看前端面试题!金九银十黄金期来了想要跳槽的小伙伴快来看啊CSS1.请解释CSS的盒模型是什么,并描述其组成部分。...

前端面试总结_前端面试题整理

记得当时大二的时候,看到实验室的学长学姐忙于各种春招,有些收获了大厂offer,有些还在苦苦面试,其实那时候的心里还蛮忐忑的,不知道自己大三的时候会是什么样的一个水平,所以从19年的寒假放完,大二下学...

由浅入深,66条JavaScript面试知识点(七)

作者:JakeZhang转发链接:https://juejin.im/post/5ef8377f6fb9a07e693a6061目录...

2024前端面试真题之—VUE篇_前端面试题vue2020及答案

添加图片注释,不超过140字(可选)...

今年最常见的前端面试题,你会做几道?

在面试或招聘前端开发人员时,期望、现实和需求之间总是存在着巨大差距。面试其实是一个交流想法的地方,挑战人们的思考方式,并客观地分析给定的问题。可以通过面试了解人们如何做出决策,了解一个人对技术和解决问...