目录
进一步了解dockerfile
Dockerfile是由一系列指令和参数构成的脚本文件,每一条指令构建一层。
镜像的定制实际上就是定制每一层所要添加的配置和文件。
Dockerfile的格式:
# Comment
INSTRUCTION arguments
INSTRUCTION表示指令,不区分大小写,建议大写。arguments表示指令的参数。
Dockerfile文件必须以FROM指令开头,定义构建镜像的基础镜像。
以“#”符号开头的行都将被视为注释。
Docker可使用解析器指令escape设置转义字符。
通过Dockerfile构建镜像的基本方法
什么是构建上下文
上下文是由文件路径(本地文件系统上的目录)或一个URL(Git仓库位置)定义的一组文件。
构建上下文以递归方式处理,本地路径包括其中的任何子目录,URL包括仓库及其子模块。
使用当前目录作为上下文的简单构建命令:
docker build .
通过Dockerfile构建镜像的基本方法
镜像构建过程
建过程中一开始将整个上下文递归地发送给守护进程。
要使用构建上下文中的文件,Dockerfile引用由指令(如COPY)指定的文件。
使用-f选项显式指定Dockerfile文件的具体位置:
docker build -f /path/to/a/Dockerfile .
可以指定构建成功之后要保存的新镜像的仓库名和标签:
docker build -t shykes/myapp .
Docker守护进程逐一运行Dockerfile中的指令,每条指令被独立执行并创建一个新镜像。
只要有可能,Docker将重用过程中的中间镜像(缓存),以加速构建过程。
构建上下文
(1)为构建上下文创建一个目录并切换到该目录。
mkdir myproject && cd myproject
(2)将内容“hello”写入一个名为hello的文本文件。
echo "hello" > hello
(3)创建一个Dockerfile并在其中运行cat命令。
echo -e "FROM busybox\nCOPY /hello /\nRUN cat /hello" > Dockerfile
(4)从构建上下文(.)构建镜像。
docker build -t helloapp:v1 .
FROM指令——设置基础镜像
FROM指令的用法有以下3种格式:
FROM <image> [AS <name>]
FROM <image>[:<tag>] [AS <name>]
FROM <image>[@<digest>] [AS <name>]
FROM指令为后续指令设置基础镜像,可以在同一个Dockerfile文件中多次出现,以创建多个镜像层。
image参数指定任何有效的镜像,特别是可以从公有仓库拉取的镜像。
FROM指令AS <name>是可选的,可以用来对此构建阶段指定一个名称。
tag或digest的值是可选的。如果省略其中任何一个,构建器将默认使用latest。
RUN指令——运行命令
RUN指令的用法有以下两种格式:
RUN <command>
RUN ["executable", "param1", "param2"]
第1种是shell格式,命令在shell环境中运行。
第2种是exec格式,不会启动shell环境。
RUN指令将在当前镜像顶部的新层中执行命令,并提交结果。
exec格式可以避免shell字符串转换。
shell格式中的默认shell可以使用SHELL命令来更改。
CMD指令——指定容器启动时默认执行的命令
CMD指令的用法有以下3种格式:
CMD ["executable","param1","param2"]
CMD ["param1","param2"]
CMD command param1 param2
第1种是首选的exec格式。
第2种提供给ENTRYPOINT指令的默认参数。
第3种是shell格式。
一个Dockerfile文件中若有多个CMD指令,则只有最后一个CMD有效。
CMD指令的主要目的是为运行中的容器提供默认值。
LABEL指令——向镜像添加标记(元数据)
LABEL指令的语法格式如下:
LABEL <key>=<value> <key>=<value> <key>=<value> ...
每个标记(元数据)以键值对的形式表示。要在其中包含空格,应使用引号和反斜杠。
一个镜像可以有多个标记。可以将多个标记合并到单个LABEL指令中以减少层数。
基础镜像或父镜像中包含的标记会被镜像继承。
EXPOSE指令——声明容器运行时侦听的网络端口
EXPOSE指令的语法格式如下:
EXPOSE <port> [<port>...]
EXPOSE指令通知Docker容器在运行时侦听指定的网络端口。
EXPOSE指令不会发布该端口,只是起到声明作用。
ENV指令——指定环境变量
ENV指令的用法有以下两种格式:
ENV <key> <value>
ENV <key>=<value> ...
ENV指令以键值对的形式定义环境变量。
第1种格式将单个变量设置为一个值。
第2种格式允许一次设置多个变量,可以使用等号(=),而第1种形式不使用
COPY指令——将源文件复制到容器
COPY指令的用法有以下两种格式:
COPY [--chown=<user>:<group>] <src>... <dest>
COPY [--chown=<user>:<group>] ["<src>",... "<dest>"]
--chown选项只能用于构建Linux容器,不能在Windows容器上工作。
COPY指令将指定的源路径(由<src>参数指定)的文件或目录复制到容器文件系统中指定的目的路径(由<dest>参数指定)。
可以指定多个源路径,但文件和目录的路径将被视为相对于构建上下文的源路径。
目的路径是绝对路径,或者是相对于工作目录(由WORKDIR指令指定)路径。
ADD指令——将源文件复制到容器
ADD指令的用法有以下两种格式:
ADD [--chown=<user>:<group>] <src>... <dest>
ADD [--chown=<user>:<group>] ["<src>",... "<dest>"]
它与COPY指令的功能基本相同,不同之处有两点:
源可以使用URL指定。
归档文件在复制过程中能够被自动解压缩。
如果源是具有可识别的压缩格式的本地Tar归档文件,则将其解包为目录。来自远程URL的资源不会被解压缩。