目录
什么是Dockerfile?
-
Dockerfile 是 Docker 的 RPM Spec文件
-
Dockerfile 是一个包含用户创建Docker镜像所有指令的文本文件
-
Dockerfile 中的指令指定在创建Docker 镜像时做什么操作
-
Docker 读取Dockerfile中指令创建Docker镜像
-
每个指令将创建新的Docker镜像层
下面我来介绍dockerfile的各个参数的作用以及用法
DockerFile文件
FROM指令
-
Dockerfile必须以FROM 开头,指定baseimage
-
语法
-
FROM <images> [AS <name>]
-
FROM <image> [:<tag>] [AS <name>
-
demo:
FROM centos
MAINTAINER指令
- 镜像的维护者的姓名和邮箱
- 语法
- MAINTAINER <name>
demo:
MAINTAINER chen<xxxx@163.com>
WORKDIR指令
-
WORKDIR指令设置RUN,CMD,ENTRYPOINT,COPY和ADD的工作目录
-
语法
-
WORKDIR /path/to/directory
-
-
默认WORKDIR是根目录/,任何通过WORKDIR指令设置的WORKDIR都相对于根目录/
-
在同一Dockerfile中可设置多个WORKDIR指令,如果设置WORKDIR为绝对路径,后续WORKDIR指令设置的相对路径被附加到初始绝对路径
demo:
WORKDIR $MYPATH
COPY和ADD指令
-
COPY和ADD指令实现从主机到容器的文件传输功能
-
COPY支持简单 的文件服务
-
ADD除了COPY支持的功能外还支持其他功能如:tar包,自动解压,远程url等
-
语法
-
ADD <source><destination>
-
COPY <source><destination>
-
ADD -–chown=<user>:<group><source><destination>
-
COPY -–chown=<user>:<group><source><destination>
-
使用注意点:
-
如果destination不存在,则自动创建
-
所有新创建的文件或者文件夹UID和GID为0,即root用户,通过–chown选项修改
-
如果destination 末以/结尾,则认为destination为文件,source内容将写入文件
-
如果source包含通配符,则destination必须为目录,且以/结尾,否则build失败
-
source 必须在build上下文存在,不能build上下文之外
-
针对ADD指令
-
如果source是url,而destination不是目录不以/结尾,则从url下载的文件写入destination;
-
如果destination是目录且以/结尾,则URL对应的文件被下载到destination所在目录,如<destination>/<filename>;
-
如果source是本地tar包,tar包被自动解压为目录,而远程tar包暂时不支持
-
demo:
# 复制test.txt 到/usr/local/testincontainer.txt
COPY test.txt /usr/local/testincontainer.txt
# 解压tomcat 到 /usr/local
ADD apache-tomcat-9.0.14.tar.gz /usr/local
RUN指令
-
语法
-
RUN <command>
-
RUN [“executable”,“parameter 1”,“parameter 2”]
-
-
RUN指令在容器的可写入层被执行命令,并commit容器为新的镜像
-
上一步RUN指令生成的镜像被接下来RUN使用,每次RUN指令生成一个新的镜像
-
Dockerfile中最好用链式输入命令以减少创建镜像层数量 command && command
demo:
RUN yum -y install vim
ENV指令
- 用来在构建镜像时设置的环境变量
- 语法
- ENV key value
- ENV key=value
demo:
ENV MYPATH /usr/local
CMD/ENTRYPOINT指令
-
如何指定启动容器时执行什么命令
-
语法
-
CMD [“executable”,“param1”,“param2”](exec形式)
-
CMD[“param1”,“param2”](作为ENTRYPOINT的默认参数)
-
CMD command param1 param2(shell 形式)
-
ENTRYPOINT [“executable”,“param1”,“param2”] (exec形式 )
-
ENTRYPOINT command param1 param2 (shell 形式)
-
-
如果在Dockerfile中不指定CMD/ENTRYPOINT指令,Docker将使用基础镜像提供的默认命令
-
CMD/ENTRYPOINT指令在创建Docker镜像时不执行,只有在容器启东时才执行
-
既可以使用exec形式也可以shell形式指定要执行的指令
No ENTRYPOINT | ENTRYPOINT exec_entry p1_entry | ENTRYPOINT [“exec_entry”,“p1_entry”] | |
---|---|---|---|
No CMD | error,not allowed | /bin/sh -c exec_entry p1_entry | exec_entry p1_entry |
CMD[“exec_cmd”,“p1_cmd”] | exec_cmd p1_cmd | /bin/sh -c exec_entry p1_entry | exec_entry p1_entry exec_cmd p1_cmd |
CMD[“p1_cmd”,“p2_cmd”] | p1_cmd p2_cmd | /bin/sh -c exec_entry p1_entry | exec_entry p1_entry p1_cmd p2_cmd |
CMD exec_cmd p1_cmd | /bin/sh -c exec_cmd p1_cmd | /bin/sh -c exec_entry p1_entry | exec_entry p1_entry /bin/sh -c exec_cmd p1_cmd |
-
ENTRYPOINT 指令最好以exec形式执行,如果以shell形式则一些参数不能正确传入或不能正常工作
-
shell形式整个命令作为参数传入,可执行子命令,管道等
-
exec形式不会调用shell命令,这意味着shell的一些特性如变量替换,管道等不能正常工作
-
shell形式下将以/bin/sh -c 调用可执行程序,这意味着可执行程序没有PID与之对应,将不能接受unix信号
demo:
CMD /usr/local/apache-tomcat-9.0.14/bin/startup.sh
VOLUME指令
-
VOLUME指令在Docker主机上创建目录并挂载到容器中,通常在Docker的根目录
-
语法
-
VOLUME <dir>
-
demo:
VOLUME /home
EXPOSE指令
-
EXPOSE指令告知Docker容器将监听在指定的端口
-
语法
-
EXPOSE <port> [<port>/<protocol>…]
-
demo:
EXPOSE 8080
USER指令
- 设置启动容器的用户,可以是用户名或UID
- 语法
- USER chen
- USER UID
- 如果设置了容器以daemon用户去运行,那么RUN, CMD 和 ENTRYPOINT 都会以这个用户去运行
Dockerfile实战参考: 使用Dockerfile构建tomcat9