DockerFile

Dockerfile 概述

Dockerfile是由一系列命令和参数构成的脚本,这些命令应用于基础镜像并最终创建一个新的镜像。它们简化了从头到尾的流程并极大的简化了部署工作。Dockerfile从FROM命令开始,紧接着跟随者各种方法,命令和参数。其产出为一个新的可以用于创建容器的镜像。

Dockerfile官方文档概述
Docker can build images automatically by reading the instructions from a Dockerfile. A Dockerfile is a text document that contains all the commands a user could call on the command line to assemble an image. Using docker build users can create an automated build that executes several command-line instructions in succession. (附Google翻译:Docker可以通过读取Dockerfile中的指令自动构建图像。 Dockerfile是一个文本文档,其中包含用户可以在命令行上调用以组合图像的所有命令。 使用docker构建用户可以创建一个连续执行多个命令行指令的自动构建。)

Dockerfile 基本结构

Dockerfile 分为四部分:基础镜像信息、维护者信息、镜像操作指令和容器启动时执行指令。

Dockerfile 用法

  1. docker build . # 请注意后面的 . ,表示build当前目录下的Dockerfile

参考情形

  1. $ docker build .
  2. Sending build context to Docker daemon 6.51 MB
  3. ...

警告:不要使用根目录/作为PATH,因为它会导致构建将硬盘驱动器的所有内容传输到Docker守护程序。

  • 如果在COPY或者ADD的时候有文件需要忽略,则可将文件放入 .dockerignore 中,类似Git处理。

  • Build时将Dockerfile和所需文件复制到一个空的目录,再到这个目录进行构建,防止意外发生。

  • 一般的,Dockerfile位于context的根中。但使用-f标志可指定Dockerfile的位置。

    1. docker build -f /path/to/a/Dockerfile .
  • 如果build成功,您可以指定要保存新image的repository和tag

    1. docker build -t shykes/myapp .
  • 要在构建后将image标记为多个repositories,请在运行构建命令时添加多个-t参数:

    1. docker build -t shykes/myapp:1.0.2 -t shykes/myapp:latest .

    Docker守护程序一个接一个地运行Dockerfile中的指令,如果需要,将每个指令的结果提交到一个新image,最后输出新映像的ID。Docker守护进程将自动清理您发送的context。

Dockerfile 示例

以下示例来自 Docker官方文档

  1. # Nginx
  2. #
  3. # VERSION 0.0.1
  4. FROM ubuntu
  5. LABEL Description="This image is used to start the foobar executable" Vendor="ACME Products" Version="1.0"
  6. RUN apt-get update && apt-get install -y inotify-tools nginx apache2 openssh-server
  1. # Firefox over VNC
  2. #
  3. # VERSION 0.3
  4. FROM ubuntu
  5. # Install vnc, xvfb in order to create a 'fake' display and firefox
  6. RUN apt-get update && apt-get install -y x11vnc xvfb firefox
  7. RUN mkdir ~/.vnc
  8. # Setup a password
  9. RUN x11vnc -storepasswd 1234 ~/.vnc/passwd
  10. # Autostart firefox (might not be the best way, but it does the trick)
  11. RUN bash -c 'echo "firefox" >> /.bashrc'
  12. EXPOSE 5900
  13. CMD ["x11vnc", "-forever", "-usepw", "-create"]
  1. # Multiple images example
  2. #
  3. # VERSION 0.1
  4. FROM ubuntu
  5. RUN echo foo > bar
  6. # Will output something like ===> 907ad6c2736f
  7. FROM ubuntu
  8. RUN echo moo > oink
  9. # Will output something like ===> 695d7793cbe4
  10. # You'll now have two images, 907ad6c2736f with /bar, and 695d7793cbe4 with
  11. # /oink.

Docker 主要指令及用法

Format [格式]

  1. INSTRUCTION arguments # 指令 内容
  • 指令不区分大小写,不过一般建议用大写
  • Dockerfile的第一个指令必须为 FROM
  • 以 # 开头的为注释,除了解析器指令(Parser directives),不支持连续注释符。

Parser directives [解析器指令]

escape

Environment replacement [环境变量]

