一起养成写作习惯!这是我参与「掘金日新计划 · 4 月更文挑战」的第5天,点击查看活动详情
1、序言
项目使用的是Docker快速部署应用,之前对于DockerFile的了解知之甚少,所以借这个项目的机会,来学习一下Docker及其相关操作,本文主要是DockerFile的相关知识。
2、DockerFile是什么?
DockerFile是一个文本文件,主要是用来构建Docker镜像的,其内容主要包含了构建镜像所需的指令和说明。
3、执行顺序
在使用命令docker build运行DockerFile的时候,Docker会以从上到下的顺序逐行读取DockerFile,识别其中每行命令,来构建对应的Docker容器。
4、官方文档指令
4.0 指令列表
- 这些命令是从官方文档中查找的,当前时间:
2022-04-06 19:22:37
| 命令 | 说明 | 官方说明 |
|---|---|---|
| FROM | 指定当前镜像所用基础镜像 | FROM |
| RUN | 指定编译过程中要运行的命令 | RUN |
| CMD | 启动容器时可以执行的命令 | CMD |
| LABEL | 设置镜像的标签 | LABEL |
| MAINTAINER | 设置当前镜像的作者(官方标识已过期) | MAINTAINER |
| EXPOSE | 声明当前镜像需要暴露的接口 | EXPOSE |
| ENV | 指定当前容器的环境变量 | ENV |
| ADD | 复制镜像外部资源到镜像内 | ADD |
| COPY | 从构建的上下文中复制文件 | COPY |
| ENTRYPOINT | 设置一下当前容器的入口程序和参数 | ENTRYPOINT |
| VOLUME | 设置当前的挂载 | VOLUME |
| USER | 设置运行程序的用户名 | USER |
| WORKDIR | 指定容器的工作目录 | WORKDIR |
| ARG | 编译镜像时的额外参数 | ARG |
| ONBUILD | 设置当前容器的命令 | ONBUILD |
| STOPSIGNAL | 设置容器推出时的信号量 | STOPSIGNAL |
| HEALTHCHECK | 容器的健康检查 | HEALTHCHECK |
| SHELL | 执行的shell脚本 | SHELL |
为了指定基本映像,第一条指令必须是FROM
4.1 FROM
- 功能:指定当前镜像所用基础镜像,因此Dockerfile第一条非注释指令必须是FROM。
格式:
FROM <image>
FROM <image>:<tag>
FROM <image>@<digest>
注:
tag或digest是可选的,如果不使用这两个值时,会使用latest版本的基础镜像
4.2 RUN
- 功能:指定编译过程中要运行的命令,其有以下两种命令执行方式。
shell执行
格式:
RUN <command>
exec执行
格式:
RUN ["executable", "param1", "param2"]
示例:
RUN ["executable", "param1", "param2"]
RUN ["/etc/execfile", "arg1", "arg1"]
注:
RUN指令创建的中间镜像会被缓存,并会在下次构建中使用。
如果不想使用这些缓存镜像,可以在构建时指定--no-cache参数,如:docker build --no-cache
说明:CMD 在docker run 时运行;RUN 在docker build 时运行。
4.3 CMD
- 功能:提供容器运行时的默认值,这些默认值可以是一条指令,也可以是一些参数;一个Dockerfile中可以有多条CMD指令,但只有最后一条CMD指令有效。
格式:
CMD ["executable","param1","param2"] (执行可执行文件,优先)
CMD ["param1","param2"] (设置了ENTRYPOINT,则直接调用ENTRYPOINT添加参数)
CMD command param1 param2 (执行shell内部命令)
示例:
CMD echo "This is a test." | wc -
CMD ["/usr/bin/wc","--help"]
注:
CMD不同于RUN,CMD用于指定在容器启动时所要执行的命令,而RUN用于指定镜像构建时所要执行的命令。
4.4 LABEL
4.5 EXPOSE
4.6 ENV
4.7 COPY
4.8 ENTRYPOINT
4.9 ARG
5、项目DockerFile
#指定基础镜像
FROM java:8
#这里的 /tmp 目录就会在运行时自动挂载为匿名卷,任何向 /data 中写入的信息都不会记录进容器存储层
VOLUME /tmp
#复制上下文目录下的target/xxxx.jar 到容器里
COPY target/xxxx.jar xxxx.jar
#RUN新建立一层,在其上执行这些命令,执行结束后, commit 这一层的修改,构成新的镜像。
RUN bash -c "touch /xxxx.jar"
#声明运行时容器提供服务端口,这只是一个声明,在运行时并不会因为这个声明应用就会开启这个端口的服务
EXPOSE 9200
#指定容器启动程序及参数
ENTRYPOINT ["java","-jar","xxxx.jar"]