Dockerfile 指令说明

/ linux / 1 条评论 / 118浏览

最近在看Docker 技术入门与实践, 在此做个笔记.

然后

大! 家! 中! 秋! 快! 乐!

Dockerfile指令

指令说明
FROM指定创建镜像的基础镜像
MAINTAINER指定维护者信息
RUN运行命令
CMD指定启动容器时默认执行的命令
LABEL指定生成镜像的元数据标签信息
EXPOSE声明镜像内服务所监听的端口
ENV指定环境变量
ADD复制指定的 <src> 路径下的内容到容器的 <dest> 路径下, src 可以为URL;如果为tar文件, 会自动解压到 <dest> 路径下
COPY复制本地主机的 <src> 路径下的内容到镜像中的<dest> 路径下;一般情况下推荐使用COPY, 而不是ADD
ENTRYPOINT指定镜像的默认入口
VOLUME创建数据卷挂载点
USER指定运行容器时的用户或UID
WORKDIR配置工作目录
ARG指定镜像内使用的参数(例如版本号信息等)
ONBUILD配置当前所创建的镜像作为其他镜像的基础镜像时,所执行的创建操作指令
STOPSIGNAL容器退出的信号值
HEALTHCHECK如何进行健康检查
SHELL指定使用shell时的默认shell类型

Demo

FROM

指定所创建镜像的基础镜像, 如果本地不存在, 则默认会去Docker Hub下载指定的镜像. 格式为FROM<image>, 或FROM<image>:<tag>, 或FROM<image>@<digest>.

任何Dockerfile中的第一条指令必须为FROM指令. 并且, 如果同一个Dockerfile中创建多个镜像, 可以使用多个FROM指令(每个镜像一次).

MAINTAINER

指定维护者信息, 格式为MAINTAINER<name>. 例如: MAINTAINER image_creator@docker.com 该信息会写入生成镜像的Author属性域中.

RUN

运行指定的命令.

格式为RUN<cmmand>RUN ["executable", "param1", "param2"]. 注意, 后一个指令会被解析为Json数组, 因此必须用双引号.

前者默认将在shell终端中运行命令, 即 /bin/sh -c; 后者则使用exec执行, 不会启动shell环境.

指定使用其他终端类型可以通过第二种方式实现.例如 RUN ["/bin/bash", "-c", "echo hello"] .

每条RUN 指令将在当前镜像的基础上执行指定命令, 并提交为新的镜像. 当命令较长时可以使用 \来换行. 例如:

RUN apt-get update \
    && apt-get install -y libsnappy-dev zliblg-dev libbz2-dev \
    && rm -rf /var/cache/apt

CMD

CMD指令用来指定启动容器时默认执行的命令. 它支持三种格式:

每个Dockerfile只能有一条CMD命令, 如果指定了多条命令, 只有最后一条会被执行.

如果用户启动容器时手动指定了运行的命令(作为run的参数), 则会覆盖掉CMD指定的命令.

LABEL

LABEL 指令用来指定生成镜像的元数据标签信息

格式为 LABEL <key>=<value> <key>=<value> <key>=<value> ....

例如:

LABEL version="1.0"
LABEL description="This text illustrates \ that label-values can span multiple lines."

EXPOSE

声明镜像内服务所监听的端口.

格式为EXPOSE <port> [<port>...].

例如:

EXPOSE 22 80 8443

注意, 该指令只是起到声明作用, 并不会自动完成端口映射.

在启动容器时需要使用 -P, Docker主机会自动分配一个宿主机的临时端口转发到指定的端口; 使用-p, 则可以具体指定哪个宿主机的本地端口会映射过来.

ENV

