# Dockerfile

Dockerfile 是一个用来构建镜像的文本文件

# 简单的例子

FROM nginx
RUN echo '这是一个本地构建的nginx镜像' > /usr/share/nginx/html/index.html

# 指令

# FROM

定制镜像所需要的基础镜像

# RUN

用于执行后面跟着的命令行命令

  • shell 格式 直接的命令格式
  • exec 格式 将命令拆分为数组

# COPY

复制指令,从上下文目录中复制文件或者目录到容器里指定路径。

COPY hom* /mydir/

# ADD

类似于 COPY,官方建议用 COPY,对于压缩文件会自动解压。

# CMD

类似于 RUN,但不同于 RUN。

RUN 作用于 docker build 的过程中
CMD 作用于 docker 运行时

会被 docker run 的命令覆盖,并且有多个 CMD 时,仅最后一个生效

# ENTRYPOINT

类似于 CMD ,但不会被 docker run 的命令覆盖, docker run 的命令可以当做变参传递给 ENTRYPOINT

FROM nginx

ENTRYPOINT ["nginx", "-c"] # 定参
CMD ["/etc/nginx/nginx.conf"] # 变参

相当于

nginx -c /etc/nginx/nginx.conf

传递参数时

docker run  nginx:test -c /etc/nginx/new.conf

相当于

nginx -c /etc/nginx/new.conf

# ENV

设置环境变量,定义了环境变量,那么在后续的指令中,就可以使用这个环境变量。

ENV NODE_VERSION 7.2.0

# ARG

类似于 ENV,仅在 Dockerfile 中有效,镜像内部不存在次环境变量

# VOLUME

定义匿名数据卷。在启动容器时忘记挂载数据卷,会自动挂载到匿名卷。

# EXPOSE

仅仅只是声明端口,当 docker run -P 是,可以自动随机映射端口

# WORKDIR

指定工作目录。用 WORKDIR 指定的工作目录,会在构建镜像的每一层中都存在。(WORKDIR 指定的工作目录,必须是提前创建好的)。

docker build 构建镜像过程中的,每一个 RUN 命令都是新建的一层。只有通过 WORKDIR 创建的目录才会一直存在。

WORKDIR <工作目录路径>

# USER

用于指定执行后续命令的用户和用户组,这边只是切换后续命令执行的用户(用户和用户组必须提前已经存在)。

USER <用户名>[:<用户组>]

# LABEL

LABEL 指令用来给镜像添加一些元数据(metadata),以键值对的形式,语法格式如下:

LABEL org.opencontainers.image.authors="runoob"

# HEALTHCHECK

用于指定某个程序或者指令来监控 docker 容器服务的运行状态。

HEALTHCHECK [选项] CMD <命令>:设置检查容器健康状况的命令
HEALTHCHECK NONE:如果基础镜像有健康检查指令,使用这行可以屏蔽掉其健康检查指令

HEALTHCHECK [选项] CMD <命令> : 这边 CMD 后面跟随的命令使用,可以参考 CMD 的用法。

# ONBUILD

用于延迟构建命令的执行。简单的说,就是 Dockerfile 里用 ONBUILD 指定的命令,在本次构建镜像的过程中不会执行(假设镜像为 test-build)。当有新的 Dockerfile 使用了之前构建的镜像 FROM test-build ,这时执行新镜像的 Dockerfile 构建时候,会执行 test-build 的 Dockerfile 里的 ONBUILD 指定的命令。

ONBUILD <其它指令>