Dockerfile基础
Dockerfile的语法
dockerfile 基于DSL(domain specific language)语法,更具备可重复性,透明性和幂等性
FROM
基础镜像,当前的镜像是基于哪个镜像的
MAINTAINER
镜像维护者的姓名和邮箱地址
EXPOSE
当前容器对外暴露出的端口
RUN
容器构建时的运行命令,相当于在容器执行一个命令行,RUN有两种格式
shell格式
1 | RUN <命令行命令> |
exec格式
1 | RUN ["可执行文件", "参数1", "参数2"] |
dockerfile的指令每执行一次就会在docker上新建一层,过多的无意义层会造成镜像膨胀过大,所以不要过多运行多行run
例如
1 | FROM centos |
WORKDIR
指定容器创建后,终端默认登录进来的工作目录一个落脚点
ENV
用来构建镜像过程中设置环境变量
ADD
将宿主机目录下的文件拷贝进镜像,且自动处理URL和解压tar包
ADD 指令和 COPY 的使用格式一致(同样需求下,官方推荐使用 COPY)。功能也类似,不同之处如下:
ADD 的优点:在执行 <源文件> 为 tar 压缩文件的话,压缩格式为 gzip, bzip2 以及 xz 的情况下,会自动复制并解压到 <目标路径>。
ADD 的缺点:在不解压的前提下,无法复制 tar 压缩文件。会令镜像构建缓存失效,从而可能会令镜像构建变得比较缓慢。具体是否使用,可以根据是否需要自动解压来决定。
COPY
将从构建上下文目录的原路径文件复制到新一层的镜像内的<目标路径位置>
从工程目录中copy到镜像中
格式:
1 | COPY [--chown=<user>:<group>] <源路径1>... <目标路径> |
VOLUME
容器数据卷,用于数据保存和持久化工作
CMD
类似于RUN指令,用于运行程序,但是两者的时间点不同
CMD是在docker run时运行
RUN是在docker build时运行
如果dockerfile中存在多个CMD指令,仅最后一个生效
ENTERPOINT
与CMD大致相同,但CMD只有最后一个命令会生效
ENTERPOINT 则是追加模式
不会被docker run 的命令行参数指定的指令覆盖,并且这些命令行参数会当做参数送给ENTRYPOINT指令指定的程序
如果dockerfile中存在多个enterypoint指令,仅最后一个生效,经常搭配CMD命令使用,变参使用CMD,CMD相当于给ENTRYPOINT 传参
例子
1 | FROM nginx |
假设通过以上的操作构建了 nginx:test 镜像
不传参运行
1 | docker run nginx:test |
相当于容器内默认运行以下命令,启动主进程
1 | nginx -c /etc/nginx/nginx.cnf |
传参运行
1 | docker run nginx:test -c /etc/nginx/new.conf |
容器会默认运行以下命令
1 | nginx -c /etc/nginx/new.conf |
ONBUILD
当构建一个被继承的Dockerfile时运行命令,父镜像在被子镜像继承后父镜像的onbuild被触发
用于延迟构建命令的执行。简单的说,就是 Dockerfile 里用 ONBUILD 指定的命令,在本次构建镜像的过程中不会执行(假设镜像为 test-build)。当有新的 Dockerfile 使用了之前构建的镜像 FROM test-build ,这是执行新镜像的 Dockerfile 构建时候,会执行 test-build 的 Dockerfile 里的 ONBUILD 指定的命令。
项目文件中的dockerfile
1 |
##
1 | <!--{% load user_tags %} --> |
转载请注明来源,欢迎对文章中的引用来源进行考证,欢迎指出任何有错误或不够清晰的表达。可以在下面评论区评论,也可以邮件至 583614868@qq.com
文章标题:Dockerfile基础
文章字数:1.1k
本文作者:钟帅豪
发布时间:2020-01-17, 09:19:14
最后更新:2020-11-24, 10:05:17
原始链接:http://jhshz520.github.io/2020/01/17/Dockerfile基础/版权声明: "署名-非商用-相同方式共享 4.0" 转载请保留原文链接及作者。