Docker Dockerfile

甚么是 Dockerfile?

Dockerfile 是一个用来构建镜像的文本文件,文本内容包罗了一条条构建镜像所需的指令和申明。

利用 Dockerfile 定制镜像

这里仅讲授若何运转 Dockerfile 文件来定制一个镜像,详细 Dockerfile 文件内指令详解,将鄙人一节中先容,这里你只需晓得构建的流程便可。

1、上面以定制一个 nginx 镜像(构建好的镜像内会有一个 /usr/share/nginx/html/index.html 文件)

在一个空目次下,新建一个名为 Dockerfile 文件,并在文件内增加以下内容:

FROM nginx
RUN echo '这是一个本地构建的nginx镜像' > /usr/share/nginx/html/index.html

2、FROM 和 RUN 指令的感化

FROM:定制的镜像都是基于 FROM 的镜像,这里的 nginx 便是定制须要的根本镜像。后续的操纵都是基于 nginx。

RUN:用于履行前面随着的号令行号令。有以下俩种格局:

shell 格局:

RUN <号令行号令>
# <号令行号令> 同即是,在终端操纵的 shell 号令。

exec 格局:

RUN "可履行文件", "参数1", "参数2"
# 比方:
# RUN "./test.php", "dev", "offline" 等价于 RUN ./test.php dev offline

注重:Dockerfile 的指令每履行一次城市在 docker 上新建一层。以是过量有意义的层,会形成镜像收缩过大。比方:

FROM centos
RUN yum install wget
RUN wget -O redis.tar.gz "//download.redis.io/releases/redis-5.0.3.tar.gz"
RUN tar -xvf redis.tar.gz
以上履行会建立 3 层镜像。可简化为以下格局:
FROM centos
RUN yum install wget \
    && wget -O redis.tar.gz "//download.redis.io/releases/redis-5.0.3.tar.gz" \
    && tar -xvf redis.tar.gz

如上,以 && 标记毗连号令,如许履行后,只会建立 1 层镜像。

起头构建镜像

在 Dockerfile 文件的寄存目次下,履行构建举措。

以下示例,经由历程目次下的 Dockerfile 构建一个 nginx:test(镜像称号:镜像标签)。

:最初的 . 代表本次履行的高低文途径,下一节会先容。

$ docker build -t nginx:test .

以上显现,申明已构建胜利。

高低文途径

上一节中,有提到指令最初一个 . 是高低文途径,那末甚么是高低文途径呢?

$ docker build -t nginx:test .

高低文途径,是指 docker 在构建镜像,偶然候想要利用到本机的文件(比方复制),docker build 号令得悉这个途径后,会将途径下的一切内容打包。

剖析:由于 docker 的运转形式是 C/S。咱们本机是 C,docker 引擎是 S。现实的构建历程是在 docker 引擎下实现的,以是这个时辰没法用到咱们本机的文件。这就须要把咱们本机的指定目次下的文件一路打包供给给 docker 引擎利用。

若是未申明最初一个参数,那末默许高低文途径便是 Dockerfile 地点的地位。

注重:高低文途径下不要放无用的文件,由于会一路打包发送给 docker 引擎,若是文件过量会形成历程迟缓。


指令详解

COPY

复制指令,从高低文目次中复制文件或目次到容器里指定途径。

格局:

COPY --chown=<user>:<group> <源途径1>...  <方针途径>
COPY --chown=<user>:<group> "<源途径1>",...  "<方针途径>"

--chown=<user>:<group>:可选参数,用户转变复制到容器内文件的具有者和属组。

<源途径>:源文件或源目次,这里能够是通配符抒发式,其通配符法则要知足 Go 的 filepath.Match 法则。比方:

COPY hom* /mydir/
COPY hom?.txt /mydir/

<方针途径>:容器内的指定途径,该途径不必事前建好,途径不存在的话,会主动建立。

ADD

ADD 指令和 COPY 的利用格局分歧(一样须要下,官方保举利用 COPY)。功效也近似,差别的地方以下:

  • ADD 的长处:在履行 &lt源文件&gt 为 tar 紧缩文件的话,紧缩格局为 gzip, bzip2 和 xz 的情况下,会主动复制并解压到 <方针途径>。
  • ADD 的错误谬误:在不解压的条件下,没法复制 tar 紧缩文件。会令镜像构建缓存失效,从而能够会令镜像构建变得比拟迟缓。详细是不是利用,能够按照是不是须要主动解压来决议。

CMD

近似于 RUN 指令,用于运转法式,但两者运转的时辰点差别:

  • CMD 在docker run 时运转。
  • RUN 是在 docker build。

感化:为启动的容器指定默许要运转的法式,法式运转竣事,容器也就竣事。CMD 指令指定的法式可被 docker run 号令行参数中指定要运转的法式所笼盖。

注重:若是 Dockerfile 中若是存在多个 CMD 指令,仅最初一个失效。

格局:

