目录
1. FROM
2. MAINTAINER
3. RUN
4. EXPOSE
5. WORKDIR
6. USER
7. ENV
8. VOLUME
9. COPY
10. ADD
11. CMD
12. ENTRYPOINT
13. CMD 和 RUN 命令的区别
本篇文章的讲解截屏示例基于tomcat的Dockerfile:tomcat/9.0/jdk8/openjdk/Dockerfile
1. FROM
基础镜像,指当前镜像是基于哪个镜像,指定一个已经存在的镜像作为模板,第一条必须是FROM
2. MAINTAINER
镜像维护者的姓名和邮箱地址
3. RUN
容器构建时需要运行的命令,在docker build时运行。简言之就是我们如果想要commit一个新镜像,需要通过原始镜像进入容器,然后执行 yum install 或者 apt-get install 命令。而可以直接通过RUN命令直接运行。有两种格式:shell格式和exec格式。
如果采用shell格式,则为:RUN apt-get install vim
如果采用 exec格式,则为 RUN ["可执行文件", "参数1","参数2"],如 RUN ["./test.php", "dev", "offline"]
4. EXPOSE
当前容器对外暴露的端口,如在tomcat就默认端口为 8080
5. WORKDIR
指定在创建容器后,终端默认登录的进来工作目录。比如通过docker run -it 命令进入一个容器,进入后通过pwd命令显示出来的路径,即为默认工作目录。在DockerFile里可以通过WORKDIR设置
6. USER
指定该镜像以什么样的用户去执行,如果都不指定,默认是root。一般我们使用默认不做更改
7. ENV
用来在构建镜像过程中设置环境变量,这个环境变量可以在后续的任何指令中使用。简言之就是在前面定义,后面可以直接引用,如下示例:
8. VOLUME
容器数据卷:用于数据保存和持久化工作。
9. COPY
拷贝宿主机的文件和目录到镜像中,相当于 docker cp命令。
10. ADD
将宿主机目录下的文件拷贝进镜像且会自动处理URL和解压tar压缩包,是copy+解压命令的合体。
11. CMD
指定容器启动后要做的事情,也就是docker run -it 后面的命令,如docker run -it ubuntu /bin/bash这行命令的后面的/bin/bash,具有两种格式:
shell格式:CMD <命令>
exec格式:CMD ["可执行文件","参数1","参数2"...]
但需要注意CMD会被docker run之后的参数覆盖。比如正常情况下我们运行tomcat镜像,默认情况下在容器启动后(docker run -it -p 8080:8080 镜像id),执行的如下红框中的命令,但是如果我们将命令修改为:docker run -it -p 8080:8080 镜像id /bin/bash,那就相当于默认CMD会被替换为 ["/bin/bash", "run"],则原来的命令不会生效,原始的tomcat则不能正常启动。
12. ENTRYPOINT
也是用来指定容器启动时要运行的命令,类似于CMD,但是ENTRYPOINT不会被docker run 后面的命令覆盖,而且这些命令行参数会被当做参数送给ENTRYPOINT指令执行的程序。
命令格式:ENTRYPOINT ["可执行文件","参数1","参数2"...]
注意:ENTRYPOINT 可以和 CMD一起用,但当一起用时,CMD就不再是直接运行其命令,而是将CMD的内容作为参数传递给ENTRYPOINT,一般是变参才会使用CMD。两者组合为 <ENTRYPOINT> "<CMD>"
13. CMD 和 RUN 命令的区别
CMD是在docker run时运行,即容器启动后要做的操作
RUN是在docker build时运行,即添加新功能的操作
注:本文部分图文内容来自于 Dockerfile保留字简_bilibili 的学习笔记,仅供参考。如看其他Docker内容,可看我博客Docker系列aaron_neil_Dcoker系列,持续更新中。