1.什么是Dockerfile
1.1 Dockerfile
Dockerfile 是一个用来构建镜像的文本文件,文本内容包含了一条条构建镜像所需的指令和说明。
制作镜像的Dockerfile文件所在的目录为dockerfile的上下文环境。
1.2 docker build命令
docker build的使用
docker build -t [imagename:tag] [filepath]
docker build:构建镜像,-t 指定image的name和版本,指定构建镜像的Dockerfile文件。
如果当前上下文内的Dockerfile文件名就是Dockerfile,在构建镜像的时候,命令如下
dcoker build -t mycentos:01 .
-t mycentos:表示构建的image名字为mycentos,并且指定版本为01
【 . 】 :最后的一个 点 表示指定当前上下文中的文件名为Dockerfile文件【如果是其他文件,指定文件名】
1.3 Dockerfile相关指令描述
保留字 | 作用 |
---|---|
FROM | 当前镜像是基于哪个镜像[第一个指定必须是FROM] |
MANITAINER | 维护者的姓名和邮箱地址[废弃,意义不大] |
RUN | 构建镜像是需要运行的指令 |
EXPOSE | 当前容器对外 暴露的端口号 |
WORKDIR | 指定在创建容器后,终端默认登录进来的工作目录,一个落脚点 |
ENV | 用来在构建镜像的过程中设置环境变量 |
ADD | 将宿主机目录下的文件拷贝进容器且ADD命令会自动处理URL和解压tar包 |
COPY | 类似于ADD,拷贝文件和目录到镜像中 将从构建上下文目录中<原路径>的文件/目录复制到新的一层镜像内的<目标路径>位置 |
VALUME | 容器数据卷,用户数据保存和持久化工作 |
CMD | 指定一个容器启动时要运行的命令,Dockerfile中可以有多个CMD指令,但只有最后一个生效,CMD会被docker run之后的参数替换 |
ENTRYPOINT | 指定一个容器启动时要运行的命令,ENTRYPOINT的目的和CMD一样,都是在指定容器启动过程及其参数 |
2.Dockerfile命令详情
2.1 FROM命令
- 基于哪个基础镜像进行构建新的镜像,在构件时会自动从docker hub拉取base进行,必须作为Dockerfile的第一个指令出现
- 语法
FROM <image>
FROM <image>[:tag] 使用最新版本不写为latest
FROM <image>[@<digest>] 使用摘要
注意:文章来源:https://www.toymoban.com/news/detail-471028.html
构建的docker镜像,如果没有服务,在运行为容器之后,会立刻结束进程。
如果有服务在镜像运行为容器之后一直运行[阻塞系统进程],则容器不会在启动后结束进程。
在image没有服务的情况下,启动为容器,会在容器启动后结束进程。
如果想进入容器,只能在启动容器的时候加上[-it],会在容器运行之后,直接进入容器内部。
其他情况同样适用,只要是在image启动为容器后直接进入容器内部,都可以使用该方法。
2.2 RUN命令
- RUN指令将在当前镜像智商的新层中自行任何命令并提交结果,生成的提交镜像将用于Dokcerfile中的下一步
- 简单来说,就是构建镜像时执行的命令,或者shell脚本
- 语法
# 语法一,在RUN 后面直接写shell脚本
RUN <command>
#例句
RUN echo hello
#语法二,使用json格式[更像是string数组,将一条命令拆分为一个string数组]
RUN ["executable","param1","param2"]
#例句
RUN ["/bin/bash","-c","echo hello"]
2.3 EXPOSE命令
- 用来指定构建的镜像运行为容器时对外暴露的端口
- 语法
EXPOSE 80/tcp 如果没有显示指定则默认暴露都是TCP
EXPOSE 80/udp
2.4 CMD命令
- 用来为启动的容器指定执行的命令,在Dockerfile中只能有一条CMD指令,如果列出多个命令,则只有最后一个命令才会生效。
- 注意:Dockerfile中只能有一条CMD指令。如果列出多个指令,则只有最后一个命令才会生效
- 容器启动的时候,也就是在docker run命令的最后,如果输入一条指令,将会覆盖Dockerfile中的CMD命令
- 如果Dockerfile中没有CMD指令,那么在Docker run的时候,最后加入一条指令,可能会报错【不确定】
- 语法:
CMD ["executable","param1","param2"] (exec from,this is the preferred form)
CMD ["param1","param2"] (as default parameters to ENTRYPOINT)
CMD command param1 param 2 (shel from)
2.5 WORKDIR命令
- 用来为Dockerfile中的任何RUN,CMD,ENTRYPOINT,COPY和ADD指令设置工作目录,如果WORKDIR不存在,即使他没有在任何后续Dokcerfile指令中使用,它也将被创建
- 语法
WORKDIR /path/to/workdir
#例句
WORKDIR /a
WORKDIR b
WORKDIR /root/home/opt
注意:WORKDIR指令可以在Dockerfile中多次使用。如果提供了相对路径,则该路径将与先前的WORKDIR路径相对
2.6 ENV命令
- 用来为构建镜像设置环境变量。这个值将出现在构建阶段中所有后续指令的环境中。
- 语法
ENV <key> <value>
ENV <key>=<value> ...
注意:在dockerfile中其他地方引用ENV定义的环境变量,可以使用$key来使用
例如:定义一个路径,在WORKDIR命令中引用
ENV BASE_DIR=/data/opt
WORKDIR $BASE_DIR
2.7 ADD命令
- 用来从context上下文复制新文件、目录或者远程文件URL,并将它们添加到位于指定路径的镜像文件中
- ADD命令如果是从宿主机上复制压缩文件到镜像,会自动解压缩
- ADD命令可以自动下载URL远程文件,但是下载的文件不能自动解压缩
- 语法:
ADD hom* /mydir 通配符添加多个文件
ADD hom?.txt /mydir 通配符添加[?站位一个字符]
ADD test.txt /relativeDir/ 可以指定相对路径
ADD test.txt /absoluteDir/ 可以指定绝对路径
ADD url
2.8 COPY命令
- 用来将context目录中指定文件复制到警醒的指定目录中
- 语法:
COPY src dest
COPY ["<src>",...,"<dest>"]
2.9 VALUME命令
- 用来定义容器运行时可以挂载到宿主机的目录
- 语法
VALUME ["/data"]
3 Dockerfile打包SpringBoot项目
3.1 创建一个简单的SpringBoot项目
省略创建SpringBoot应用
3.2 将SpringBoot应用通过maven打包成jar包
3.3 将jar包上传到Dockerfile所在的上下文目录
3.4 编写Dockerfile文件文章来源地址https://www.toymoban.com/news/detail-471028.html
# 基于jre8镜像
FROM openjdk:8-jre
#工作目录,在这里定义工作目录,下面所有的操作都是基于当前目录[目录不存在时,Dockerfile会地总创建]
WORKDIR /app
#将Dockerfile上下文目录中的SpringBoot应用jar包拷贝到镜像的工作目录
ADD docker-demo-0.0.1-SNAPSHOT.jar app.jar
#容器可以向外暴露的端口
EXPOSE 8080
#镜像启动为容器时需要执行的命令,ENTRYPOINT 为必须要执行的命令
ENTRYPOINT ["java","-jar"]
#CMD的参数可以在镜像运行的时候被替换掉,并且成为ENTRYPOINT命令的参数
CMD ["app.jar"]
到了这里,关于Dockerfile命令集的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!