首页 > 其他分享 >4-2 dockderfile指令使用

4-2 dockderfile指令使用

时间:2024-04-09 22:47:41浏览次数:30  
标签:RUN CMD 指定 dockderfile 指令 使用 镜像 docker

dockderfile详解
创建自定义的Docker镜像 
一、目录 
1.docker典型结构 
2.指令介绍 
3.创建docker镜像

二、结构 
DockerFile分为四部分组成:基础镜像信息、维护者信息、镜像操作指令和容器启动时执行指令。例如:
# vi Dockerfile
#第一行必须指令基于的基础镜像
From ubutu
#维护者信息
MAINTAINER docker_user  [email protected]
#镜像的操作指令
apt/sourcelist.list
RUN apt-get update && apt-get install -y ngnix 
RUN echo "\ndaemon off;">>/etc/ngnix/nignix.conf
#容器启动时执行指令
CMD /usr/sbin/ngnix
https://www.cnblogs.com/panwenbin-logs/p/8007348.html

三、指令 
1、From指令 
From 或者From :
DockerFile第一条必须为From指令。如果同一个DockerFile创建多个镜像时,可使用多个From指令(每个镜像一次)

2、MAINTAINER
格式为:MAINTAINER <name>,指定维护者信息。
注意:MAINTAINER 指令已经被抛弃,建议使用 LABEL 指令。

LABEL
格式为:
LABEL <key>=<value> <key>=<value> <key>=<value> ...
LABEL 指令为镜像添加标签。一个LABEL就是一个键值对。
示例:
LABEL "com.example.vendor"="ACME Incorporated"
LABEL com.example.label-with-value="foo"
LABEL version="1.0"
LABEL description="This text illustrates \that label-values can span multiple lines."

我们可以给镜像添加多 LABEL,需要注意的是,每 LABEL指令都会生成一个新的层。所以最好是把添加的多个LABEL合并为一条命令:
LABEL multi.label1="value1" multi.label2="value2" other="value3"
也可以写成这样:
LABEL multi.label1="value1" \
   multi.label2="value2" \
   other="value3"
如果新添加的LABEL和已有的LABEL同名,则新值会覆盖掉旧值。
我们可以使用docker inspect命令查看镜像的LABEL信息。

3、RUN 
用于指定在docker build过程中的执行的程序,其可以是任何命令
有两种格式,分别为:
RUN <command>
RUN ["executable","param1","param2"]

第一种格式中,<command>通常是一个shell命令,将在shell 终端中运行命令,即/bin/sh -c,这意味着此进程在容器中的PID不为1,必能接收Unix信号,因此,当使用docker stop <container>命令停止容器时,此进程接收不到SINGTERM信号;
第二种格式,则使用exec执行,其中executable为要执行的命令;
指定使用其他终端可以通过第二种方式实现,例如 RUN  [“/bin/bash”, “-c”, “echo hello”]。
每条RUN指令将在当前镜像的基础上执行指定命令,并提交为新的镜像。当命令较长时可以使用\来换行。
注:
  RUN指令创建的中间镜像会被缓存,并会在下次构建中使用。
    如果不想使用这些缓存镜像,可以在构建时指定--no-cache参数,如:docker build --no-cache


4、CMD指令 
在docker run过程中的执行的命令,类似于RUN指令, CMD指令也可以用于运行任何命令或应用程序,不过两者运行的时间点不同:
    RUN指令运行于映像文件构建过程中,而CMD指令运行于基于Dockerfile构建出的新映像文件启动的一个容器时
    CMD指令首要目的在于为启动的容器指定默认要运行的程序,且其运行结束后,容器也将终止;不过CMD指定的命令其可以被docker run的命令行选项所覆盖;
    在Dockerfile中可以存在多个CMD指令,但仅最后一个CMD生效。
支持三种格式: 
CMD command param1 param2,在/bin/sh上执行 
CMD [“executable” ,”Param1”, “param2”]使用exec执行,推荐 
CMD [“Param1”, “param2”] 提供给ENTRYPOINT做默认参数。
指定启动容器时执行的命令,每个Dockerfile 只能有一条CMD 命令。如果指定了多条 CMD 命令,只有最后一条会被执行。如果用户在启动容器时指定了要运行的命令,则会覆盖掉CMD 指定的命令。

dockerfile---RUN-->docker build---CMD-->docker run 

