Dockerfile是用来用来构建Docker镜像的文本文件,是由一条一条构建镜像所需要的指令和参数构成的脚本文件。构建过程:(1)编写Dockerfile文件;(2)docker build构建镜像;(3)docker run运行镜像。
一、基础内容
1、每条保留字指令(关键字)都必须是大写字母且后面跟随至少一个参数。
2、指令按照从上到下的顺序执行。
3、#表示注释。
4、每条指令都会创建一个新的镜像并对镜像进行提交。
二、Docker执行Dockerfile脚本的大致流程
1、docker首先从基础镜像运行一个容器(From)。
2、执行一条指令并该指令会对容器作出修改。
3、执行类似docker commit的操作提交一个新的镜像层。
4、docker会再次基于刚刚提交的镜像运行一个新的容器。
5、执行dockerfile中的下一条指令,循环往复直到所有指令都执行完成。
三、Dockerfile常用保留字
1、FROM:dockerfile第一条必须是FROM。指明基础镜像即要构建的新镜像是基于哪个镜像构建的(也可理解为模板)。
2、RUN:在构建容器时需要执行的命令,RUN在docker build时运行。
eg:RUN yum -y install vim
3、EXPOSE:当前容器对外暴露的端口。
4、WORKDIR:指定在容器创建后,终端登陆后进入的默认工作目录(一个落脚点)。
5、USER:指定该镜像需要什么样的用户权限才能执行,默认为root。
6、ENV:在构建镜像的过程中设置环境变量(相当于代码中设置全局变量,格式key/value)。此环境变量可以在后续的RUN指令或其他指令中使用。
eg:ENV MY_PATH/user/myhome
WORKDIR $MY_PATH
7、VOLUME:容器数据卷,用于数据的保存和持久化。
8、ADD:将宿主机目录下的文件拷贝进镜像且会自动处理URL和解压tar压缩包(ADD=COPY+解压)。
9、COPY:从构建上下文目录中<源路径>的文件或目录复制到新一层镜像内的<目标路径>的位置。类似于ADD将文件或目录从宿主机拷贝到镜像中。
格式:COPY src dest 或 COPY["src","dest"](dest如果不存在的话系统会自动创建)
10、CMD:指定容器启动时要干的事。
注意:可以有多个CMD指令,但只有最后一个生效,且CMD会被docker run之后的参数替换。
和RUN的区别:CMD是在docker run时运行;RUN是在docker build时运行。
格式:CMD <命令>
11、ENTRYPOINT:用来指定一个容器启动时要运行的命令(和CMD相似,CMD一般在变参时使用),但是ENTRYPOINT不会被docker run之后的参数覆盖而且这些参数还会被当成参数传递给ENTRYPOINT指定的程序。
格式:ENTRYPOINT["<executeable>","<param1>","<param2>",...]
ENTRYPOINT和CMD一起使用:此时CMD含义就发生了变化,就变成给ENTRYPOINT传参的了(此时由CMD传递的参数是可变的,如果想改变的话直接在run时后边加参数就可以了)。
eg:假设已经构建了nginx:test镜像
此时Dockerfile中内容如下:
--------------------------------------
FROM nginx
ENTRYPOINT["nginx","-c"] #定参
CMD["/etc/nginx/nginx.conf"] #变参
--------------------------------------
按照Dockerfile编写执行 | 传参执行 | |
Docker命令 | docker run nginx:test | docker run nginx:test -c /etc/nginx/new.conf |
根据Dockerfile衍生出的实际命令 | nginx -c /etc/nginx/nginx.conf |
nginx -c /etc/nginx/new.conf(把CMD中内容覆盖了) |
参考内容:
B站尚硅谷Docker教程