Dockerfile 说明

2019-10-30  本文已影响0人  coding400

FROM

FROM <image> [AS <name>]

FROM <image>[:<tag>] [AS <name>]

FROM <image>[@<digest>] [AS <name>]

FROM 指令 初始化一个新的构建阶段,为随后的指令设置了基础镜像。因此一个有效的Dockerfile 文件必须是以 FROM 指令开始的。该 镜像可以是任何有效的镜像,从公共存储库中提取图像特别容易开始。

RUN

RUN <command>

RUN ["executable","param1","param2"]

RUN 指令将执行多个命令在当前镜像的顶部的新的一层,同时提交执行的结果。这个结果将被用做Dockerfile 的下一步

CMD

CMD ["executable","param1","param2"] (exec形式,这是首选形式)
CMD ["param1","param2"] (作为 ENTRYPOINT 的默认值)
CMD command param1 param2 (shell 脚本形式)

一个 Dockerfile 文件中只能有一个 CMD 指令,如果你使用了多个 CMD 指令,那么只有最后一个 CMD 指令会生效。
一个 CMD 指令的主要目是为执行中的 container 容器提供默认值。这些默认值可以包含可执行文件,也可以省略可执行文件,在这种情况下,您还必须指定一条ENTRYPOINT 指令

注意

LABEL

LABEL <key>=<value> <key>=<value> <key>=<value> ...

该LABEL指令将元数据添加到镜像。 LABEL是键值对。要在LABEL值中包含空格,请像在命令行分析中一样使用引号和反斜杠。一些用法示例:

LABEL "com.example.vendor"="ACME Incorporated"
LABEL com.example.label-with-value="foo"
LABEL version="1.0"
LABEL description="This text illustrates \
that label-values can span multiple lines."

EXPOSE

EXPOSE <port>[<port>/<protocol>...]

EXPOSE指令通知Docker容器在运行时监听指定的网络端口。您可以指定端口是侦听TCP还是UDP,如果未指定协议,则默认值为TCP。

该EXPOSE指令实际上并未发布端口。它充当构建映像的人员和运行容器的人员之间的一种** 文档类型 ,有关打算发布哪些端口的信息。要在运行容器时实际发布端口,请使用 -p标记 docker run 来发布和映射一个或多个端口,或者使用-P标记来发布所有公开的端口并将它们映射到高阶端口 **。

默认, EXPOSE 指令使用 TCP 协议. 你也可以指定 UDP:

EXPOSE 80/udp

同时指定 TCP 和 UDP, 包括两行:

EXPOSE 80/tcp
EXPOSE 80/udp

无论 EXPOSE 如何设置,你都需要在运行时使用 -p 来重写

docker run -p 80:80/tcp -p 80:80/udp ...

ENV

ENV <key> <value>
ENV <key>=<value> ...

ENV 指令将环境变量 <key> 设置为 <value> 。此值将在构建阶段中所有后续指令的环境中使用,并且在许多情况下也可替换

ENV 有两种形式。第一种形式 ENV <key> <value> 会将一个变量设置为一个值。第一个空格之后的整个字符串将被视为 <value> ,包含空格字符。第二种形式 ENV <key>=<value> .. 允许一次设置多个变量。

例如:

ENV myName="John Doe" myDog=Rex\ The\ Dog \
    myCat=fluffy

ENV myName John Doe
ENV myDog Rex The Dog
ENV myCat fluffy

将在最终镜像中产生相同的结果

ADD

ADD [--chown=<user>:<group>] <src>... <dest>
ADD [--chown=<user>:<group>] ["<src>",... "<dest>"] (此格式对于包含空格的路径是必需的)

ADD 命令用于从 <src> 中复制 新文件、目录或远程文件的 URLs ,并将它们添加到该路径的镜像文件系统中<dest>。
<src>可以指定多个资源,但是如果它们是文件或目录,则将其路径解释为相对于构建上下文源的路径。每个都<src>可能包含通配符
如:

ADD hom* /mydir/        # adds all files starting with "hom"
ADD hom?.txt /mydir/    # ? is replaced with any single character, e.g., "home.txt"

<dest>是一个绝对路径,或相对于一个路径WORKDIR,到其中的源将在目标容器内进行复制。

ADD test relativeDir/          # adds "test" to `WORKDIR`/relativeDir/
ADD test /absoluteDir/         # adds "test" to /absoluteDir/

** 注意 **:

COPY

COPY [--chown=<user>:<group>] <src>... <dest>
COPY [--chown=<user>:<group>] ["<src>",... "<dest>"] (此格式对于包含空格的路径是必需的)

COPY指令复制新文件或目录<src> ,并将它们添加到路径中容器的文件系统中<dest>。<src>可以指定多个资源,但是文件和目录的路径将被解释为相对于构建上下文的源,每个都<src>可能包含通配符

ENTRYPOINT

ENTRYPOINT ["executable", "param1", "param2"] (exec 形式,首选)
ENTRYPOINT command param1 param2 (shell 形式)

ENTRYPOINT 允许您配置一个可执行的运行中的容器。

docker run -i -t --rm -p 80:80 nginx

docker run <image> 命令将会追加在 exec 形式的 ENTRYPOINT 命令前,同时将覆盖 CMD 中的参数,这里运行通过 -d 来传递参数给 ENTRYPOINT ,也可通过 docker run --entrypoint xx 来覆盖 ENTRYPOINT

shell 形式阻止所有 CMD 命令 或 docker run命令行参数

Dockerfile中,只有最后一条ENTRYPOINT指令才会生效。

VOLUME

VOLUME ["/data"]

该VOLUME指令创建具有指定名称的 mount point(挂载点),并将其标记为保存来自本地主机或其他容器的外部 mounted volumes。该值可以是JSON数组,也可以是VOLUME ["/var/log/"]具有多个参数的纯字符串,例如VOLUME /var/log或VOLUME /var/log /var/db

该docker run命令使用基础映像内指定位置上存在的任何数据初始化新创建的卷

FROM ubuntu
RUN mkdir /myvol
RUN echo "hello world" > /myvol/greeting
VOLUME /myvol

该Dockerfile生成一个镜像,该镜像导致docker run 创建一个新的挂载点/myvol并将该文件复制 到新创建的 VOLUME 中。

WORKDIR

WORKDIR /path/to/workdir

该WORKDIR指令设置工作目录为 RUN,CMD, ENTRYPOINT,COPY和ADD 这些在Dockerfile 中的指令。如果WORKDIR不存在,那么即使以后的任何Dockerfile指令中都没有使用它,也将创建它。

该WORKDIR指令可以在中多次使用Dockerfile。如果提供了相对路径,则它将相对于上一条WORKDIR指令的路径 。例如:

WORKDIR /a
WORKDIR b
WORKDIR c
RUN pwd

执行 RUN 指令后的结果为 /a/b/c
该WORKDIR指令可以解析先前使用设置的环境变量 ENV。您只能使用在中显式设置的环境变量Dockerfile。例如:

ENV DIRPATH /path
WORKDIR $DIRPATH/$DIRNAME
RUN pwd
上一篇下一篇

猜你喜欢

热点阅读