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/

 

posted @ 2024-04-09 22:32  Sky-wings  阅读(2)  评论(0编辑  收藏  举报