4-2 dockderfile指令使用
dockderfile详解 创建自定义的Docker镜像 一、目录 1.docker典型结构 2.指令介绍 3.创建docker镜像 二、结构 DockerFile分为四部分组成:基础镜像信息、维护者信息、镜像操作指令和容器启动时执行指令。例如: # vi Dockerfile #第一行必须指令基于的基础镜像 From ubutu #维护者信息 MAINTAINER docker_user docker_user@mail.com #镜像的操作指令 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/