一、标准格式
Dockerfile 是一个文本文件,开发者使用它来定义如何构建一个Docker镜像。它是自动化构建Docker镜像的标准方法,包含了用于构建镜像的一系列指令,这些指令会被Docker引擎按顺序逐行解析并执行。
构建镜像时,通过在命令行中运行
docker build
并指定Dockerfile所在的路径来创建镜像:
二、使用
1、准备一个java类文件
import java.util.Timer;
import java.util.TimerTask;
public class App {public static void main(String[] args) {Timer timer = new Timer();timer.schedule(new TimerTask() {@Overridepublic void run() {System.out.println("running");}},5000,5*1000);}
}
2、标准dockerfile文件格式
#基础镜像
FROM openjdk:8
#工作目录设置
WORKDIR /opt/
#复制文件到镜像
COPY . /opt/
#编译java类
RUN javac App.java
#运行Java类
# CMD [ "java","App" ]
ENTRYPOINT [ "java" ,"App" ]
这个示例Dockerfile的功能是构建一个基于OpenJDK 8镜像的Docker镜像。它的构建过程包括以下步骤:
1). 使用 FROM 指令指定基础镜像,这里使用的是OpenJDK 8镜像。
2). 使用 WORKDIR 指令设置工作目录为 /opt ,后续的操作都在这个目录下进行。
3). 使用 COPY 指令将当前目录下的所有文件复制到容器的 /opt 目录下。
4). 使用 RUN 指令在容器中执行命令,这里是使用javac编译App.java文件。
5). 使用 CMD 指令在容器启动时执行命令,这里是执行Java应用程序。
通过以上步骤,我们可以使用该Dockerfile构建一个包含Java应用程序的镜像,并在容器启动时执行Java应用程序。
3、构建镜像
1)构建镜像 (进入你配置的文件夹中构建)
进入你配置的文件夹中构建
docker build -t myapp myapp:v1 .
2) 构建完成,你可以使用 docker images 命令来查看构建好的镜像列表:
docker images
3)运行
进入你配置的文件夹中运行
docker run myapp:v4
4、 CMD 与 ENTRYPOINT 区别
在Dockerfile中, CMD 和 ENTRYPOINT 都是用于定义容器启动时要执行的命令或脚本。它们之间有一些区别:
CMD 指令:
- CMD 指令用于设置容器启动时要执行的默认命令。它可以有多种形式:
- CMD ["executable","param1","param2"] :使用JSON数组格式,推荐使用这种形式。
- CMD command param1 param2 :使用命令格式,不推荐使用这种形式。
- 如果在运行镜像时指定了要运行的命令,那么 CMD 指令将被覆盖。 docker run app206:v1 /bin/bash
- CMD 指令可以被Dockerfile中的多个 CMD 指令覆盖,但只有最后一个 CMD 指令会生效。
ENTRYPOINT 指令:
- ENTRYPOINT 指令类似于 CMD ,用于设置容器启动时要执行的命令。它也可以有多种形式:
- ENTRYPOINT ["executable","param1","param2"] :使用JSON数组格式,推荐使用这种形式。
- ENTRYPOINT command param1 param2 :使用命令格式,不推荐使用这种形式。
- 与 CMD 不同的是, ENTRYPOINT 指令的参数不会被覆盖。如果在构建镜像时指定了要运行的命令,它将作为参数传递给 ENTRYPOINT 指令。
综上所述, CMD 指令用于设置默认的容器启动命令,而 ENTRYPOINT 指令用于设置始终执行的命令。 ENTRYPOINT 指令更适合用于定义容器的主要执行逻辑,而 CMD 指令则更适合用于提供默认参数或允许在运行容器时动态修改命令。