CMD <shell 号令> 
CMD "<可履行文件或号令>","<param1>","<param2>",... 
CMD "<param1>","<param2>",...  # 该写法是为 ENTRYPOINT 指令指定的法式供给默许参数

保举利用第二种格局,履行历程比拟明白。第一种格局现实上在运转的历程中也会主动转换成第二种格局运转,并且默许可履行文件是 sh。

ENTRYPOINT

近似于 CMD 指令,但其不会被 docker run 的号令行参数指定的指令所笼盖,并且这些号令行参数会被看成参数送给 ENTRYPOINT 指令指定的法式。

可是, 若是运转 docker run 时利用了 --entrypoint 选项,此选项的参数可看成要运转的法式笼盖 ENTRYPOINT 指令指定的法式。

长处:在履行 docker run 的时辰能够指定 ENTRYPOINT 运转所需的参数。

注重:若是 Dockerfile 中若是存在多个 ENTRYPOINT 指令,仅最初一个失效。

格局:

ENTRYPOINT "<executeable>","<param1>","<param2>",...

能够搭配 CMD 号令利用:普通是变参才会利用 CMD ,这里的 CMD 即是是在给 ENTRYPOINT 传参,以下示例会提到。

示例:

假定已由历程 Dockerfile 构建了 nginx:test 镜像:

FROM nginx

ENTRYPOINT "nginx", "-c" # 定参
CMD "/etc/nginx/nginx.conf" # 变参 

1、不传参运转

$ docker run  nginx:test

容器内会默许运转以下号令,启动主历程。

nginx -c /etc/nginx/nginx.conf

2、传参运转

$ docker run  nginx:test -c /etc/nginx/new.conf

容器内会默许运转以下号令,启动主历程(/etc/nginx/new.conf:假定容器内已有此文件)

nginx -c /etc/nginx/new.conf

ENV

设置情况变量,界说了情况变量,那末在后续的指令中,就能够利用这个情况变量。

格局:

ENV <key> <value>
ENV <key1>=<value1> <key2>=<value2>...

以下示例设置 NODE_VERSION = 7.2.0 , 在后续的指令中能够经由历程 $NODE_VERSION 援用:

ENV NODE_VERSION 7.2.0

RUN curl -SLO "//nodejs.org/dist/v$NODE_VERSION/node-v$NODE_VERSION-linux-x64.tar.xz"   && curl -SLO "//nodejs.org/dist/v$NODE_VERSION/SHASUMS256.txt.asc"

ARG

构建参数,与 ENV 感化一至。不过感化域不一样。ARG 设置的情况变量仅对 Dockerfile 内有用,也便是说只要 docker build 的历程中有用,构建好的镜像内不存在此情况变量。

构建号令 docker build 中能够用 --build-arg <参数名>=<值> 来笼盖。

格局:

ARG <参数名>=<默许值>

VOLUME

界说匿名数据卷。在启动容器时忘挂念载数据卷,会主动挂载到匿名卷。

感化:

  • 防止主要的数据,因容重视启而丧失,这长短常致命的。
  • 防止容器不时变大。

格局:

VOLUME "<途径1>", "<途径2>"...
VOLUME <途径>

在启动容器 docker run 的时辰,咱们能够经由历程 -v 参数点窜挂载点。

EXPOSE

仅仅只是申明端口。

感化:

  • 赞助镜像利用者懂得这个镜像办事的保护端口,以便利设置装备摆设映照。
  • 在运转时利用随机端口映照时,也便是 docker run -P 时,会主动随机映照 EXPOSE 的端口。

格局:

EXPOSE <端口1> <端口2>...

WORKDIR

指定任务目次。用 WORKDIR 指定的任务目次,会在构建镜像的每层中都存在。(WORKDIR 指定的任务目次,必须是提早建立好的)。

docker build 构建镜像历程中的,每个 RUN 号令都是新建的一层。只要经由历程 WORKDIR 建立的目次才会一向存在。

格局:

WORKDIR <任务目次途径>

USER

用于指定履行后续号令的用户和用户组,这边只是切换后续号令履行的用户(用户和用户组必须提早已存在)。

格局:

USER <用户名>:<用户组>

HEALTHCHECK

用于指定某个法式或指令来监控 docker 容器办事的运转状态。

格局:

HEALTHCHECK 选项 CMD <号令>:设置查抄容器安康状态的号令
HEALTHCHECK NONE:若是根本镜像有安康查抄指令,利用这行能够屏障掉其安康查抄指令

HEALTHCHECK 选项 CMD <号令> : 这边 CMD 前面跟从的号令利用,能够参考 CMD 的用法。

ONBUILD

用于提早构建号令的履行。简略的说,便是 Dockerfile 里用 ONBUILD 指定的号令,在本次构建镜像的历程中不会履行(假定镜像为 test-build)。当有新的 Dockerfile 利用了之前构建的镜像 FROM test-build ,这是履行新镜像的 Dockerfile 构建时辰,会履行 test-build 的 Dockerfile 里的 ONBUILD 指定的号令。

格局:

ONBUILD <别的指令>