在写Dockerfile之前需要注意:
Dockerfile文件名需要大写
跟Dockerfile在同级目录中的.dockeringore文件是一个排除列表
Dockerfile里面需要引用的文件路径必须为及自身路径以下的路径
Docker Format
Format: #Comment(注释信息)
INSTR UCTION arguments(指令及其参数)
FROM
FROM指令是最重要的一个且必须为Dockerfile文件开篇的第一个非注释行,用户映像文件构建过程中的指定的基准镜像,后续的所有制令都是运行与此基准镜像所提供的运行环境中
实践中,基准镜像可以是任何可用镜像文件,默认情况下,docker build会在主机上查找指定的镜像文件,在其不存在时,则会从DockerHub Registry上拉取所需的镜像文件
如果找不到指定的镜像文件,docker build会返回一个错误信息
From < reposit
List item
ory > [:< tag >] 或From < repository >@< digest >
< repository >:指定作为base image的名称
< tag > :base image 的标签,为可选项,省略时默认为latest;
MAINTAINER
用于Dockerfile制作者提供的本人的详细信息(可选项)
推荐放在FROM指令之后
MAINTAINER <author’s detail>
<author’s detail >可是任何文本信息,但约定俗地使用作者名称及邮件地址
MAINTAINER “liuyao <ly.china,com>“=LABEL maintainer=“ly<ly.china.com>”
COPY
用于从Docker主机复制文件至创建的新映像文件
COPY < src > …< dest >或
COPY["< src >"…"< dest >"](路径中有空白字符,通常使用第二种格式)
< src >:要复制的源文件或目录,支持使用通配符
< dest >:目标路径,即正在创建的image的文件系统路径;建议为< dest >使用绝对路径,否则,COPY指定则以WORKDIR为起始路径;
复制规则:
文件复制< src >必须是build上下文中的路径,不能是其父目录
如果< src >是目录,其内部文件或子目录都会被递归辅助,本身的< src >目录不会被复制
MMAT如果制定了多个< src >,或在< src >中使用了通配符,则< src >必须是一个目录,且必须是依/结尾,
如果< dest >事先不存在,它将会被自动创建,包括其父目录路径
例子:
基础镜像busybox
制作者
复制index.html文件到image的/data/web/html/下
docker build -t test:v0.1-1 ./
-t 镜像的名字及标签,通常 name:tag 或者 name 格式;可以在一次构建中为一个镜像设置多个标签
./Dockerfile路径
docker run --rm --name test1 test:0.1-1 cat /data/web/html/index.html
–rm 退出容器后删除容器
COPY目录
拷贝yum.repos.d目录下的所有文件到/etc/repos.d下面去,后面必须加 /
ADD
ADD指令类似于COPY命令,ADD支持使用TAR文件和URL路径
ADD < src > …< dest >或
ADD["< src >"…"< dest >"]
如果< sr c>是一个本地的压缩格式的tar文件,她将被展开为一个目录,其行为类似于"tar -x"命令,通过URL获取到的tar文件不会自动展开
第一种通过URL获取到的tar文件不会展开
第二种默认会解压出来
WORKDIR
用于Dockerfile中多有的RUN、CMD、ENTRYPOINT、COPY和ADD指定的工作目录
WORKDIR < dirpath >
在Dockerfile文件中,WORKDIR指令可出现多次,路径可以为相对路径()
也可以调用ENV 的定义的变量
例如:WORKDIR /var/log
WORKDIR $ STATEPATH
VOLUME
用于image中创建一个挂载点目录,以挂载Docker host上的卷或其他容器上的卷
volume < mountpoint >或
volume["< mountpoint >"]
如果挂载点目录路径下有文件存在,docker run命令会在卷挂载完成后将此前的所有文件复制到新挂载 的卷下
EXPOSE
:用于容器打开指定的监听端口以实现与外部通讯(暴露端口)
EXPOSE指令可以一次指定多个端口
例如:EXPOSE 12/udp 22/tcp
现在dockerfile中定义80/tcp,然后创建测试镜像0.1-6,依httpd的方式运行测试镜像0.1-6
查看运行的test6容器具体信息,并且测试访问
因为run的时候没加-P暴露端口所有,用port参数看不到
记住run中的一个参数-P这个参数是暴露端口,暴露镜像中定义的端口
ENV
用于为镜像定义所需的环境变量,并可被Dockerfile文件中位于其他指令(如ENV、ADD、COPY等)调用
调用格式为$ variable或$ {variable_name}
ENV< key >< value>或
ENV< key >=< value >…
第一种格式中,< key >之后的所有内容都会被视作为< value >的组成部分,因此只能设置一个变量
第二种格式中,可以一次性设置多个变量,每个变量为一个"< key >=< value >"的键值对,如果< value >中包含空格,可以以反斜线()进行转义,也可以通过对< value >加引号进行标识;另外反斜线也可用于续行;
定义多个变量时,建议使用第二种方式,方便在同一层中完成所有功能
如果没有定义DOC_ROOT,给设定默认值那就是以下图的表示结果了
多个变量,用反斜线换行
Dockerfile中设置的环境变量,可以在启动容器以后,是可以在容器中使用的,还可以重新赋值
docker run --rm -e NGINX_PACKAGE=“nginx-1.15.0 --name test7 test:v0.1-7 printenv”
-e是给Dockerfile中设置的环境变量重新赋值
这里因为镜像已经build完成,所以查看容器的里面的文件依旧是nginx-1.17.0
RUN
用于指定docker build过程中运行的程序,其可以是任何命令(基于Dorkerfile构建镜像时用到的命 令)
RUN或
RUN["","",""]
CMD
类似于RUN命指令,CMD指令也可用于运行任何命令或应用程序,不过,二者的运行时间点不同(镜像启动为容器时,如果没指定命令,默认的要用的命令)
例子:
下载nginx-1.17.0.tar.gz包,然后进入目录解压出来
ENTRYPOINT
类似CMD指令的功能,用于为容器指定的默认运行程序,从而使得容器像是一个单独的可执行程序
与CMD不同的是,由ENTRYPOINT启动的程序不会被docker run 命令行指定的参数所覆盖,而且,这些命令行参数会被当 做参数传递给ENTRYPOINT指定
docker build 制作镜像
-t 给制作的镜像打标签
Dokerfile生产例子:
FROM java:8
#FROM frolvlad/alpine-oraclejdk8:slim
ADD inquisition-1.4.9.2.jar /inquisition-1.4.9.2.jar
RUN /bin/cp /usr/share/zoneinfo/Asia/Shanghai /etc/localtime && echo ‘Asia/Shanghai’ >/etc/timezone
ADD apm /apm
EXPOSE 9522
EXPOSE 9994
EXPOSE 9995
EXPOSE 9996
ENTRYPOINT [“java”,"-javaagent:/apm/pinpoint-bootstrap-1.6.0.jar","-Dpinpoint.agentId=a","-Dpinpoint.applicationName=b","-Djava.security.egd=file:/dev/./urandom","-jar","/inquisition-1.4.9.2.jar"]