更详细的资料可以参考 dockerfile_best-practices 和 Dockerfile reference
Dockerfile是由一系列命令和参数构成的脚本,一个Dockerfile里面包含了构建整个image的完整命令。Docker通过docker build从上到下的顺序运行Dockerfile中的一系列命令自动构建image
一般包含
docker build命令从Dockerfile和context构建image。context是PATH或URL处的文件。PATH本地文件目录。 URL是Git repository的位置。context以递归方式处理。因此,PATH包括任何子目录,URL包括repository及submodules
#常用指令
##FROM
指定基础镜像,必须为第一个命令。如果不以任何镜像为基础,那么写法为:FROM scratch,接下来所写的指令将作为镜像的第一层开始
语法格式 | 示例 | 备注 |
---|---|---|
FROM |
FROM mysql | |
FROM |
FROM mysql:5.6 | tag是可选的 |
FROM |
FROM mysql:xxxxxxxxx | digest是可选的 |
使用docker images --digests可以显式digest
[root@test25 ~]# docker images --digests
……
java 8-jdk sha256:c1ff613e8ba25833d2e1940da0940c3824f03f802c449f3d1815a66b7f8c0e9d d23bdf5b1b1b 19 months ago 643MB
#RUN
RUN 指令将在当前镜像基础上执行指定命令,并提交为新的镜像,构建时执行,区别于CMD,CMD在容器启动的时候运行
语法格式 | 示例 | 备注 |
---|---|---|
RUN |
RUN /bin/bash -c ‘source $HOME/.bashrc; echo $HOME’ | shell执行,RUN后面直接跟shell命令 |
RUN [“executable”, “param1”, “param2”] | RUN ["/bin/bash", “-c”, “echo hello”] | exec执行,类似于函数调用 |
注意
可能apt-get是run使用频率最高的应用,因为它安装了包,注意以下两点
RUN apt-get update && apt-get install -y \
package-bar
RUN 指令可以使用管道
RUN wget -O - https://some.site | wc -l > /number
构建容器后调用,也就是在容器启动时才进行调用。
语法格式 | 示例 | 备注 |
---|---|---|
CMD [“executable”,“param1”,“param2”] | CMD ["/usr/bin/wc","–help"] | 执行可执行文件,优先 |
CMD [“param1”,“param2”] | CMD ["- -help"] | 设置了ENTRYPOINT,则直接调用ENTRYPOINT添加参数 |
CMD command param1 param2 | CMD echo “This is a test.” | wc - | 执行shell内部命令 |
注意:
用于为镜像指定标签,添加元数据
语法格式 | 示例 | 备注 |
---|---|---|
LABEL |
LABEL version=“1.0” | 多个LABEL最好就写成一行,如太长需要换行的话则使用\符号 |
注意:
指定于外界交互的端口,即容器在运行时监听的端口
语法格式 | 示例 | 备注 |
---|---|---|
EXPOSE |
EXPOSE 8081 8082 |
注意:
设置环境变量
语法格式 | 示例 | 备注 |
---|---|---|
ENV |
ENV name yuling | 一次设置一个 |
ENV |
ENV name=yueling age=100 | 一次设置多个 |
一个复制命令将本地文件复制到容器中,tar类型文件会自动解压。可以访问网络资源,类似wget
语法格式 | 示例 | 备注 |
---|---|---|
ADD |
ADD hom* /mydir/ ADD test relativeDir/ |
示例为通配、绝对路径 相对路径 |
ADD [" |
ADD “test a” “/absoluteDir/” | 示例为带空格、绝对路径 |
注意:
与Dockerfile不在同一目录的文件怎么使用ADD命令?
比如docker build -t test-image:latest -f /src/build/Dockerfile /src
Dockerfile必须在context即“/src:目录或其子目录。假如/src有两个目录build和code,Dockerfile在/src/build下,你要把code目录加进去,在Dockerfile里就可以写"ADD code /code"
复制命令,功能类似ADD,但是不会自动解压文件,也不能访问网络资源
语法格式 | 示例 | 备注 |
---|---|---|
COPY |
COPY hom* /mydir/ COPY test relativeDir/ |
示例为通配、绝对路径 相对路径 |
COPY [" |
COPY “test a” “/absoluteDir/” | 示例为带空格、绝对路径 |
注意:
启动时的默认命令,配置给容器一个可执行的命令,这意味着在每次使用镜像创建容器时一个特定的应用程序可以被设置为默认程序。同时也意味着该镜像每次被调用时仅能运行指定的应用。ENTRYPOINT与CMD非常类似,不同的是通过docker run执行的命令不会覆盖ENTRYPOINT,而docker run命令中指定的任何参数,都会被当做参数再次传递给ENTRYPOINT。Dockerfile中只允许有一个ENTRYPOINT命令,指定多个时靠后的设置会覆盖前面的设置,而只执行最后的ENTRYPOINT指令
语法格式 | 示例 | 备注 |
---|---|---|
ENTRYPOINT [“executable”, “param1”, “param2”] | ENTRYPOINT [“top”, “-b”] | |
ENTRYPOINT command param1 param2 | ENTRYPOINT top -b |
与CMD比较:
用于指定持久化目录,实现挂载功能,授权访问从容器内到主机上的目录。用于containers之间共享数据,将本地文件夹或者其他容器中的文件夹挂在到这个容器中等
语法格式 | 示例 | 备注 |
---|---|---|
VOLUME ["/path/to/dir"] | VOLUME ["/var/log/"] VOLUME /var/log VOLUME /var/log /var/db |
["/path/to/dir"]可以是一个JsonArray ,也可以是多个值 |
注意:
指定运行容器时的用户名或UID,后续的 RUN 也会使用指定用户。使用USER指定用户时,可以使用用户名、UID或GID,或是两者的组合。当服务不需要管理员权限时,可以通过该命令指定运行用户。并且可以在之前创建所需要的用户
语法格式 | 示例 | 备注 |
---|---|---|
USER user[:group] | USER spotlight | 使用spotlight用户 |
USER uid[:gid] |
注:
类似于cd命令。设置工作目录,对RUN,CMD,ENTRYPOINT,COPY,ADD生效。如果不存在则会创建,也可以设置多次。
语法格式 | 示例 | 备注 |
---|---|---|
WORKDIR /path/to/workdir | WORKDIR /root WORKDIR child |
最后的工作目录是/root/child |
注意:
设置变量命令,用于指定传递给构建运行时的变量。ARG命令定义了一个变量,在docker build创建镜像的时候,使用 --build-arg
语法格式 | 示例 | 备注 |
---|---|---|
ARG |
ARG name ARG age=100 |
注意:
用于设置镜像触发器
语法格式 | 示例 | 备注 |
---|---|---|
ONBUILD [INSTRUCTION] | ONBUILD ADD . /app/src ONBUILD RUN /usr/local/bin/python-build --dir /app/src |
注意:
当所构建的镜像被用做其它镜像的基础镜像,该镜像中的触发器将会被钥触发
只对当前镜像的子镜像生效。
比如当前镜像为A,在Dockerfile种添加:ONBUILD RUN ls -al 这个 ls -al 命令不会在A镜像构建或启动的时候执行,此时有一个镜像B是基于A镜像构建的,那么这个ls -al 命令会在B镜像构建的时候被执行。
该STOPSIGNAL指令设置将发送到容器的系统调用信号以退出。此信号可以是与内核的系统调用表中的位置匹配的有效无符号数,例如9,或SIGNAME格式的信号名,例如SIGKILL
语法格式 | 示例 | 备注 |
---|---|---|
STOPSIGNAL signal | STOPSIGNAL 9 |
#HEALTHCHECK
HEALTHCHECK指令告诉Docker如何测试容器以检查它是否仍在工作。即使服务器进程仍在运行,这也可以检测到陷入无限循环且无法处理新连接的Web服务器等情况。
当容器指定了运行状况检查时,除了正常状态外,它还具有运行状况。这个状态最初是starting。每当健康检查通过时,它就会变成healthy(以前的状态)。经过一定数量的连续失败后,它就变成了unhealthy
语法格式 | 示例 | 备注 |
---|---|---|
HEALTHCHECK [OPTIONS] CMD command | 通过在容器内运行命令来检查容器运行状况 | |
HEALTHCHECK NONE | 禁用从基础映像继承的任何运行状况检查 |
SHELL指令允许覆盖用于shell形式的命令的默认shell 。Linux上的默认shell是["/bin/sh", “-c”],而在Windows上[“cmd”, “/S”, “/C”]。
语法格式 | 示例 | 备注 |
---|---|---|
SHELL [“executable”, “parameters”] | SHELL [“powershell”, “-command”] |
维护者信息
语法格式 | 示例 | 备注 |
---|---|---|
MAINTAINER |
MAINTAINER yueling |
~不足之处请指正 ~