• Dockerfile 文件学习(二)


    Dockerfile 文件学习(二)

    (6)ADD(添加文件):ADD和COPY指令相似但是不同的是,ADD可以从网上去添加文件或者是文件夹,就是从一个URL地址下载内容复制到容器文件系统中,还可以将压缩打包格式的文件解开后复制到指定的位置。

    ADD格式如下:

    ADD file /Images/path/file

    ADD aaa.tar.gz /var/www/

    在使用复制命令下,ADD构建镜像的大小比COPY构建的镜像要打,所以复制文件时尽量推荐使用COPY。

    (7)EXPOSE(指定端口暴露):

    EXPOSE指令如下:

    EXPOSE <端口>[<端口>…]

    EXPOSE指令用于标明这个镜像中的应用将会侦听某个端口,并且希望这个端口映射到主机的网络界面上,但是为了安全,docker run 命令如果没有带上响应的端口映射参数,docker并不会将端口映射出去。

    此外EXPOSE端口是可以在多个容器之间通信,通过--links 参数可以让多个容器通过端口连接在一起。

    (8)CMD(设置镜像启动命令):CMD提供了默认容器的执行命令。Dockerfile使用多个CMD会抵消之前所有的指令,只有最后一个指令生效。一般来说整个Dockerfile脚本的最后一条命令。当Dockerfile已经完成了所有的环境的安装与配置,通过CMD指令来指示docker run 命令运行镜像时要执行的命令。格式如下:

    CMD ["executable","param1","param2"]

    值得注意的是docker run 命令可以覆盖CMD命令,CMD与ENTRYPOINT的功能极为相似。区别在于如果docker run后面出现了与CMD指定相同的命令,那么CMD会被覆盖;而ENTPYPOINT会把容器名后面的所有内容当做参数传递给其他给其指定的命令(不会对命令覆盖。另外,CMD指令还可以当做是ENTPYPOINT指令的可选参数,共同组成一条完整的启动命令。

    读这些如果有些模糊,不妨做做实验:

    Dockerfile如下:

    FROM ubuntu

    CMD ["echo","hello","world"]

    然后开始构建,并运行容器:

    [root@localhost ~]# docker build -t s8 . #-t s8 给镜像打标签S8

    Sending build context to Docker daemon 1.127 MB

    Step 1/2 : FROM ubuntu

    ---> cd6d8154f1e1

    Step 2/2 : CMD echo hello world

    ---> Using cache

    ---> 8b4276f87c6c

    Successfully built 8b4276f87c6c

    [root@localhost ~]# docker run --rm s8 #运行镜像

    hello world

     

     

    [root@localhost ~]# docker run s8 echo "hello docker" #再次运行

    hello docker

    [root@localhost ~]#

    当使用docker run s6 echo 方式启动容器时,echo "hello world"命令会覆盖原有CMD指令。也就是说CMD指令可以通过docker run命令覆盖。这一点CMD和ENTRYPOINT最大的区别。

    CMD和RUN 命令的区别在于,RUN是在build成镜像时就运行,先于CMD和ENTRYPOINT,CMD会在每次启动容器的时候运行,而RUN只在创建镜像时执行一次。

    固话在image中。

    (9)ENTPYPOINT(设置接入点):

    前面已经说到了这个命令与CMD相似。ENTPYPOINT相当于把镜像变成了一个固定的命令工具,它一般是不可以通过docker run

    来改变的,而CMD不同,CMD是可以通过启动命令修改内容。二者的主要区别通过实践会体会得更清晰。

    Dockerfile如下:

    FROM ubuntu

    ENTRYPOINT ["echo"]

     

    [root@localhost ~]# docker build -t s9 . #创建镜像。

    Sending build context to Docker daemon 1.126 MB

    Step 1/2 : FROM ubuntu

    ---> cd6d8154f1e1

    Step 2/2 : ENTRYPOINT echo

    ---> Running in 44152f32f53c

    ---> 73ec7ef2bed4

    Removing intermediate container 44152f32f53c

    Successfully built 73ec7ef2bed4

     

    [root@localhost ~]# docker run s9 'hello kubernetes' #启动容器

    hello kubernetes

    [root@localhost ~]#

    可以看到 ,在ENTRYPOINT指令下,容器就行一个echo程序,docker run 后面的参数都成为了echo的参数。

    (10)VOLUME(设置数据卷):VOLUME指令用来向基于镜像创建的容器添加数据卷(在一个容器内设置挂载点,可以用来其他容器挂载或让宿主机访问,以实现数据共享或对容器数据的备份,恢复或迁移).

    数据卷可以在容器间共享和重用。数据卷的修改是立即生效的。数据卷的修改不会对更新的镜像产生影响。数据卷会一直存在,直到没有任何容器使用它(没有使用它,它也会在宿主机存在,但只不过是数据卷,和普通的文件没有差异。)

    VALUME指令使用:

    VALUME ["/data","/data2"]

    VALUME /data

    VOLUME 可以在docker run 中使用,如果run 命令中没有使用,则不会在宿主机挂载这个数据卷。如果Dockerfile中没有设置数据卷,在docker run 中也是可以设置的,在Dockerfile中声明数据卷有助于开发人员迅速定位需要保存的数据位置。

    还是来点实战吧:

    Dockerfile如下:

    FROM ubuntu

    RUN mkdir /app && echo "ello world"> /app/test.txt

    VOLUME /home

    CMD ["cat","/app/test.txt"]

     

     

    [root@localhost ~]# docker build -t v99

    Sending build context to Docker daemon 1.133 MB

    Step 1/5 : FROM ubuntu

    ---> cd6d8154f1e1

    Step 2/5 : RUN mkdir /app && echo 'hello world' > /app/test.txt

    ---> Running in dc47839b405e

     

    ---> 70ce3ce074eb

    Removing intermediate container dc47839b405e

    Step 3/5 : VOLUME /root

    ---> Running in deaad1ac5b3c

    ---> a4fed2b1608f

    Removing intermediate container deaad1ac5b3c

    Step 4/5 : CMD cat /app/test.txt

    ---> Running in aa7a3f2cf313

    ---> 476e20f1555a

    Removing intermediate container aa7a3f2cf313

    Step 5/5 : ENTRYPOINT echo

    ---> Running in 42f65c7980c4

    ---> cf5f06e79508

    Removing intermediate container 42f65c7980c4

    Successfully built cf5f06e79508

    [root@localhost ~]#

    [root@localhost ~]# docker run --rm v99

    hello world

    (11)USER(设置构建用户):

    USER指令如下:

    USER user

    USER user:group

    USER uid:gid

    USER指定可以在docker run 命令中通过-u选项来覆盖。这条指令应用场景在于,当服务不需要管理员权限时可以通过命令指定运行用户。指定的用户需要在USER指令创建之前创建

    EL:

    RUN groupadd ——人newusereyuser&& useradd –r –g newuser newuser

    (12)WORKDIR(设置工作目录)

    WORKDIR命令指定RUN CMD与ENTPOINT命令的工作目录。

    语法如下:

    WORKDIR /path/to/workdir

    同样docker run –w 可以运行时覆盖指令指定的目录

    此外可以使用多个WORKDIR指令,后续的命令参数如果是相对路径。

    (13)ONBUILD指令(设置二次构建指令)

    ONBUILD指定在构建镜像时并不执行,而是在它的子镜像中执行。

    说的很抽象。来个实战试一试:

    Dockerfile如下:

    [root@localhost ~]# docker build -t c99 .

    Sending build context to Docker daemon 1.132 MB

    Step 1/2 : FROM busybox

    Trying to pull repository docker.io/library/busybox ...

    latest: Pulling from docker.io/library/busybox

    Digest: sha256:cb63aa0641a885f54de20f61d152187419e8f6b159ed11a251a09d115fdff9bd

    Status: Downloaded newer image for docker.io/busybox:latest

    ---> e1ddd7948a1c

    Step 2/2 : ONBUILD run echo "you won't see me until later"

    ---> Running in 833de3bbf044

    ---> 09eadbfd18fa

    Removing intermediate container 833de3bbf044

    Successfully built 09eadbfd18fa

     

     

    第二个Dockerfile如下:

     

     

    FROM c99

    [root@localhost ~]# docker build -t c88 .

    Sending build context to Docker daemon 1.132 MB

    Step 1/1 : FROM c99

    # Executing 1 build trigger...

    Step 1/1 : RUN echo "you won't see me until later"

    ---> Running in 5a982a7ab862

     

    you won't see me until later

    ---> 436765d746f5

    Removing intermediate container 5a982a7ab862

    Successfully built 436765d746f5

    可以看到第一次创建中ONBUILD的指令没有被执行,第二次被执行了。ONBUILD后面是不能跟FROM和MAINTAINER指令。

    14.LABEL(设置元数据):LABEL指令添加元数据到镜像,每个标签会生成一个layer。尽量使用一个LABEL标签。

    LABEL multi.label1="value1" multi.label2="value2" multi.label3="value3"

    或者LABEL multi.label1="value1"

    multi.label2="value2"

    multi.label3="value3"

    15ARG.(构建环境变量)

    ARG指令定义了一个变量,用户可以在构建时使用,效果和docker build –build-arg <varname>=<value>一样,可以在构建时设定参数,这个参数只会在构建时存在。与ENV相似,不同的是ENV会在镜像构建结束之后依旧存在镜像中,而AGR不会。

    16.STOPSIGNAL:设置停止信号

    STOPSIGNAL指令允许用户定制化运行docker stop时的信号。

    STOPSIGNAL SIGKILL

    基于这种方式构建的镜像,其启动的容器在停止时会发出SIGKILL信号,这个指令适用于一些不能接受正常退出信号的容器。

    17.HEALTHCHECK:检查镜像状态

    这个是一个健康检查指令,用来检查将容器启动运行时是否正常。正常则会返回healthy,否则unhealthy。:

    HEALTHCHECK [OPTIONS] CMD command

    参数有3个:

    1. 设置容器启动多长时间后开始检查容器的状态:

            --interval=DURATION(默认30秒)

    2.设置超时时间,超过这个时间不返回信息,表示容器异常。

        --timeout=DURATION(默认30秒)

    3.设置重试次数

            --retries=N

    18.SHELL:(设置命令执行的环境)

    Docker构建过程中,默认会使用/bin/sh作为shell环境。Windows下构建默认使用cmd作为shell环境,但是有时需要在其他shell环境中执行RUN的内容。这时就需要SHELL指令提醒Docker更换shell环境。

    El:在windows环境下跟环powershell作为默认shell

    SHELL ["powershell","-command"]

  • 相关阅读:
    面向对象上
    面向对象下
    java大话设计模式
    《人体使用手册》阅读摘录
    mosquitto——一个开源的mqtt代理
    mosquitto0.15libmosquitto.c源码分析
    mosquitto0.15clientpub_client.c源码分析
    mosquitto0.15clientsub_client.c源码分析
    厦门三天游如何安排
    mimics教程中文版——第二章
  • 原文地址:https://www.cnblogs.com/cdipp/p/9668710.html
Copyright © 2020-2023  润新知