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 用法
docker build . # 请注意后面的 . ,表示build当前目录下的Dockerfile
参考情形
$ docker build .
Sending build context to Docker daemon 6.51 MB
...
警告:不要使用根目录/作为PATH,因为它会导致构建将硬盘驱动器的所有内容传输到Docker守护程序。
如果在COPY或者ADD的时候有文件需要忽略,则可将文件放入 .dockerignore 中,类似Git处理。
Build时将Dockerfile和所需文件复制到一个空的目录,再到这个目录进行构建,防止意外发生。
一般的,Dockerfile位于context的根中。但使用-f标志可指定Dockerfile的位置。
docker build -f /path/to/a/Dockerfile .
如果build成功,您可以指定要保存新image的repository和tag
docker build -t shykes/myapp .
要在构建后将image标记为多个repositories,请在运行构建命令时添加多个-t参数:
docker build -t shykes/myapp:1.0.2 -t shykes/myapp:latest .
Docker守护程序一个接一个地运行Dockerfile中的指令,如果需要,将每个指令的结果提交到一个新image,最后输出新映像的ID。Docker守护进程将自动清理您发送的context。
Dockerfile 示例
以下示例来自 Docker官方文档
# Nginx
#
# VERSION 0.0.1
FROM ubuntu
LABEL Description="This image is used to start the foobar executable" Vendor="ACME Products" Version="1.0"
RUN apt-get update && apt-get install -y inotify-tools nginx apache2 openssh-server
# Firefox over VNC
#
# VERSION 0.3
FROM ubuntu
# Install vnc, xvfb in order to create a 'fake' display and firefox
RUN apt-get update && apt-get install -y x11vnc xvfb firefox
RUN mkdir ~/.vnc
# Setup a password
RUN x11vnc -storepasswd 1234 ~/.vnc/passwd
# Autostart firefox (might not be the best way, but it does the trick)
RUN bash -c 'echo "firefox" >> /.bashrc'
EXPOSE 5900
CMD ["x11vnc", "-forever", "-usepw", "-create"]
# Multiple images example
#
# VERSION 0.1
FROM ubuntu
RUN echo foo > bar
# Will output something like ===> 907ad6c2736f
FROM ubuntu
RUN echo moo > oink
# Will output something like ===> 695d7793cbe4
# You'll now have two images, 907ad6c2736f with /bar, and 695d7793cbe4 with
# /oink.
Docker 主要指令及用法
Format [格式]
INSTRUCTION arguments # 指令 内容
- 指令不区分大小写,不过一般建议用大写
- Dockerfile的第一个指令必须为 FROM
- 以 # 开头的为注释,除了解析器指令(Parser directives),不支持连续注释符。
Parser directives [解析器指令]
escape
Environment replacement [环境变量]
Docker 中的 ENV 指令用以定义镜像的环境变量,如下示例
RUN set -ex && apt-get update && apt-get install -y iputils-ping
ENV PATH /usr/local/bin:$PATH
ENV LANG C.UTF-8
ENV TERM xterm
ENV PYTHON_VERSION 3.5.3
ENV name1=ping name2=on_ip
CMD $name1 $name2
定义环境变量的同时可以引用已经定义的环境变量
可直接引用的环境变量有:
- Home 用户主目录
- HOSTNAME 默认容器的主机名
- PATH
- TERM 默认xterm
由于镜像的层次文件系统,ENV定义的环境变量在后续的层次中才能被应用,示例如下:
ENV abc=hello
ENV abc=bye def=$abc
ENV ghi=$abc
# 上述结果:def=hello,ghi=bye
进入容器实例,用env命令可查看该容器支持哪些环境变量
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}。
其他参考示例:
FROM busybox
ENV foo /bar
WORKDIR ${foo} # WORKDIR /bar
ADD . $foo # ADD . /bar
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
FROM <image> [AS <name>]
or
FROM <image>[:<tag>] [AS <name>]
or
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 之前的变量。
ARG CODE_VERSION=latest
FROM base:${CODE_VERSION}
CMD /code/run-app
FROM extras:${CODE_VERSION}
CMD /code/run-extras
ARG 指令定义在FROM创建镜像之前,所以它不能用于任何FROM之后的指令,要使用第一个FROM之前声明的ARG指令的默认值,请使用不在构建阶段内的ARG指令。
ARG VERSION=latest
FROM busybox:$VERSION
ARG VERSION
RUN echo $VERSION > image_version
MAINTAINER
MAINTAINER <name>
- 用户设置生成该image的作者信息
参考示例:MAINTAINER bill <bill@email.com
RUN
参考资料
- 官方文档: docs.docker.com
- docker容器技术系列五:Dockerfile详解
- Dockerfile命令介绍及实例
- docker-cloud-platform
- 如何写Dockerfile,Dockerfile 参考文档
- Dockerfile中的ENV指令详解
- Docker —— 从入门到实践