Dockerfile初识

Dockerfile是一个包含用于组合映像的命令的文本文档。可以使用在命令行中调用任何命令,主要的作用是用来构建镜像文件的配置文件

构建的命令 docker build -f  /path/to/a/Dockerfile .  #注意文件的名称必须为Dockerfile,不能有一点差异,否则就会提示找不到Dockerfile

Dockerfile基本由4部分组成:基础镜像文件、发布/维护者信息、构建时执行的命令、构建完成后镜像在容器中运行的命令


《一》Dockerfile的第一条指令必须是FROM,即基础镜像名称,默认会从docker的官网下载已有的images的最新版本,并且会保存到本地的docker镜像目录下(/var/lib/docker/overlay2目录下),常见的image有nginx、centos等等

Dockerfile内部的声明以字符开头则被视为注释

常见的写法:FROM <image>:<tag>   tag不是必填项
     FROM mysql:5.6    #拉取5.6 tag的mysql

《二》维护人或者创建人信息用MAINTAINER定义,格式:MAINTAINER username

示例写法:MAINTAINER Jasper Xu

《三》构建时执行的命令,格式:RUN  commond   RUN ["executable", "param1", "param2"],这里面的命令都是shell中可以执行的内部命令

示例:RUN useradd -s /sbin/nologin -M www

RUN yum install net_tools

《四》添加文件到镜像中,tar的文件会自动解压到相应工作目录下,格式:ADD <src>... <dest>

示例 ADD ./test/config.txt /mydir/   #只能把构建目录下的文件添加到镜像中,构建的目录必须指定才能构建

《五》镜像运行的时候才执行,在某个容器中运行时才执行,格式:CMD command param1 param2 (只能写部分命令:在shell内部执行的命令,否则无法构建成功)

另外的一个用法:CMD ["param1","param2"] (如果设置了ENTRYPOINT,则可以直接使用CMD设置更多的参数,供entrypoint使用)

CMD echo "This is a hett test." | wc -

特别注意:一个dockerfile中只能有一条cmd指令(无论是CMD command格式,还是CMD [“param1”])。如果你列出多个命令,那么只有最后一个命令才会生效。如果想要定义多个命令,可以用CMD 命令1&&命令2方式书写

同时在Dockerfile中定义两个语句,只有最后一条在镜像启动时执行,如果这个CMD定义在有entrypoint的Dockerfile中,还有可能直接被当做命令参数,而不直接执行

#CMD echo "This is a hett test." | wc -
#CMD echo "THis images is starting..."
启动时只把最后这个镜像启动的信息输出到了控制台

《六》配置容器,使其可执行化,ENTRYPOINT 

通过docker run执行的命令不会覆盖ENTRYPOINT,而docker run命令中指定的任何参数,都会被当做参数再次传递给ENTRYPOINT
Dockerfile中只允许有一个ENTRYPOINT命令,多指定时会覆盖前面的设置,而只执行最后的ENTRYPOINT指令

常见的格式:ENTRYPOINT  ["executable","param1", "param2"]

                      ENTRYPOINT ["top", "-b"]

                     CMD ["-c"]

ENTRYPOINT 在运行时也可以替代,不过比 CMD 要略显繁琐,需要通过docker run 的参数 --entrypoint 来指定。

当指定了 ENTRYPOINT 后, CMD 的含义就发生了改变,不再是直接的运行其命令,而是将 CMD 的内容作为参数传给 ENTRYPOINT 指令,换句话说实际执行时,将变为:

<ENTRYPOINT> "<CMD>"

《七》设置环境变量

格式用法: ENV <key> <value>

可以设置一个或者多个环境变量,类似于linux自带的环境变量$PATH

用法:ENV myCat=fluffy

《八》EXPOSE:指定于外界交互的端口

EXPOSE并不会让容器的端口访问到主机。要使其可访问,需要在docker run运行容器时通过-p来发布这些端口,或通过-P参数来发布EXPOSE导出的所有端口

用法示例:EXPOSE 8080

《九》docker run命令的执行原理

跟在镜像名后面的是 command ,即替换<CMD>部分的命令的内容,直接替换cmd的全部内容,不管<CMD>是以命令方式执行,或者以参数方式放在Entrypoint中执行

例如执行这个命令docker run --name test11 -p 80 nginx1:v1 5,则会把Dockerfile中原有的<CMD>进行替换,原本的命令为‘top -d -d’,替换后变成‘top -d 5’

原本的Dockerfile内容

命令执行性后的结果:

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值