dockerFile
更新时间:2023-12-13阅读整篇大约6分钟
指令格式有 2 种:
- 注释和指令注释以#开头,后面跟上信息
- 以大写的指令名开头 后面跟上参数
变量
变量用
$variable_name
或者${variable_name}
表示
${variable:-word}
表示如果variable
设置,则结果将是该值。如果variable
未设置,word
则将是结果。${variable:+word}
表示如果variable
设置则为word
结果,否则为空字符串。- 变量前加 \ 可以转义成普通字符串:
\$foo
or\${foo}
,表示转换为$foo
和${foo}
文字
FROM
初始化一个新的构建阶段,并设置基础镜像
一个Dockerfile
第一个非注释指令必须是FROM
指令,通过 FROM 指定的镜像名称必须是一个已经存在的镜像,这个镜像称之为基础镜像,基础镜像的父镜像是scratch
dockerfile
FROM <IMAGE>
FROM <IMAGE>:<TAG>
# FROM centos # centos基础镜像
MAINTAINER(更推荐使用 LABEL)
指定镜像的作者信息,包含镜像的所有者和联系人信息
dockerfile
MAINTAINER <NAME>
# MAINTAINER haowen.li<email>
LABEL
给镜像添加一些元数据(metadata),以键值对的形式
dockerfile
LABEL <key>=<value> <key>=<value> <key>=<value> ...
RUN
将在当前镜像之上的新层中执行命令,在 docker build 时运行
- 可以使用
\
(反斜杠)将单个 RUN 指令延续到下一行RUN
在下一次构建期间,指令缓存不会自动失效。可以使用--no-cache
标志使指令缓存无效- Dockerfile 的指令每执行一次都会在 docker 上新建一层。所以过多无意义的层,会造成镜像膨胀过大,可以使用***&&*** 符号连接命令,这样执行后,只会创建 1 层镜像
dockerfile
RUN yum install httpd && yum install ftp
ADD
将主机构建环境(上下文)目录中的文件和目录、以及一个 URL 标记的文件拷贝到镜像中。 ADD 命令基本上是 COPY 命令的超集
- ADD 的优点:在执行
<源文件>
为 tar 压缩文件的话,压缩格式为 gzip, bzip2 以及 xz 的情况下,会自动复制并解压到<目标路径>
。- ADD 的缺点:在不解压的前提下,无法复制 tar 压缩文件。会令镜像构建缓存失效,从而可能会令镜像构建变得比较缓慢。具体是否使用,可以根据是否需要自动解压来决定。
- 同样需求下,官方推荐使用 COPY
dockerfile
ADD 宿主机文件路径 容器内路径
COPY
复制指令,从上下文目录中复制文件或者目录到容器里指定路径
不支持 URL
dockerfile
COPY 宿主机文件路径 容器内路径
CMD
类似于 RUN 指令,用于运行程序,为启动的容器指定默认要运行的程序,程序运行结束,容器也就结束。
- CMD 在 docker run 时运行。
- RUN 是在 docker build。
- 如果 Dockerfile 中如果存在多个 CMD 指令,仅最后一个生效
- 可被 docker run 命令行参数中指定要运行的程序所覆盖。
dockerfile
CMD <shell 命令>
CMD ["<可执行文件或命令>","<param1>","<param2>",...]
CMD ["<param1>","<param2>",...] # 该写法是为 ENTRYPOINT 指令指定的程序提供默认参数
ENTRYPOINT
类似于 CMD 指令,但其不会被 docker run 的命令行参数指定的指令所覆盖,而且这些命令行参数会被当作参数送给 ENTRYPOINT 指令指定的程序。
- 如果运行 docker run 时使用了 --entrypoint 选项,将覆盖 ENTRYPOINT 指令指定的程序。
- 在执行 docker run 的时候可以指定 ENTRYPOINT 运行所需的参数
- 如果 Dockerfile 中如果存在多个 ENTRYPOINT 指令,仅最后一个生效
- 可以搭配 CMD 命令使用:一般是变参才会使用 CMD ,这里的 CMD 等于是在给 ENTRYPOINT 传参
dockerfile
FROM nginx
ENTRYPOINT ["nginx", "-c"] # 定参
CMD ["/etc/nginx/nginx.conf"] # 变参
ENV
设置环境变量
dockerfile
ENV <key> <value>
ENV <key1>=<value1> <key2>=<value2>...
VOLUME
定义匿名数据卷
dockerfile
VOLUME ["<路径1>", "<路径2>"...]
VOLUME <路径>
WORKDIR
指定工作目录。
- 用 WORKDIR 指定的工作目录,会在构建镜像的每一层中都存在。以后各层的当前目录就被改为指定的目录,如该目录不存在,WORKDIR 会帮你建立目录。
- docker build 构建镜像过程中的,每一个 RUN 命令都是新建的一层。只有通过 WORKDIR 创建的目录才会一直存在。
dockerfile
WORKDIR <工作目录路径>