关于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,如果容器存在同名文件则被覆盖。
那么这里可能就有小伙伴要问了,ADD和COPY都是复制文件,到底有什么区别呢?
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常用的指令就是这些。如果上述存在错误,欢迎留言指正,谢谢。