5、EXPOSE
格式为:EXPOSE <port>[/<protocol>] [<port[/<protocol>...]
用于为容器打开指定要监听的端口以实现与外部通信;
<protocol>用于指定传输层协议,可为TCP或UDP二者之一,默认为TCP;
EXPOSE并不会让容器的端口访问到主机。
要使其可访问,需要在docker run运行容器时通过-p来发布这些端口,或通过-P参数来发布EXPOSE导出的所有端口.
EXPOSE也可以指定多个端口;
告诉Docker服务端容器暴露的端口号,供互联系统使用。在启动Docker时,可以通过-P,主机会自动分配一个端口号转发到指定的端口。使用-P,则可以具体指定哪个本地端口映射过来
例如: EXPOSE 22 80 8443;EXPOSE 11211/udp 11211/tcp
EXPOSE 80/tcp
docker run -it --name nginxweb -P nginx:v1.15.2   --将容器内的nginx的80端口映射出来,可以通过宿主机+映射出来的端口访问

6、ENV
格式为:ENV <key> <value>或ENV <key>=<value>...
用于为镜像定义所需要的环境变量,并可被dockerfile文件中位于其后的其它指令(如ADD,COPY等)所调用;
调用格式为:$variable_name或${variable_name:default_value};
指定一个环境变量,会被后续RUN指令使用,并在容器运行时保持;用反斜杆\用于换行;
例如:
ENV PG_MAJOR 9.3
ENV PG_VERSION=9.3.4 \
    NGINX_VDERSION=nginx-1.15.2
RUN curl -SL http://example.com/postgres-$PG_VERSION.tar.xz | tar -xJC /usr/src/postgress && …
ENV PATH /usr/local/postgres-$PG_MAJOR/bin:$PATH

docker run --name nginxweb2 -P -e NGINX_VDERSION="nginx-1.15.1"  nginx:v2   --容器内查看env时,NGINX_VDERSION=nginx-1.15.1,但实际用的还是nginx-1.15.2的镜像

7、ADD 
格式为:ADD <src>... <dest>或 ADD [<src>,...<dest>]
ADD指令类似于COPY指令,ADD支持使用TAR文件和URL路径;
该命令将复制指定的<src>到容器中的<dest>。 其中<src>可以是Dockerfile所在目录的一个相对路径;也可以是一个URL;还可以是一个tar文件(自动解压为目录)
将本地文件添加到容器中,tar类型文件会自动解压(网络压缩资源不会被解压),可以访问网络资源,类似wget。
操作准则:
    同COPY指令;
    如果<src>为URL且<dest>不以/结尾,则<src>指定的文件将被下载并直接创建为<dest>;如果<dest>以/结尾,则文件名URL指定的文件将被直接下载并保持为<dest>/<filename>;
    如果<src>是本地系统上的压缩格式的tar文件,它将被展开为一个目录,其行为类似于“tar -xf”;然而通过URL获取到的文件不会自动展开;
    如果<src>有多个,或其间接或直接使用了通配符,,则<dest>必须是一个以/结尾的目录路径;如果<dest>不以/结尾,则其被视作一个普通文件,<src>中的内容将被直接写入到<dest>

8、COPY
格式为:COPY <src>... <dest>或 COPY [<src>,...<dest>]
复制本地主机的 <src>(为Dockerfile所在目录的相对路径)到容器中的<dest>。
功能类似ADD,但是是不会自动解压文件,也不能访问网络资源
    <src>:要复制的源文件或目录,支持使用通配符;
    <dest>:目标路径,即正在创建的image的文件系统的路径,建议<dest>使用绝对路径,否则,COPY指定则以WORKDIR为起始路径;
    注:在路径中有空白字符时,通常使用第二种格式
文件复制准则:
    <src>必须是build上下文中的路径,不能是其父目录中的文件;
    如果<src>是目录,则其内部文件或子目录会被递归复制,但<src>目录自身不会被复制;
    如果指定了多个<src>,或<src>中使用了通配符,则<dest>必须是一个目录,且必须以/结尾;
    如果<dest>事先不存在,它将会被自动创建,这包括其父目录路径。
COPY index.html /data/web/html
COPY yum.repos.d /etc/yum.repos.d/

9、ENTRYPOINT
类似于CMD指令的功能,用于为容器指定默认运行程序,从而使得容器像是一个单独的可执行程序;
与CMD不同的是,由ENTRYPOINT启动的程序不会被docker run命令指定的参数所覆盖,而且,这些命令行参数会被当作参数传递给ENTRYPOINT指定的程序;
不过,docker run命令的 --entrypoint选项的参数可以覆盖ENTRYPOINT指令指定的程序
两种格式:
ENTRYPOINT command param1 param2 (shell中执行)。 
ENTRYPOINT [“executable”, “param1”, “param2”] 
配置容器启动后执行的命令,并且不可被 docker run 提供的参数覆盖。
每个Dockerfile中只能有一个 ENTRYPOINT ,当指定多个时,只有最后一个起效。

10、VOLUME
格式为:VOLUME [mountpoint]或VOLUME ["<mountpoint>"]
用于在Iamge中创建一个挂载点目录,以挂载docker host上的卷或其它容器上的卷。
创建一个可以从本地主机或其他容器挂载的挂载点,一般用来存放数据库和需要保持的数据等。
如果挂载点目录路径下此前在文件存在,docker run命令会在卷挂载完成后将此前所有的文件复制到新挂载的卷中。

11、USER
用于指定运行Image时的或运行Dockerfile中的任何RUN,CMD或ENTRYPOINT指令指定的程序时的用户名;
默认情况下,container的运行身份是root;
格式为 USER <username>|<UID>
指定运行容器时的用户名或UID,后续的RUN也会使用指定用户。
当服务不需要管理员权限时,可以通过该命令指定运行用户。并且可以在之前创建所需要的用户,例如: RUN groupadd -r postgres && useradd -r -g postgres postgres 。要临时获取管理员权限可以使用 gosu ,而不推荐 sudo 。

12、WORKDIR
格式为:WORKDIR /path/to/workdir
为后续的RUN 、 CMD 、 ENTRYPOINT COPY ADD指令配置工作目录。
可以使用多个 WORKDIR 指令,后续命令如果参数是相对路径,则会基于之前命令指定的路径。例如
WORKDIR /a 
WORKDIR b 
WORKDIR c 
RUN pwd 
则最终路径为 /a/b/c 。
WORKDIR /usr/local
ADD nginx.tar.gz ./src  --将nginx.tar.gz拷贝到/usr/local/src下

13 HEALTHCHECK
参数:
--interval=30s(默认是30s)
--timeout=30s(默认是30s)
--start-period=10s(默认0s) --容器主进程起来10后再探测
--retries=3(默认是3次)
返回结果:
  0 成功
  1 unhealthy
  2 不使用这个返回的code
HEALTHCHECK --interval=5m --timeout=5s CMD curl localhost:8080/index.html



14、ONBUILD
用于在Dockerfile中定义一个触发器;
Dockerfile用于build映像文件时,此映像文件亦可以作为base image被另一个Dockerfile用作FROM指令的参数,并以之构建新的映像文件;
在后面的这个Dockerfile中的FROM指令在build过程中被执行,将会触发创建其“base image”的Dockerfile文件中的ONBUILD指令定义的触发器;
格式为:ONBUILD [INSTRUCTION]
配置当所创建的镜像作为其它新创建镜像的基础镜像时,所执行的操作指令。

例如,Dockerfile使用如下的内容创建了镜像 image-A 
[…] 
ONBUILD ADD . /app/src 
ONBUILD RUN /usr/local/bin/python-build –dir /app/src 
[…] 
如果基于A创建新的镜像时,新的Dockerfile中使用 FROM image-A 指定基础镜像时,会自动执行ONBUILD 指令内容,等价于在后面添加了两条指令。
FROM image-A
#Automatically run the following
ADD . /app/src
RUN /usr/local/bin/python-build --dir /app/src
使用 ONBUILD 指令的镜像,推荐在标签中注明,例如 ruby:1.9-onbuild 

三、创建镜像 
通过Docker Build 创建镜像。 
命令读取指定路径下(包括子目录)所有的Dockefile,并且把目录下所有内容发送到服务端,由服务端创建镜像。另外可以通过创建.dockerignore文件(每一行添加一个匹配模式)让docker忽略指定目录或者文件

格式为Docker Build [选项] 路径 
需要制定标签信息,可以使用-t选项 
例如:Dockerfile路径为 /tmp/docker_build/,生成镜像的标签为build_repo/my_images 
$sudo docker build -t build_repo/my_images /tmp/docker_build/

 

标签:RUN,CMD,指定,dockderfile,指令,使用,镜像,docker
From: https://www.cnblogs.com/skyzy/p/18125041

相关文章

  • 导出和导入UEFI启动项列表,您可以使用 bcdedit 命令,并结合使用输出重定向来实现
    导出和导入UEFI启动项列表,您可以使用bcdedit命令,并结合使用输出重定向来实现。以下是一个示例批处理脚本,演示如何导出和导入UEFI启动项列表:导出UEFI启动项列表[email protected]/enumfirmware>UEFI_boot_entries.txt......
  • CMD 批处理脚本自定义 UEFI 启动项,您需要使用 bcdedit 命令来操作 Windows 引导管理器
    CMD批处理脚本自定义UEFI启动项,您需要使用bcdedit命令来操作Windows引导管理器(BootConfigurationData,BCD)。BCD存储了计算机启动时所需的信息,包括可用的操作系统和启动选项。以下是一个简单的示例,演示如何使用CMD批处理脚本添加、修改和删除启动项:1.添加启动项要添......
  • UEFI模式下安装Windows系统,您可以使用 Microsoft 提供的 Windows 安装媒体(如 USB 安装
    UEFI模式下安装Windows系统,您可以使用Microsoft提供的Windows安装媒体(如USB安装盘或光盘)。下面是一个简单的批处理脚本示例,用于在UEFI模式下安装Windows系统:CopyCode@echooffclsechoStartingWindowsinstallationinUEFImode...::设置安装媒体的路径,假设为D:......
  • 使用阿里云试用Elasticsearch学习:3.7 处理人类语言——拼写错误
    我们期望在类似时间和价格的结构化数据上执行一个查询来返回精确匹配的文档。然而,好的全文检索不应该是完全相同的限定逻辑。相反,我们可以扩大范围以包括可能的匹配,而根据相关性得分将更好的匹配推到结果集的顶部。事实上,只能完全匹配的全文搜索可能会困扰你的用户。......
  • 别再上当受骗,使用身份证真伪在线核验工具!
      随着网络的普及和互联网时代的来临,网络诈骗也日益猖獗。其中,冒用他人身份证信息进行诈骗是一种常见的手段。很多人因为不知道如何辨别身份证的真伪,而陷入骗局。为了帮助大家更好地保护自己的财产安全,现在有一种身份证真伪在线核验工具,让我们能够轻松辨别身份证的真伪,避免上......
  • 百度网盘2024永久免费svip免费兑换码及使用教程
    很多新手用户在使用百度网盘时找不到自己下载后的文件在哪,其实百度网盘安装之后就会有默认的下载路径,其实只要跟着小编下面的教程一起操作,就能快速找到文件的下载路径。百度网盘下载的文件在哪?https://snsyun.baidu.com/sl/mg8TQEO​​​​​​​电脑端下载路径:1、打开百......
  • 【编译原理】Antlr 入门使用
    前面文章我们学习了编译器前端的词法和语法分析工具,本篇我们来看看如何借助Antlr工具,快速生成词法和语法分析代码。一、安装mac环境:1)安装brewinstallantlr2)配置classpath(把Antlr的JAR文件设置到CLASSPATH环境变量中,以便顺利编译所生成的Java源代码。)vi~/.b......
  • Python爬虫+认识html网页文本文件,使用beautifulSoup获取信息
    认识HTMLHTML参考手册:https://www.w3cschool.cn/htmltags/tag-p.htmlHTML线上教程:https://www.runoob.com/html/html-examples.html 菜鸟教程html在线编程器:https://www.runoob.com/try/try.php?filename=tryhtml_comment 提示:将下面代码复制到 菜鸟教程html在线编程......
  • 使用Pluto SDR发送单音信号(Matlab)
    RTL-SDR电视棒应该有不少人都玩过,几十块钱就可以接收到很宽频段的信号,不仅可以收听广播,还可以监听某些电台,甚至可以接收GPS信号进行定位,但它作为无线电设备的痛点就是只能收但不能发,不能自己发送信号,是不是有点手痒痒,如果恰巧手里有一块可以同时收发信号的PlutoSDR,那么玩法......
  • IDEA中使用tomcatconfiguration做服务器后,无法从html跳转到servlet的原因
    就我的项目而言,因为我没有用maven中的tomcat插件,用的是IDEA中的tomcatconfiguration,所以刚启动服务器生成的网址是http://localhost:8080/brand_demo_war/,而因为我的项目叫brand-demo,servlet叫做selectAllServlet,所以正常情况浏览器跳转到该servlet后的url应该是http://localhos......