docker 镜像之DockerFile

Dockerfile 内基本命令

1.FROM [镜像名]
FROM : 定制的镜像都是基于 FROM 的镜像,这里的 镜像就是定制需要的基础镜像。后续的操作都是以这个镜像为基础
2.RUN:用于执行后面跟着的命令行命令,类似于直接写linux命令,有两种写法
1. RUN xxx
2. RUN [“yyy.sh”,“参数1”,参数2"“]
这里需要注意的就是Dockerfile每RUN一次就会在基础镜像上加一层,有几个RUN就会加几层,这样会导致镜像太大,这时可以使用
RUN xxx \
&& yyy \
&& zzz
这样就相当于只RUN一次
3.COPY
COPY [–chown=:] <源路径1>… <目标路径>
COPY [–chown=:] [”<源路径1>“,… “<目标路径>”]
CMD [”“,”“,…] 该写法是为 ENTRYPOINT 指令指定的程序提供默认参数
–chown=: 是复制的同时修改文件的属主和属组
eg: COPY test/a.txt ./
4.ADD 和 COPY 的使用方法类似,但对于源文件为tar文件,并且压缩格式为gzip, bzip2 以及 xz 会自动解压到目标文件夹,但这既是优点也是缺点,缺点就是遇到不需要解压的tar文件,他仍然会解压
5.CMD 类似于RUN
格式: CMD <shell 命令>
CMD [”<可执行文件或命令>“,”“,”“,…]
不同之处在于 COM运行于docker run ,而 RUN 运行于 docker build
这里要注意,如果Dockerfile中存在多个CMD时,仅最后一个生效
6.ENTRYPOINT
格式: ENTRYPOINT [”“,”“,”“,…]
类似于CMD 但不会被 docker run 的命令行参数指定的指令所覆盖,如果docker run 指定了参数,这些命令行参数会当作参数传给 ENTRYPORT
但是当docker run 使用了 --entrypoint 时 会覆盖ENTRYPOINT指定的程序
还有一点就是Dockerfile存在多个ENTRYPOINT 时 ,只有最后一个生效
ENTRYPOINT可以配合CMD使用,这时CMD的作用是为ENTRYPOINT提供参数
7.ENV
格式:ENV
ENV = =…
定义环境变量,定义之后,后续命令可以使用
eg: ENV JDK_VERSION 1.8
$JDK_VERSION
8.ARG
格式: ARG <参数名>[=<默认值>]
构建参数,只在docker build 时有效,可使用 --build-arg <参数名>=<参数值> 来覆盖
9.VOLUME
格式:VOLUME [”<路径1>", “<路径2>”…]
VOLUME <路径>
挂载卷,定义匿名数据卷。在启动容器时忘记挂载数据卷,会自动挂载到匿名卷
在启动容器 docker run 的时候,我们可以通过 -v 参数修改挂载点
10.EXPOSE
格式:EXPOSE <端口1> [<端口2>…]
声明端口,在运行时使用随机端口映射时,也就是 docker run -P 时,会自动随机映射 EXPOSE 的端口。
11.WORKDIR
格式:WORKDIR <工作目录路径>
会在每一层都存在,必须提前创建好
12.USER
格式:USER <用户名>[:<用户组>]
用于指定后续命令的操作用户和属组,必须已经存在
13.HEALTHCHECK
格式:HEALTHCHECK [选项] CMD <命令>:设置检查容器健康状况的命令
HEALTHCHECK NONE:如果基础镜像有健康检查指令,使用这行可以屏蔽掉其健康检查指令
HEALTHCHECK [选项] CMD <命令> : 这边 CMD 后面跟随的命令使用,可以参考 CMD 的用法。
14.ONBUILD
格式:ONBUILD <其它指令>
延迟构建镜像的命令,就是说,构建当前镜像的时候不会执行,但基于当前镜像构建新的镜像的时候会执行
15.LABEL
格式:LABEL = = = …
用于给镜像添加元数据
eg:添加作者
LABEL authors=“admin”

Dockerfile 构建镜像

docker build -t nginx:v1 .
最后这个点【.】指的是docker上下文路径,之所以要使用上下文路径,是因为docker构建镜像的时候获取不到我们本地的文件,而使用了上下文路径之后就可以将本地文件给docker使用,相当于docker与本机的一个通道吧。默认上下文路径为Dockerfile所在位置
建议本地上下文不要放无用的文件,因为本机会将上下文路径的所有文件一起打包发送给docker引擎,过多的话或导致过程非常缓慢