Dockerfile是由一系列命令和参数构成的脚本,一个Dockerfile里面包含了构建整个image的完整命令。Docker通过docker build执行Dockerfile中的一系列命令自动构建image。
Syntax:
FROM <image>[:<tag> | @<digest>] [AS <name>]
FROM指定一个基础镜像,且必须为Dockerfile文件开篇的每个非注释行,至于image则可以是任何合理存在的image镜像
FROM可以在一个Dockerfile中出现多次,以便于创建混合的images。如果没有指定tag,latest将会被指定为要使用的基础镜像版本。
AS name,可以给新的构建阶段赋予名称。该名称可用于后续FROM 和 COPY --from=<name | index>说明可以引用此阶段中构建的镜像
为镜像生成元数据标签信息 Syntax:
LABEL <KEY>=<VALUE> \ <KEY>="XXXX"
多个标签写成一行,避免在镜像中额外增加layer
作者信息,写在FROM后 Syntax:
MAINTAINER "auth <email>"
/data/ ```
文件复制准则
ADD <src>...<dest> ADD ["<src>",..."<dest>"]
操作准则
额外操作: ADD http://example.com/1.tar.gz /apps/ RUN tar xf /apps/1.tar.gz -C /apps/ && \ /bin/sh -c /apps/***.sh 简单操作: RUN mkdir -p /iyunwen/server/ && \ curl -SL http://example.com/1.tar.gz \ | tar -xzC /iyunwen/server/ && \ /bin/sh -c /apps/***.sh
WORKDIR
在Dockerfile文件中,WORKDIR指令可以出现多次,其路径也可以为相对路径,不过,其是相对此前一个WORKDIR指令指定的路径 另外,WORKDIR也可调用由ENV指定定义的变量
ex:
WORKDIR /var/log WORKDIR $STATEPATH
/bin/sh -c) RUN ["executable","param1","param2"] ```
在shell形式中,可以使用\(反斜杠)将单个RUN指令继续到下一行。例如:
RUN yum install -y \ openssl \ pcre-devel \ zlib
RUN ["/bin/bash","-c","<executable>","<param1>"]
RUN 指令的缓存在下一次构建期间不会自动失效。用于诸如:yum repolist 之类的指令的缓存将在下一次构建期间被重用。可以通过--no-cache 参数来使RUN指令的缓存无效,例如: docker build --no-cache
管理命令 某些RUN 命令依赖于使用管道字符( | )将管道输出到另一个命令功能
RUN wget -O - http://www.baidu.com/index.html | wc -l > /app/html/baidu.html
Docker使用 /bin/sh -c 解释执行这些命令,解释器只评估管道中最后一个操作的退出代码以确定成功。在上面的例子中,只要wc -l 命令成功,即使wget 命令失败,该构建步骤也会成功并生成新的镜像。
由于管道中任何阶段的错误而导致命令失败,请预先 set -o pipefail && 确保意外错误可防止构建无意中成功。例如: set -o pipefail : 表示在管道连接的命令序列中,只要有任何一个命令返回非0值,则整个管道返回非0值,即使最后一个命令返回0.
RUN set -o pipefail && wget -O - http://www.baidu.com/index.html | wc -l > /app/html/baidu.html
注意:
并非所有的shell都支持 -o pipefail 选项。在这种情况下(例如 dash shell,这是基于Debian的映像上的默认shell),请考虑使用exec形式RUN来明确选择一个支持该pipefail选项的shell。如:
RUN ["/bin/bash","-c","set -o pipefail && wget -O - http://www.baidu.com/index.html | wc -l > /app/html/baidu.html"]
CMD <command> //支持命令展开,但是不支持传递信号 CMD ["<executable>","<param1>","<param2>"] //相当于容器的第一个命令,可以接受信号 CMD ["param1","param2"] 前两种语法格式的意义同RUN 第三种则用于为ENTRYPOINT指令提供默认参数
>
CMD会在启动容器的时候执行,build时不执行,而RUN只是在构建镜像的时候执行,后续镜像构建完成之后,启动容器就与RUN无关了。这个命令就相当于在/etc/rc.d/rc.local中写命令
与CMD不同的是,由ENTRYPOINT启动的程序不会被docker run命令行指定的参数所覆盖,而且,这些命令行参数会被当作参数传递给ENTRYPOINT指定的程序。不过,docker run 命令的-- entrypoint 选项的参数可覆盖ENTRYPOINT指令指定的程序
Syntax:
ENTRYPOINT <command> //这种方式能接受shell命令行展开 ENTRYPOINT ["<executable>","param1"] //展开不了,但能接收到信号
docker run命令传入的命令参数会覆盖CMD指令的内容并且附加到ENTRYPOINT命令最后做为其参数使用。Dockerfile文件中也可以存在多个ENTRYPOINT指令,但仅有最后一个会生效
EXPOSE [...]
告诉Docker服务端容器对外映射的本地端口,需要在docker run 的时候使用-p 或者 -P 选项生效。
EXPOSE 80/tcp
ENV ENV = ...
指定一个环境变量,会被后续RUN指令使用,并在容器运行时保留。 ENV设置的环境变量,可以使用 docker inspect 命令来查看。同时还可以使用 docker run --env
=来修改环境变量
默认情况下,container的运行身份为root用户 Syntax: USER | 需要注意的是,\可以为任意数字,但实践中其必须为/etc/passwd中某用户的有效UID,否则,docker run命令将运行失败
USER |
image被另一个Dockerfile用作FROM指令的参数,并以之构建新的映像文件 在后的这个Dockerfile中的FROM指令在build过程中被执行时,将会“触发”创建其base image的Dockerfile文件中的ONBUILD指令定义的触发器
ONBUILD <INSTRUCTION>
注意: 尽管任何指令都可注册成为触发器指令,但ONBUILD不能自我嵌套,且不会触发FROM和MAINTAINER指令 使用包含ONBUILD指令的Dockerfile构建的镜像应该使用特殊的标签,例如ruby:2.0-onbuild 在ONBUILD指令中使用ADD或COPY指令应该格外小心,因为新构建过程和上下文在缺少指定的源文件时会失败。
Docker 1.12版本后引入的判断容器状态是否正常
HEALTHCHECK [OPTION] CMD <command> //设置检查容器健康状况的命令 HEALTHCHECK NONE //如果基础镜像有健康检查指令,使用这行可屏蔽掉其健康检查指令
在没HEALTHCHECK指令前,Docker只能通过容器内主进程是否退出来判断容器是否状态异常。很多情况下这没问题,但是如果程序进入死锁状态,或者死循环状态,应用进程并不退出,但是该容器已经无法提供服务了。虽然后端的程序可以通过前端的检测工具来检查状态信息。但是最前端的服务就需要本身的检测机制加上监控,就可以做到出现问题解决问题。
当在一个镜像指定了 HEALTHCHECK 指令后,用其启动容器,初始状态会为 starting,在 HEALTHCHECK 指令检查成功后变为 healthy,如果连续一定次数失败,则会变为 unhealthy。
HEALTHCHECK支持下列选项:
和CMD、ENTRYPOINT一样,HEALTHCHECK只可以出现一次,如果写了多个,只有最后一个生效。CMD 后面的命令也分为shell和exec格式。命令的返回值决定了该次检查的成功与否: 0表示成功;1表示失败;2保留。
shell
exec
0
1
2
HEALTHCHECK --interval=5s --timeout=3s \ CMD curl -fs http://localhost/ || exit 1
原文链接:https://www.cnblogs.com/dance-walter/p/9581508.html