Dockerfile编写

参考:Dockerfile reference

构建

命令docker build从一个Dockerfile文件和生成上下文(build context)中构建镜像,其中生成上下文可以指定为本地目录或者远程Git仓库

构建由Docker守护进程实现,第一步就是将递归复制整个目录到守护进程,所以最好只放置有效文件在生成上下文中

Docker守护进程按照Dockerfile指令进行构建之前,会执行一个Dockerfile的语法检查,如果出错会抛出提示

Error response from daemon: Unknown instruction: xxx

文件位置

通常将Dockerfile文件放置在生成上下文的根路径,也可使用标识符-f指定

# 在根路径
$ docker build .
# 指定文件
$ docker build -f /path/to/Dockerfile .

镜像名

使用标识符-t, --tag list指定生成镜像名,可以同时指定多个,这些镜像名均指向同一个镜像ID

$ docker build -t zjzstu/myapp:1.0.2 -t zjzstu/myapp:latest .
$ docker image ls
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
zjzstu/myapp        1.0.2               5e1153cb35f3        2 minutes ago       109MB
zjzstu/myapp        latest              5e1153cb35f3        2 minutes ago       109MB

中间镜像

Dockerfile的每一条指令都是独立运行,并生成一个新的镜像,所以在上一条指令的路径操作(比如RUN cd /tmp)对下一条指令无效,必须在同一条指令执行(比如RUN cd /tmp && pwd

中间镜像会缓存在本地,如果下次重新构建时发现相同指令,则会重用中间镜像

Dockerfile格式

语法格式如下:

# Comment `#`开头的是注释
INSTRUCTION arguments

指令不是大小写敏感(case-sensitive)的,不过大写指令有助于阅读和理解

Dockerfile文件必须从FROM指令开始,用于指定本次构建的基础镜像

环境变量替换

使用ENV指令创建的环境变量可作用于Dockerfile的其他指令。语法如下:

常用的3种实现如下:

  1. ${variable}_name:构建后替换variable
  2. ${variable:-word}:如果variable被设置,则替换该值;如果变量没有设置,则使用word替代(相当于默认值)
  3. ${variable:+word}:其作用和上条相反,如果variable被设置,则使用word;否则,结果为空字符串

如果${variable}不是环境变量,需要使用转义字符\

FROM busybox
ENV foo /bar
WORKDIR ${foo}   # WORKDIR /bar
ADD . $foo       # ADD . /bar
COPY \$foo /quux # COPY $foo /quux

以下指令支持环境变量替换:

ADD
COPY
ENV
EXPOSE
FROM
LABEL
STOPSIGNAL
USER
VOLUME
WORKDIR
ONBUILD(需要与上面指令组合)