Dockerfile详解#如何编写自己的Dockerfile
文章目录
- 前言
- 编写规则
- 指令详解
- FROM:基础镜像
- LABEL:镜像描述信息
- MAINTAINER:添加作者信息
- COPY:从宿主机复制文件到镜像中
- ADD:从宿主机复制文件到镜像中
- WORKDIR:设置工作目录
前言
Dockerfile是编写docker镜像必备的技能,那么镜像是如何构建?镜像分层,这个层怎么分的,就是由Dockerfile中的每一条指令构成
官方文档直达:Dockerfile
构建命令:
通过docker build -t repository:tag ./
即可构建,要求:./下存在Dockerfile文件
编写规则
- 文件名必须是
Dockerfile
- Dockerfile中所用的所有文件一定要和Dockerfile文件在同一级父目录下
- Dockerfile中相对路径默认都是Dockerfile所在的目录
- Dockerfile中
能写到一行的指令,一定要写到一行
,因为每条指令都被视为一层,层多了执行效率就慢- Dockerfile中
指令大小写不敏感,但指令都用大写(约定俗成)
- Dockerfile 非注释行第一行必须是 FROM
- Dockerfile 工作空间目录下支持隐藏文件(.dockeringore),类似于git的.gitingore
指令详解
FROM:基础镜像
FROM <image>:<tag> [as other_name] # tag可选;不写默认是latest版
FROM
是Dockerfile文件开篇第一个非注释行代码- 用于为镜像文件构建过程指定基础镜像,后续的指令都基于该基础镜像环境运行
- 基础镜像可以是任何一个镜像文件
as other_name
是可选的,通常用于多阶段构建(有利于减少镜像大小)- 使用是通过
--from other_name
使用,例如COPY --from other_name
LABEL:镜像描述信息
LABEL author="zp wang <test@qq.com>"
LABEL describe="test image"
# 或
LABEL author="zp wang <test@qq.com>" describe="test image"
# 或
LABEL author="zp wang <test@qq.com>" \
describe="test image"
- LABEL指令用来给镜像以键值对的形式添加一些元数据信息
- 可以替代MAINTAINER指令
- 会集成基础镜像中的LABEL,key相同会被覆盖
MAINTAINER:添加作者信息
MAINTAINER zp wang <test@163.com>
- 慢慢废弃
COPY:从宿主机复制文件到镜像中
COPY <src> <dest>
COPY ["<src>", "<src>", ... "<dest>"]
<src>
:要复制的源文件或目录,支持通配符<src>
必须在build所在路径或子路径下,不能是其父目录<src>
是目录。其内部的文件和子目录都会递归复制,但<src>
目录本身不会被复制- 如果指定了多个
<src>
或使用了通配符,这<dest>
必须是一个目录,且必须以/
结尾
<dest>
:目标路径,即镜像中文件系统的路径<dest>
如果不存在会自动创建,包含其父目录路径也会被创建
# 拷贝一个文件
COPY testFile /opt/
# 拷贝一个目录
COPY testDir /opt/testDir
- testDir下所有文件和目录都会被递归复制
- 目标路径要写testDir,否则会复制到/opt下
ADD:从宿主机复制文件到镜像中
类似于
COPY
指令,但ADD
支持tar
文件和URL
路径
ADD <src> <dest>
ADD ["<src>","<src>"... "<dest>"]
<src>
如果是一个压缩文件(tar
),被解压为一个目录,如果是通过URL
下载一个文件不会被解压<src>
如果是多个,或使用了通配符,则<dest>
必须是以/
结尾的目录,否则<src>
会被作为一个普通文件,<src>
的内容将被写入到<dest>
ADD hom* /mydir/ # 添加所有以"hom"开头的文件
ADD hom?.txt /mydir/ # ? 替代一个单字符,例如:"home.txt"
ADD test relativeDir/ # 添加 "test" 到 `WORKDIR`/relativeDir/
ADD test /absoluteDir/ # 添加 "test" 到 /absoluteDir/
操作准则
同COPY指令的4点准则
如果<src>为URL且<dest>不以/结尾,则<src>指定的文件将被下载并直接被创建为<dest>;
如果<dest>以/结尾,则文件名URL指定的文件将被直接下载,并保存为<dest>/<filename>,注意,URL不能是ftp格式的url
如果<src>是一个本地系统上的压缩格式的tar文件,它将被展开为一个目录,其行为类似于“tar -x”命令,然后,通过URL获取到的tar文件将不会自动展开
如果<src>有多个,或其间接或直接使用了通配符,则<dest>必须是一个以/结尾的目录路径;
如果<dest>不以/结尾,则其被视作一个普通文件,<src>的内容将被直接写入到<dest>;
WORKDIR:设置工作目录
- 类似于cd命令,为了改变当前的目录域
- 此后RUN、CMD、ENTRYPOINT、COPY、ADD等命令都在此目录下作为当前工作目录
WORKDIR /opt
- 如果设置的目录不存在会自动创建,包括他的父目录
- 一个
Dockerfile
中WORKDIR
可以出现多次,其路径也可以为相对路径,相对路径是基于前一个WORKDIR
路径 WORKDIR
也可以调用ENV
指定的变量
WORKDIR <dirpath>
在Dockerfile文件中, WORKDIR指令可出现多次,其路径也可以为相对路径,不过,其是相对此前一个 WORKDIR指令指定的路径;另外, WORKDIR也可调用由 ENV指定定义的变量 .例如
WORKDIR /var/log
WORKDIR $STATEPATH
示例:
WORKDIR /a (这时工作目录为/a)
WORKDIR b (这时工作目录为/a/b)
WORKDIR c (这时工作目录为/a/b/c)
注:
通过WORKDIR设置工作目录后,Dockerfile中其后的命令RUN、CMD、ENTRYPOINT、ADD、COPY等命令都会在该目录下执行。
在使用docker run 运行容器时,可以通过-w参数覆盖构建时所设置的工作目录。