如有问题或建议,请公众号留言
最近更新:
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方法。
领取专属 10元无门槛券
私享最新 技术干货