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

常用指令:FROM、CMD、RUN、EXPOSE、ENV、WORKDIR等

FROM

指定基础镜像,必须为第一个指令,可使用多个FROM,尽量使用官方提供的image

RUN

执行命令,常用于安装所需文件,复杂的RUN建议使用\&&合并成一行,减少无意义分层

FROM centos
RUN yum install wget
RUN wget -O redis.tar.gz "http://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 "http://download.redis.io/releases/redis-5.0.3.tar.gz" \
    && tar -xvf redis.tar.gz

WORKDIR

指定工作目录

WORKDIR /workspace/

注意:通过WORKDIR设置工作目录后,Dockerfile中其后的命令RUN、CMD、ENTRYPOINT、ADD、COPY等命令都会在该目录下执行。在使用docker run运行容器时,可以通过-w参数覆盖构建时所设置的工作目录。

ADD和COPY

将复制上下文目录文件复制到容器指定路径,ADD可将压缩文件自动解压至目标目录,大部分情况COPY优于ADD

LABEL

定义镜像的元数据,类似于注释

EXPOSE

声明端口,在运行时使用随机端口映射时,也就是 docker run -P 时,会自动随机映射 EXPOSE 的端口

ENV

设置环境变量,可在后续指令中使用

ENV MYSQL_VERSION 5.6      # 设置环境变量
RUN apt-get install -y mysql-server = "${MYSQL_VERSION}" \
		$$ rm -rf /var/lib/apt/lists/*      # 引用

VOLUME

指定容器挂载目录,docker run的时候,可以通过 -v 参数修改挂载点

ENTRYPOINT

类似于CMD指令,但其不会被 docker run 的命令行参数指定的指令所覆盖,而且这些命令行参数会被当作参数送给ENTRYPOINT指令指定的程序。
但是, 如果运行 docker run时使用了 --entrypoint选项,将覆盖 CMD 指令指定的程序。
注意:如果 Dockerfile 中如果存在多个ENTRYPOINT 指令,仅最后一个生效。

CMD

类似于RUN指令,用于运行程序,但CMDdocker run时运行,RUN 是在 docker build
注意:CMD指令指定的程序可被docker run 命令行参数中指定要运行的程序所覆盖;如果Dockerfile 中如果存在多个CMD 指令,仅最后一个生效。

MAINTAINER

添加维护者信息

MAINTAINER John

Q.E.D.


Nothing really matters to me!