Docker--dockerfile文件
Dockerfile 是一个文本文件,开发者使用它来定义如何构建一个Docker镜像。它是自动化构建Docker镜像的标准方法,包含了用于构建镜像的一系列指令,这些指令会被Docker引擎按顺序逐行解析并执行。Dockerfile主要以下几部分组成。
dockerfile文件
1.标准格式
Dockerfile 是一个文本文件,开发者使用它来定义如何构建一个Docker镜像。它是自动化构建Docker镜像的标准方法,包含了用于构建镜像的一系列指令,这些指令会被Docker引擎按顺序逐行解析并执行。
Dockerfile主要以下几部分组成
-
基础镜像信息:
FROM
:这是Dockerfile中的第一条必填指令,用来指定构建新镜像的基础镜像。
-
维护者信息:
MAINTAINER
(已废弃,推荐使用LABEL):用于指定镜像的维护者信息,但在较新的Docker版本中,建议使用LABEL maintainer="name <email>"
的形式来提供元数据标签。
-
镜像操作指令:
RUN
:用于在构建镜像的过程中执行命令,如安装软件包或编译代码。COPY
或ADD
:用于将宿主机的文件或目录复制到镜像内部。WORKDIR
:设置工作目录,后续的RUN、CMD、ENTRYPOINT等指令将在该目录下执行。ENV
:设置环境变量。EXPOSE
:声明容器运行时监听的端口,但并不真正暴露端口,还需在运行时通过-p
参数映射。VOLUME
:定义容器内的数据卷,用于持久化数据或与其他容器共享数据。USER
:指定运行镜像内命令的用户身份。ONBUILD
:用于定义其他镜像基于当前镜像构建时触发的构建指令。
-
容器启动时执行指令:
CMD
:指定容器启动时默认执行的命令及其参数,但可以通过docker run
指定覆盖。ENTRYPOINT
:类似于 CMD,但是不可被docker run
的命令行参数直接覆盖,它定义了容器启动时始终执行的可执行程序,并且可以与 CMD 结合使用。
2.使用
2.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() {
@Override
public void run() {
System.out.println("running");
}
},5000,5*1000);
}
}
2.2 标准dockerfile文件格式
# 基础镜像
FROM openjdk:8
# 作者
LABEL maintainer="heimi"
# 工作目录
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应用程序。
2.3构建镜像
1.首先,进入到含有dockerfile文件的目录下
2.运行命令
docker build -t myapp:v1 .
-t myapp:v1 :指定构建的镜像名称为 myapp:v1 ,你可以自定义镜像名称。
. 表示Dockerfile所在的当前目录。
执行结果:
3.输入命令,查看构建镜像是否成功
docker images
3.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 指令则更适合用于提供默认参数或允许在运行容器时动态修改命令。
更多推荐
所有评论(0)