指定环境变量, 在镜像生成过程中会被后续```RUN``指令使用, 在镜像启动的容器中也会存在.

格式为 ENV<key><value> 或 ENV<key>=<value>.

例如:

ENV PG_MAJOR 9.3
ENV PG_VERSION 9.3.4
RUN curl -SL http://example.com/postgres-$PG_VERSION.tar.xz | tar -xJC /usr/src/postgress && ...
ENV PATH /usr/local/postgres-$PG_MAJOR/bin:$PATH

指令指定的环境变量在运行时可以被覆盖掉, 如 docker run -env <key>=<value> built_image

ADD

该命令将复制指定的<src> 路径下的内容到容器中的<dest>路径下.

格式为ADD<src> <dest>

其中<src>可以时 Dockerfile所在目录的一个相对路径(文件或目录), 也可以是一个URL, 还可以是一个 tar 文件(如果为tar文件,会自动解压到<dest>路径下). <dest>可以是镜像内的绝对路径, 或者相对于工作目录(WORKDIR)的相对路径.

路径支持正则格式, 例如:

ADD *.c /code/

COPY ### `

格式为COPY <src> <dest>.

复制本地主机的 <src> (为Dockerfile所在目录的相对路径, 文件或目录)下的内容到镜像中的<dest>下. 目标路径不存在时, 会自动创建.

路径同样支持正则格式.

当使用本地目录作为源目录时, 推荐使用COPY

ENTRYPOINT

指定镜像的默认入口命令, 该入口命令会在启动容器时作为根命令执行, 所有传入值作为该命令的参数.

支持两种格式:

ENTRYPOINT ["executable", "param1", "param2"] (exec调用执行)
ENTRYPOINT command param1 param2(shell中执行)

此时, CMD指令指定值将作为根命令的参数

每个Dockerfile 中只能有一个ENTRYPOINT, 当指定多个时, 只有最后一个有效.

在运行时, 可以被--entrypoint参数覆盖掉, 如docker run --entrypoint.

VOLUME

创建一个数据卷挂载点.

格式为VOLUME ["/data"]

可以从本地主机或其他容器挂载数据卷, 一般用来存放数据库和需要包存的数据等.

USER

指定运行容器时的用户名或UID, 后续的RUN 等指令椰辉使用指定的用户身份.

格式为 USER daemon

当服务不需要管理员权限时, 可以通过该命令指定运行用户, 并且可以在之前创建所需要的用户.例如:

RUN groupadd -r postgres && useradd -r -g postgres postgres

要临时获取管理员权限可以使用 gosusudo.

WORKDIR

为后续的 RUN, CMDENTRYPOINT指令配置工作目录.

格式为 WORKDIR /path/to/workdir.

可以使用多个WORKDIR 指令, 后续命令如果参数是相对路径, 则会基于之前命令指定的路径; 例如:

WORKDIR /a
WORKDIR b
WORKDIR c
RUN pwd

则最终路径为/a/b/c.

ARG

指定一些镜像内使用的参数(例如版本号信息等), 这些参数在执行docker build命令时才以 --build-arg<varname>=<value>格式传入.

格式为 ARG<name>[=<default value>].

则可以用docker build --build-arg<name>=<value> . 来指定参数值.

ONBUILD

配置当所创建的镜像作为其他镜像的基础镜像时,所执行的创建操作指令.

格式为ONBUILD [INSTRUCTRION].

例如, Dockerfile 使用如下的内容创建了镜像image-A:

[...]
ONBUILD ADD . /app/src
ONBUILD RUN /usr/local/bin/python-build --dir /app/src
[...]

如果基于image-A创建新的镜像时, 新的 Dockerfile 中使用FROM image-A指定基础镜像, 会自动执行ONBUILD指令的内容, 等价于在后面添加了两条指令:

FROM image-A
# Automatically run the following
ADD . /app/src
RUN /usr/local/bin/python-build --dir /app/src

使用ONBUILD指令的镜像, 推荐在标签中注明, 例如 ruby:1.9-onbuild.

STOPSIGNAL

指定所创建镜像启动的容器接受退出的信号值. 例如:

STOPSIGNAL signal

HEALTHCHECK

配置所启动容器如何进行健康检查(如何判断健康与否), 自Docker 1.12开始支持.

格式有两种:

OPTION支持:

SHELL

指定其他命令使用shell时的默认shell类型.

SHELL ["executable", "parameters"]

默认值为["bin/sh", "-c"].

注意: 对于Windows系统, 建议在Dockerfile 开头添加 # escape=`来指定转义信息
参考书籍: Docker技术入门与实践
  1. 中!秋!节!快!乐!

    回复