Dockerfile指令

如有问题或建议,请公众号留言

最近更新:

Dockerfile

Dockerfile是一个文本文档。它通常包含了手动执行构建docker镜像的所有指令。Docker可以通过读取Dockerfile中的指令自动构建镜像。

Dockerfile中的指令是不区分大小写的。

.dockerignore文件

增加构建的性能,请通过将.dockerignore文件添加到上下文目录来排除文件和目录。如果.dockerignore文件中的一行以第一#列开头,则此行被视为注释,并在被CLI解释之前被忽略。

匹配是使用Go的 filepath.Match规则完成的。

在构建image时可以使用-f标志来制定任何位置的Dockerfile :

FROM

一个Dockerfile 必须用指令启动。该FROM指令指定您正在构建的。FROM可以仅由一个或多个前面ARG的指令,其声明了在使用的参数FROM中的行Dockerfile。在Dockerfile中指令行可以是使用一个或多个由指令声明的参数。

以#开头的行作为注释。

该escape指令设置用于转义字符的字符 Dockerfile。如果未指定,则默认转义字符为\。转义字符既用于转义一行中的字符,又用于转义换行符。这允许Dockerfile指令跨越多行。请注意,无论escape解析器指令是否包含在a中Dockerfile,转义都不在RUN命令中执行,除了在行的末尾。

ENV 设置环境变量

两种格式:

在Dockerfile中支持环境变量的指令,如下:

ADD

COPY

ENV

EXPOSE

FROM

LABEL

STOPSIGNAL

USER

VOLUME

WORKDIR

ONBUILD (当与上述支持的指令之一结合使用时,在1.4之前,ONBUILD说明不支持环境变量,即使与上面列出的任何指令结合使用。)

RUN

两种形式

(shell形式,该命令在shell中运行,默认情况下在Linux中或Windows 上运行 )

(exec形式)

在shell或者exec的环境下执行的命令。RUN指令会在新创建的镜像上添加新的层面,接下来提交的结果用在Dockerfile的下一条指令中。

EXPOSE

该EXPOSE指令通知Docker,该容器在运行时侦听指定的网络端口。。

指定UDP方式:

在TCP和UDP上都公开,要写2行:

在这种情况下,如果使用-p与docker run,该端口将被一次TCP和一次UDP曝光。请记住,-p在主机上使用短暂的高阶主机端口,因此TCP和UDP的端口不会相同。

无论EXPOSE设置如何,您都可以使用该-p标志在运行时覆盖它们。例如

CMD

该CMD指令有三种形式:

CMD ["executable","param1","param2"](exec形式,推荐形式)

CMD ["param1","param2"](作为ENTRYPOINT的默认参数)

CMD command param1 param2(shell形式)

只能有一条CMD指令在Dockerfile文件中。如果列出多个,CMD 则只有最后一个CMD会生效。

CMD的主要目的是为执行容器提供默认值。 这些默认值可以包含可执行文件,或者可以省略可执行文件,在这种情况下,必须指定ENTRYPOINT指令。

当以shell或exec格式使用时,CMD指令设置运行image时要执行的命令。如果使用CMD的shell形式,那么command将在中执行:

如果想在没有shell的情况下运行command,那么必须将该命令表示为JSON数组形式并给出可执行文件的完整路径。 这种数组形式是CMD的首选格式。 任何附加参数都必须单独表示为数组中的字符串:

ENTRYPOINT

在Dockerfile中,是要运行的命令的第一部分的可选定义。 如果你希望你的Dockerfile可以运行,而不需要指定命令的附加参数,那么你必须指定,或者二者都有。

如果指定了,则将其设置为单个命令。 大多数官方Docker镜像都有或的入口点。 即使不指定,也可以从您在Dockerfile中使用FROM关键字指定的基本映像继承它。 要在运行时覆盖,可以使用。 以下示例将覆盖入口点为,并将CMD设置为。

指令会被追加到。对于指令而言,指令可以是任何有效的字符串,它允许你一次传入多个指令或者标志。在运行时覆盖指令的参数,只需要在容器名称或者ID后面追加需要的参数。下面的指令是覆写CMD的:

实际上不会经常被覆写,但是指定了会让你的镜像更灵活更容易使用。

ENTRYPOINT的两种格式

1.

2.

例如,以下内容将启动nginx及其默认内容,并在端口80上侦听:

的命令行参数将会添加到exec格式的所有元素之后,并且会覆盖指定的的所有元素。这允许将参数传递给入口点,例如通过-d参数传递给入口点。可以通过覆写指令。

shell格式将阻止使用任何CMD或运行命令行参数,但具有缺点,即将作为的子命令启动,该命令不传递信号。 这意味着可执行文件不会是容器的PID 1 - 并且不会接收Unix信号 - 所以可执行文件将不会从收到SIGTERM。

只有Dockerfile中的最后一条ENTRYPOINT指令才会起作用。

例如,Dockerfile

构建镜像:

运行镜像:

运行结果如下:

后面的参数会覆盖Dockerfile中CMD指令的参数。

两者CMD和ENTRYPOINT指令都定义了运行容器时执行的命令。有几条规则描述了他们的合作。

Dockerfile应至少指定一个CMD或ENTRYPOINT命令。

ENTRYPOINT 应该在使用容器作为可执行文件时定义。

CMD应该用作为ENTRYPOINT命令定义默认参数或在容器中执行ad-hoc命令的一种方式。

CMD 在使用替代参数运行容器时将被覆盖。

下表显示了针对不同的ENTRYPOINT/CMD组合执行的命令:

两种形式:ADD和COPY

其中的空格是必要的

ADD指令复制新文件,目录或远程文件URL 并将其添加到镜像的文件系统路径中去。

该COPY指令复制新文件或目录 并将其添加到路径中容器的文件系统。

可以指定多个资源,但如果它们是文件或目录,则它们的路径将被解释为与构建的上下文来源有关。

每个可能包含通配符,匹配将使用Go的 filepath.Match规则完成。例如:

是一个绝对路径或对于WORKDIR的相对路径,将在目标容器中复制到该路径中。

和的区别就是COPY的src只能是本地文件或目录。

VOLUME

VOLUME指令创建一个具有指定名称的挂载点,并将其标记为从本地主机或其他容器中存储外部安装的卷。

1、运行命令:

是将主机的/opt/kafka/log/挂在容器的/data目录。这样容器中的/data目录和主机上对/opt/kafka/log目录是完全实时同步的,因为这两个目录实际都是指向主机目录。

2、运行命令:

这样的话,容器的/data目录会挂载到主机的/var/lib/docker/目录下的一个目录(随机生成的)

3、 通过Dockerfile的VOLUME指令可以在镜像中创建挂载点,这样只要通过该镜像创建的容器都有了挂载点。通过VOLUME指令创建的挂载点,主机上对应的目录也是自动生成的。

可以通过命令查看挂载的信息。

参考文档:

Dockerfile参照文档 https://docs.docker.com/engine/reference/builder/

运行jar包中某个类中的main方法:java -classpath hbase-demo-1.0-SNAPSHOT.jar Test这样运行的就是Test类中的main方法。

  • 发表于:
  • 原文链接https://kuaibao.qq.com/s/20180606G23QNI00?refer=cp_1026
  • 腾讯「云+社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。
  • 如有侵权,请联系 yunjia_community@tencent.com 删除。

扫码关注云+社区

领取腾讯云代金券