第二口docker的感觉 —— Dockerfile

  • 时间:
  • 浏览:0

CMD会被作为命令愿因 参数在ENTRYPOINT 参数后追加。

ONBUILD指令

指定所那么人的子镜像算不算执行那些命令

ENTRYPOINT指令

设置容器启动时默认执行的命令和参数,该命令会在启动容器后作为根命令执行,通过名称可可不都可以看出来是入口。让容器以应用守护tcp连接愿因 服务去执行。日后 ENTRYPOINT算不算执行

LABLE指令

像是代码里的注释一样,这一概括的维护者信息。

RUN指令

每执行一次RUN什么都有有就会产生镜像的一层,使用 "&&" 将多个命令串联起来,愿因 须要换行在最后须要使用" " 反斜杠。环境的运行与搭建,大多数状态下须要这一命令

而愿因 大伙运行

https://docs.docker.com/engine/reference/commandline/commit/

大伙创建所那么人须要的镜像的日后,可可不都可以通过commit和dockerfile的形式进行构建,日后 前面也说了,官方推荐的还是dockerfile的形式。大伙其实很容易的把它理解为另2个构建脚本,docker为大伙提供了什么都有有可可不都可以使用的命令,下面我会一一说明。

ADD指令

是把本地的文件克隆到docker里去,不过不光那么,算不算对压缩文件自动进行解压缩

就前言的问题,我做一下解答:

通过docker commit命令,这一命令的目的是将大伙的最新修改作为镜像的一层进行构建,命令详情参考:

WORKDIR指令

进入到大伙指定的目录中,愿因 那么这一目录会自动进行创建,用WORKDIR,代替 RUN cd。尽量使用绝对目录,从不使用相对目录。

两者在dockerfile中所那么人都可可不都可以了声明一次,声明多次,不让报错,日后 可可不都可以了最后每根命令会生效。

CMD指令

设置启动后默认执行的命令和参数。愿因 docker run 进行了指定了命令,累似 docker run -it … /bin/bash。则不让运行CMD中的命令,日后 CMD定义多个,里边会覆盖日后的。

什么都有有总结起来大伙两者的关键区别在于:

这一日后可可不都可以考虑使用shell格式,愿因 说把exec格式进行改造一下,改成如下格式:

EXPOSE指令

声明镜像内内外部服务监听的端口,一次可可不都可以暴露多个端口

这里要着重说一下RUN 和 CMD和ENTRYPOINT,大伙都可可不都可以使用exec格式和shell格式

CMD["/usr/bin/strees",'--vm 1']这一形式进行启动。日后 有那么想过,曾经话语变量值就被限制死了,有那些好最好的方法做到docker启动的日后动态传入吗?我都那么说了,当然是有的:

CMD['/bin/echo', 'hello world $name'],打印的会是 hello world name的。

VOLUME指令

启动容器时,可可不都可以在本地愿因 是这一容器创建数据卷挂载点,用于存放数据库和持久化数据

❌日后 这一最好的方法最好的方法大伙从不提倡,愿因 这一构建最好的方法要花费另2个黑盒的构建,别人也真不知道你具体做了那些操作,这一日后就须要引出大伙的"构建好助手"——DockerFile

ENV指令

定义变量,可可不都可以在dockerfile下方进行使用,累似 大伙定义了 ENV USER harry,那么下面可可不都可以曾经使用 "${USER}"

dockerfile是把你所有你要 须要的地方都表现在了纸面上,曾经大伙可可不都可以明确知道所有的修改内容。

docker run -it < image > harry 会输出 hello harry

这什么都有有愿因 我里边说过的,愿因 run的日后那么指定CMD会执行,愿因 指定了命令就不让执行CMD了。

ARG指令**

定义创建镜像过程中使用的变量,要花费大伙为docker build - -build-arg赋值。镜像编译日后日后刚开始后,这一变量将不让被保存

CMD可被覆盖,ENTRYPOINT不让被覆盖

exec格式举例:

曾经在启动的使用就可可不都可以动态的将变量传入:

另2个看起来算不算生命变量用的,大伙之间的区别在于ARG时创建镜像过程中使用的变量,在启动后的容器中可可不都可以了使用。而ENV在容器中可可不都可以使用

愿因 大伙运行

docker run -it < image > 会输出 hello world

DockerFile的写法的关键在于:环境 + 工程代码 + 运行

DockerFile的最佳实践,请看官网:https://docs.docker.com/develop/develop-images/dockerfile_best-practices/

dockerfile的具体写法大伙在里边进行全版的讨论。 日后 在这里大伙要明确另2个问题,Dockerfile其实并算不算向镜像里直接写入的,愿因 镜像是只读的。docker在这一日后创建了另2个临时的容器,日后 写入内容日后,再把临时容器删除。

CMD['/bin/bash','-c','echo hello world $name ']

最后总结一下,其实愿因 CMD和ENTRYPOINT结合的来,那么ENTRYPOINT是用来指定命令的,而CMD中的则是用来指定参数的。

另外值得注意的是,RUN命令用于构建镜像,CMD和ENTRYPOINT用于指定容器启动时的这一默认指令和参数。

日后 要注意:愿因 使用exec格式,打印另2个环境变量

FROM指令

指定大伙要在哪个image之上再进行构建,尽量使用官方image进行base image,为了安全。日后 另2个Dockerfile,须要要以From指令作为开头(ARG是唯一另2个可可不都可以先于From命令的)

二者既然算不算作为容器启动时的命令,那么大伙的区别在哪里呢?

COPY指令

把本地文件拷贝到docker里去,COPY指令优于ADD指令,愿因 须要加上远程文件可可不都可以使用 curl愿因 wget

请看下方代码:

通过我去查阅官网,官网的意思是说ENTRYPOINT是docker容器的主命令,而默认的这一参数会在CMD中进行指定。

shell格式举例:

想象一下曾经另2个简单的场景,大伙只希望大伙的docker,不作为另2个应用守护tcp连接启动,什么都有有用做另2个工具。假设为另2个压力测试的工具,这一工具须要被指定这一参数累似 说 --vm 累似 的大伙可可不都可以通过 ->

首先大伙来思考曾经另2个问题:愿因 将改变了这一配置的Container在生成另2个镜像?