Docker 中的 ENV 指令用以定义镜像的环境变量,如下示例

  1. RUN set -ex && apt-get update && apt-get install -y iputils-ping
  2. ENV PATH /usr/local/bin:$PATH
  3. ENV LANG C.UTF-8
  4. ENV TERM xterm
  5. ENV PYTHON_VERSION 3.5.3
  6. ENV name1=ping name2=on_ip
  7. CMD $name1 $name2

定义环境变量的同时可以引用已经定义的环境变量
可直接引用的环境变量有:

  • Home 用户主目录
  • HOSTNAME 默认容器的主机名
  • PATH
  • TERM 默认xterm

由于镜像的层次文件系统,ENV定义的环境变量在后续的层次中才能被应用,示例如下:

  1. ENV abc=hello
  2. ENV abc=bye def=$abc
  3. ENV ghi=$abc
  4. # 上述结果:def=hello,ghi=bye

进入容器实例,用env命令可查看该容器支持哪些环境变量

  1. env

环境变量在Dockerfile中用$variable_name或${variable_name}表示。它们被等同对待,并且括号语法通常用于解决不带空格的变量名的问题,例如${foo}_bar。
${variable_name}语法还支持以下指定的一些标准bash修饰符:
${variable:-word}表示如果设置了variable,则结果将是该值。如果variable未设置,那么word将是结果。
${variable:+word}表示如果设置了variable,那么word将是结果,否则结果是空字符串。
在所有情况下,word可以是任何字符串,包括额外的环境变量。
可以通过在变量之前添加\来转义:\$foo或\${foo},分别转换为$foo和${foo}。

其他参考示例:

  1. FROM busybox
  2. ENV foo /bar
  3. WORKDIR ${foo} # WORKDIR /bar
  4. ADD . $foo # ADD . /bar
  5. COPY \$foo /quux # COPY $foo /quux

Docker以下指令支持环境变量

  • ADD
  • COPY
  • ENV
  • EXPOSE
  • FORM
  • LABEL
  • STOPSIGNAL
  • USER
  • VOLUME
  • WORKDIR

  • ONBUILD(与上面指令之一组合时)

    在1.4之前,ONBUILD指令不支持环境变量,即使与上面列出的任意指令相结合。

.dockerignore file

类似 .gitignore ,此处暂略,后期补上。

FROM

  1. FROM <image> [AS <name>]

or

  1. FROM <image>[:<tag>] [AS <name>]

or

  1. FROM <image>[@<digest>] [AS <name>]

FORM 指令用于初始化镜像并为后续指令提供基本镜像。因此,有效的Docker必须以FROM指令开头,镜像可以是任何有效镜像,可以从公共镜像仓库中拉取。

  • ARG 是Dockerfile中唯一一个可以在 FROM 之前的指令,参考理解ARG和FROM如何相互影响
  • FROM 可以在一个Dockerfile出现多次以创建多个镜像,只需记下每个新的FROM命令之前由提交输出的最后一个Image ID,每个 FROM 指令会清楚先前指令创建的任何状态。
  • 【翻译不来】Optionally a name can be given to a new build stage by adding AS name to the FROM instruction. The name can be used in subsequent FROM and COPY —from= instructions to refer to the image built in this stage.
  • tag 和 digest 的值是可选的,如果省略任意一个,构建器将默认设置为 latest,如果不能找到 tag 的值,构建器将返回错误

Understand how ARG and FROM interact

FROM 指令支持用 ARG 指令声明的出现在第一个 FROM 之前的变量。

  1. ARG CODE_VERSION=latest
  2. FROM base:${CODE_VERSION}
  3. CMD /code/run-app
  4. FROM extras:${CODE_VERSION}
  5. CMD /code/run-extras

ARG 指令定义在FROM创建镜像之前,所以它不能用于任何FROM之后的指令,要使用第一个FROM之前声明的ARG指令的默认值,请使用不在构建阶段内的ARG指令。

  1. ARG VERSION=latest
  2. FROM busybox:$VERSION
  3. ARG VERSION
  4. RUN echo $VERSION > image_version

MAINTAINER

  1. MAINTAINER <name>
  • 用户设置生成该image的作者信息
    参考示例:
    1. MAINTAINER bill <bill@email.com

RUN

参考资料

文档更新时间: 2018-08-28 17:14   作者:Seeker