镜像的定制实际上就是定制每一层所添加的配置、文件。我们可以把每一层修改、安装、构建、操作的命令都写入一个脚本,这个脚本就叫做Dockerfile。
Dockerfile是一个文本文件,其内包含了一条条指令,每一条指令构建一层,因此每一条指令的内容,就是描述该层应当如何构建。
创建Dockerfile
首先创建一个目录,然后在该目录里面创建Dockerfile文件。例如:
$ mkdir goweb
$ cd goweb
$ touch Dockerfile
保存Dockerfile
文件的目录,称之为构建环境,也叫构建上下文。Docker会在构建镜像时将构建上下文和该上下文中的文件和目录上传到Docker守护进程。这样Docker守护进程就能直接访问你想在镜像中存储的任何代码、文件或者其他数据。
以下面的文档为例来介绍如何使用:
FROM alpine
MAINTAINER benben <benben@csdn.com>
LABEL maintainer="benben <benben@csdn.com>"
# 原utc时间,修改成cst(中国标准东八区时间)
ENV TZ Asia/Shanghai
RUN apk --update add tzdata ca-certificates && ln -sf /usr/share/zoneinfo/${TZ} /etc/localtime && \
echo ${TZ} > /etc/timezone
WORKDIR /opt/benben-project
COPY benbenProject benbenProject
RUN chmod 755 ./benbenProject
COPY conf/ ./conf
RUN mkdir logs
EXPOSE 8088
CMD ./benbenProject
FROM指定基础镜像
定制镜像,就是以一个镜像为基础,在其上进行定制。一个Dockerfile中FROM
是必不可少的指令,并且必须是第一条指令。用法如下:
FROM [AS ]
FROM [:] [AS ]
FROM [@] [AS ]
基础镜像可以是任何有效的镜像,通过从公共仓库中拉取镜像非常容易。本文的基础镜像是一个面向安全的轻型Linux发行版。
ARG
命令是Dockerfile中唯一可以在FROM
之前的指令,可以参阅随后的ARG和FROM如何交互。FROM
可以在单个Dockerfile中多次出现以创建多个映像,或者使用一个构建层作为另一个构建层的依赖。只需要在每个新的FROM
指令之前记下最后一个commit镜像的id,因为每个FROM
指令会清除事先所有指令创建的状态。tag
和digest
值是可选的,如果省略,则构建镜像时,会默认采用latest
标签。如果找不到,则构建器会返回错误。
除了选择现有镜像为基础镜像外,Docker还存在一个特殊的镜像,scratch
。这个镜像是虚拟的概念,实际并不存在,它表示一个空白的镜像。如果你以scratch
为基础镜像的话,意味着你不以任何镜像为基础。接下来的指令将作为镜像第一层开始。
ARG和FROM如何交互
FROM
指令支持在第一个FROM
之前出现任何ARG
指令声明的变量。例如:
ARG CODE_VERSION=latest
FROM base:${CODE_VERSION}
CMD /code/run-app
FROM extras:${CODE_VERSION}
CMD /code/run-extras
在FROM
指令之前的ARG
指令位于构建阶段之外,因此在FROM
命令之后,是不能使用那些环境变量的。上面指令的第二行可以使用变量CODE_VERSION
,,但第五行就不能使用。因此要想使用在第一个FROM
之前声明的ARG
的默认值,需要使用在构建阶段的ARG
。
ARG VERSION=latest
FROM busybox:$VERSION
ARG VERSION
RUN echo $VERSION > image