你见过不长毛的羊吗

Dockerfile笔记

2019.08.22

1. 是什么

  • Dockerfile是一个包含用于组合镜像指令的文本文档。Docker通过读取Dockerfile中的指令自动生成镜像。

2. 基础知识

  1. 每条指令由保留字和参数组成
  2. 指令中保留字都必须为大写,且后面要跟随至少一个参数
  3. 指令按照从上到下,顺序执行
  4. 每条指令都会创建一个新的镜像层,并对镜像进行提交
  5. # 表示注释

3. 怎么用

  • docker build命令用于从Dockerfile构建映像。 docker build -f /opt/docker/Dockerfile -t 镜像名称:tag /opt/docker/ -f:标志指向文件系统中任何位置的Dockerfile, -t:指定新镜像名称和tag, 最后的/opt/docker指定的是 build 上下文。如在命令ADD apache-tomcat-7.0.96.tar.gz /opt/中,apache-tomcat-7.0.96.tar.gz 的位置是相对上下文的。即,虽然ADD指令中直接写的文件名,实际上该文件的真实路径为:/opt/docker/apache-tomcat-7.0.96.tar.gz

4. dockerfile build大致流程

  1. docker从基础镜像运行一个容器
  2. 执行一条指令并对容器做出修改
  3. 执行类似docker commit的操作提交一个新的镜像层
  4. docker 在基于刚提交的镜像运行一个新的容器
  5. 执行dockerfile中的下一条指令,直到所有指令都被执行

5. 保留字

保留字作用说明用法
FROM指定基础镜像必须为第一个指令FROM <image>[:<tag>] [AS <name>]
MAINTAINER指定镜像维护者信息已弃用MAINTAINER <name>
RUN构建镜像时执行的命令 RUN <command>
RUN ["executable", "param1", "param2"]
CMD指定容器启动时要运行的命令如果CMD用于为ENTRYPOINT 指令提供默认参数,
则应使用JSON数组格式指定CMD和ENTRYPOINT指令。
多个CMD指令时,只有最后一条生效
CMD ["executable","param1","param2"] (执行形式,这是首选形式)
CMD ["param1","param2"] (作为ENTRYPOINT的默认参数)
CMD command param1 param2 (shell form)
ENTRYPOINT指定容器启动时要运行的命令与CMD区别:不会被docker run 后的参数替换掉ENTRYPOINT ["executable", "param1", "param2"] (执行形式,首选)
ENTRYPOINT command param1 param2 (shell form)
EXPOSE镜像启动后对外暴露的端口号可被docker run -p 80:80/tcp -p 80:80/udp 覆盖EXPOSE <port> [<port>/<protocol>...]
WORKDIR指定容器的工作目录如果有多个WORKDIR指令时,
后一条是相对于前一条WORKDIR指令的路径
WORKDIR /path/to/workdir
ENV在镜像构建过程中设置环境变量$<key> 引用变量
使用docker inspect和查看值,
并使用它们进行更改docker run --env =
ENV <key> <value>
ENV <key>=<value>
(两者有区别)
ADD从源拷贝到容器中tar类型文件会自动解压(网络压缩资源不会被解压),
可以访问网络资源,类似wget
ADD [--chown=<user>:<group>] <src>... <dest>
ADD [--chown=<user>:<group>] ["<src>",... "<dest>"]
COPY从源拷贝到容器中不会自动解压文件,也不能访问网络资源CPOY [--chown=<user>:<group>] <src>... <dest>
ADD [--chown=<user>:<group>] ["<src>",... "<dest>"]
VOLUME指定宿主机上持久化目录 VOLUME ["/data", "data2"]
ONBUILD当构建一个被继承的Dockerfile时运行的命令父镜像在被子继承后,父镜像的ONBUILD触发ONBUILD [INSTRUCTION]