Dockerfile 文件学习(二) docker
(6)ADD(添加文件):ADD和COPY指令类似可是不一样的是,ADD能够从网上去添加文件或者是文件夹,就是从一个URL地址下载内容复制到容器文件系统中,还能够将压缩打包格式的文件解开后复制到指定的位置。 shell
ADD格式以下: ubuntu
ADD file /Images/path/file windows
ADD aaa.tar.gz /var/www/ 安全
在使用复制命令下,ADD构建镜像的大小比COPY构建的镜像要打,因此复制文件时尽可能推荐使用COPY。 网络
(7)EXPOSE(指定端口暴露): app
EXPOSE指令以下: 工具
EXPOSE <端口>[<端口>…] 学习
EXPOSE指令用于标明这个镜像中的应用将会侦听某个端口,而且但愿这个端口映射到主机的网络界面上,可是为了安全,docker run 命令若是没有带上响应的端口映射参数,docker并不会将端口映射出去。 ui
此外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个:
--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"]