关于DockerFile常用指令的解释

关于DockerFile常用指令的解释

先给出DockerFile的范例文件,文件中就不再写注释,在后面将一一解释其中的含义

FROM ubuntu:latest
MAINTAINER ****@qq.com
RUN apt-get update && apt-get install apache2 -y
CMD echo 123
EXPOSE 7777
ENV MYNAME 007
ADD /var/torrent.txt /var/torrent.txt
COPY /data/1.jpg /data/1.jpg
ENTRYPOINT ["/bin/bash", "-c", "echo 'Helllo Docker!'"]
VOLUME ["/mnt"]
USER ABC
WORKDIR /data

下面将解释文件中的参数和值

FROM ubuntu:latest

这一行表示需要获取哪一个镜像,镜像后面连接冒号后面可以指定镜像的版本。FROM这一行需要在文件的第一行。这里多讲一句,有的镜像有不同的版本,比如httpd,它有Ubuntu的版本和Centos的版本,默认httpd拉下来的是Ubuntu的版本。

MAINTAINER ****@qq.com

这里是指定维护者

RUN apt-get update && apt-get install apache2 -y

这里RUN后面所写的命令会在构建镜像的时候被执行,以此可以来安装自己需要的组件,多行可以使用反斜线\ 来换行

CMD echo 123

表示在容器启动的时候,执行由CMD指定的一条命令。如果DockerFile内部有多个由CMD指定的命令,如

CMD echo 123
CMD echo 234
CMD echo 345

那么以上三条,会被执行的只有最后一条,就是输出“345”,而其他指定的命令会被覆盖。还有一种方式会使DockerFile中CMD指定的命令被覆盖,就是在启动容器的时候指定命令,如

docker run -it --name myubuntu ubuntu:latest echo 789

在这种启动方式中,尾部添加了可执行的命令,所以DockerFile中的CMD指定的命令将不会生效。
CMD在DockerFile中的模式有3中,如下

1.CMD command param1 param2 (shell form)
2.CMD ["executable","param1","param2"] (exec form, this is the preferred form)
3.CMD ["param1","param2"] (as default parameters to ENTRYPOINT)

上面讲到的是第一种方式,如果现在使用第二种方式的话,那么就应该写成

CMD ["/bin/bash", "-c", "echo '123'"]

官方似乎更推荐第二种写法。第三种方式是在CMD中只填写参数,提供给ENTRYPOINT使用,如:

CMD ["123"]

在这里CMD只提供了参数“123”,而ENTRYPOINT会接收这个参数。ENTRYPOINT也能接收启动容器时添加的参数,如

docker run -it --name myubuntu ubuntu:latest 789

ENTRYPOINT在自身没有参数的情况下会接收这个参数789(区别于CMD,因为CMD不会接收任何参数),后面讲ENTRYPOINT的时候再详细介绍。

EXPOSE 7777

这里只开放7777端口,可用于与主机之间的端口映射

ENV MYNAME 007

这里表示指定一个环境变量MYNAME,值为007,环境变量可以设置多个

ADD /var/torrent.txt /var/

这里的ADD表示把/var/torrent.txt复制到容器的/var/文件夹下。第一个参数可以是url地址。如果是tar类压缩文件,压缩文件会被自动解压放入容器指定文件夹,zip类文件夹不会被解压(亲测)。

COPY /data/1.jpg /data/1.jpg

这里的COPY表示把/data/1.jpg复制到容器的/data/1.jpg,如果容器存在同名文件则被覆盖。
那么这里可能就有小伙伴要问了,ADDCOPY都是复制文件,到底有什么区别呢?
COPY指令只能复制文件,但是ADD的功能就要多一些。就像上面提到的,它的第一个参数可以是url,可以直接获取网络资源然后复制到容器中,然后还可以自动解压tar类压缩包。这里还有一个注意点就是,ADD的第二个参数,如果是文件夹,后面需要加斜杠“/”,就像我上面写的一样,不然ADD会把第二个参数当作一个文件。

ENTRYPOINT ["/bin/bash", "-c", "echo 'Helllo Docker!'"]

这里表示输出一句话。ENTRYPOINT可以接受来自CMD的参数,例如:

CMD ["123"]
ENRTYPOINT ["echo"]

那么在容器启动时就会接受`CMD的“123”然后输出123,如图:
输出上面在讲CMD的时候提到过,当容器启动时如果带启动参数,那么内部的参数就会被覆盖,如图:
输出还有一种情况ENTRYPOINT不接受参数,就是把ENTRYPOINT写为shell执行模式,例如:

ENTRYPOINT echo

既不接受内部CMD的参数,也不接受容器启动时的参数。

VOLUME ["/data"]

这里是指将容器中的/data文件夹关联到主机的某个目录中,还有一个作用就是容器之间共享目录。
先使用docker inspect命令查看,
输出
Source表示本机的目录,Destination表示容器中的了目录。那么我们此时做个实验,看两个地址是否关联上了。此时我们进入Source的地址新建一个文件,名为Hello.txt
输出然后我们再查看容器中/data文件夹是否存在这个文件。
输出这里存在,表示这两个地址是关联的。
第二个作用就是共享文件夹,假如你已经使用镜像C创建了一个容器A,VOLUME指定的文件夹是/data,那么在使用镜像C创建容器B的时候添加一条 --volume-from A,这时候两个容器的/data文件夹内的数据就共享了。

USER ABC

这里是指定容器执行程序的用户身份,默认是使用root用户执行,在启动容器的时候也可以添加-u 来指定用户启动容器。

WORKDIR /data

这里是指定dockerfile的工作目录,可以存在多个,如果写成这种形式

WORKDIR /data
WORKDIR data1

那么此时的工作目录就会变成/data/data1

好了,关于DockerFile常用的指令就是这些。如果上述存在错误,欢迎留言指正,谢谢。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值