Linux运维进阶-Python,Docker,ShellDocker容器

dockerfile常用易混指令--(2)

2019-08-24  本文已影响0人  My熊猫眼

接上一篇:<<dockerfile 常用易混指令--(1)>>, 本篇介绍剩余的几个基础指令:

CMD:

dockerfile中这个指令一般只有一个,如果配置有多个,那么只有最后一个CMD配置生效,而如果没有配置CMD, 那么通常必须指定ENTRYPOINT参数.
如果既没有CMD, 也没有指定ENTRYPOINT, 那么docker build的时候并不会报错,但是run 相应的container的时候,如果忽略指定 COMMAND, 那么 会提示"No command specified"的错误; CMD指令可以被 docker run IMG COMMAND 中的COMMAND覆盖. 所以CMD指令是run container的时候被调用的,而不是在docker build的时候调用的;

ENTRYPOINT:

这个指令指定的命令是无法通过docker run 进行overwritten的,而因为 CMD 对应的命令是可以通过docker run 进行overwritten的,所以可以在dockerfile中同时指定ENTRYPOINT 以及CMD(两者都必须使用exec格式); CMD 用于指定默认的参数,而如果docker run 的时候指定了COMMAND, 那么就实现替换 默认的参数的功能 (见后面文章的例子:基于centos的rootfs 创建自己的base image)

shell格式与exec格式的区别:

在我们使用 RUN, CMD, ENTRYPOINT指令的时候,有shell form和exec form的区别,分别是如下的形式:
exec forms: INSTRUCTIONS ["command","para1","para2"]
shell forms: INSTRUCTIONS "command" "para1" "para2"
在shell 格式下,相当于 /bin/sh -c "command" "para1" "para2" ;
在exec格式中,["command" ,"para1" ,"para2"] 并不被/bin/sh 来处理,这里就涉及到一个变量解析的问题,详细例子见文章:基于centos的rootfs 创建自己的base image

EXPOSE:

这个指令 指出了container的监听端口,这个监听端口用于: 容器内部进程对该端口可以访问,被Llink的容器进行访问,也可以用于主机上的端口到container的重定向,但是不可以通过主机直接进行访问
如果要通过主机访问EXPOSE的端口,那么需要通过 docker run的时候,指定 -p 参数,来public 端口才可以,当指定-p参数的时候,其实docker 就自动做了EXPOSE.

VOLUME:

这个指令创建挂载点(简单来说就是创建一个目录),因为容器的存储层实现了不会因为运行而发生变化,所以向存储层的写操作,在容器停止运行的时候,写入的数据就丢失了。但是对于像数据库这类应用,数据库程序的相当一部分log文件即便在容器停止运行的时候也不应该丢失,所以需实现持久化存储,而实现持久化存储通常在 docker run的时候通过 -v 参数来指定, 但是如果用户在run容器的时候忘记指定volume, 那么数据库文件不可避免会出现丢失的现象,为了解决这个问题,事先指定 某些目录为匿名volume, 这样如果用户没有指定volume, 那么就会使用匿名volume来存储动态数据;所以这个VOLUME 参数其实指定了匿名volume,这个volume可以用于持久化存储;

文章《基于centos的rootfs 创建自己的base image》介绍一个具体的dockerfile来创建image的实例

本文原创,转载请注明出处

上一篇下一篇

猜你喜欢

热点阅读