dockerfile文件

1.标准格式

Dockerfile 是一个文本文件,开发者使用它来定义如何构建一个Docker镜像。它是自动化构建Docker镜像的标准方法,包含了用于构建镜像的一系列指令,这些指令会被Docker引擎按顺序逐行解析并执行。

Dockerfile主要以下几部分组成

  1. 基础镜像信息

    • FROM:这是Dockerfile中的第一条必填指令,用来指定构建新镜像的基础镜像。
  2. 维护者信息

    • MAINTAINER(已废弃,推荐使用LABEL):用于指定镜像的维护者信息,但在较新的Docker版本中,建议使用LABEL maintainer="name <email>"的形式来提供元数据标签。
  3. 镜像操作指令

    • RUN:用于在构建镜像的过程中执行命令,如安装软件包或编译代码。
    • COPY 或 ADD:用于将宿主机的文件或目录复制到镜像内部。
    • WORKDIR:设置工作目录,后续的RUN、CMD、ENTRYPOINT等指令将在该目录下执行。
    • ENV:设置环境变量。
    • EXPOSE:声明容器运行时监听的端口,但并不真正暴露端口,还需在运行时通过 -p 参数映射。
    • VOLUME:定义容器内的数据卷,用于持久化数据或与其他容器共享数据。
    • USER:指定运行镜像内命令的用户身份。
    • ONBUILD:用于定义其他镜像基于当前镜像构建时触发的构建指令。
  4. 容器启动时执行指令

    • 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 指令则更适合用于提供默认参数或允许在运行容器时动态修改命令。

Logo

权威|前沿|技术|干货|国内首个API全生命周期开发者社区

更多推荐