0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

Dockerfile定义Docker镜像的构建过程

科技绿洲 来源:Java技术指北 作者:Java技术指北 2023-09-30 10:22 次阅读

了解Dockerfile

Dockerfile 是一个文本文件,用于定义 Docker 镜像的构建过程。它以指令的形式描述了如何构建镜像,从基础镜像开始逐步添加配置、文件和依赖,最终形成我们所需要的镜像。为我们提供了一种简单且可重复的方式来定义镜像构建过程。

Dockerfile 指令

  • FROM 指令: FROM 指令是 Dockerfile 的第一条指令,用于指定基础镜像。选择合适的基础镜像非常重要,因为它将直接影响镜像的大小和性能。我们还可以利用多阶段构建来减小镜像大小。
  • RUN 指令: RUN 指令用于在镜像构建过程中执行命令。通过 RUN,我们可以安装软件包、运行脚本以及配置环境。
  • COPY 和 ADD 指令: 这两个指令用于将本地文件复制到镜像中。区别在于 ADD 指令支持自动解压缩和远程 URL,但推荐使用 COPY 指令,因为它更明确和可预测。
  • CMD 和 ENTRYPOINT 指令: 这两个指令用于定义容器启动时要执行的命令。CMD 定义的命令可以被 docker run 命令行参数所覆盖,而 ENTRYPOINT 定义的命令会一直执行。

以下是一个简单的Dockerfile 示例:

# 使用 openjdk 镜像作为基础镜像
FROM openjdk:latest

# 设置工作目录
WORKDIR /app

# 复制 Java 项目的 JAR 文件到镜像中
COPY target/myapp.jar /app/

# 定义容器启动时执行的命令
CMD ["java", "-jar", "myapp.jar"]

在上面的示例中,我们使用 openjdk:latest 作为基础镜像,并将 Java 项目的 JAR 文件复制到镜像中。然后,通过 CMD 指令定义了容器启动时执行的命令,即运行 java -jar myapp.jar 启动 Java 应用程序。

多阶段构建

多阶段构建是一种优化 Docker 镜像大小的技巧,特别适用于构建 Java 项目等编译型语言的应用。在多阶段构建中,我们可以在一个 Dockerfile 中定义多个 FROM 指令,每个指令表示一个构建阶段。最终镜像只保留最后一个 FROM 指令所定义的阶段,其他中间产物都不会包含在最终镜像中,从而减小镜像的体积。

Dockerfile 示例:

# 第一阶段:构建 Java 项目
FROM maven:latest AS builder

WORKDIR /app

COPY pom.xml .
RUN mvn dependency:go-offline

COPY src/ /app/src/
RUN mvn package

# 第二阶段:运行 Java 项目
FROM openjdk:latest

WORKDIR /app

COPY --from=builder /app/target/myapp.jar /app/

CMD ["java", "-jar", "myapp.jar"]

在上面的示例中,我们使用了两个 FROM 指令:

FROM maven:latest AS builder 表示第一阶段构建 Java 项目,使用 Maven 镜像进行依赖安装和项目构建;

FROM openjdk:latest 表示第二阶段,使用 OpenJDK 镜像来运行 Java 项目。通过 COPY --from 指令,我们从第一阶段的镜像中复制构建好的 JAR 文件到第二阶段,从而减小了最终镜像的大小。

Dockerfile 高级用法

  • 使用 ARG 和 ENV: ARG 指令用于在构建过程中传递参数,而 ENV 指令用于设置环境变量。利用这些指令,我们可以更灵活地定制镜像的构建过程。
  • 使用 WORKDIR: WORKDIR 指令用于设置工作目录,即在容器内运行命令的默认目录。这样可以使 Dockerfile 更易读和维护。
  • 使用 VOLUME: VOLUME 指令用于在容器中创建挂载点,使得容器中的数据可以持久化保存在宿主机上。

Dockerfile 示例:

# 第一阶段:构建 Java 项目
FROM maven:latest AS builder

# 使用 ARG 指令传递构建参数
ARG APP_VERSION=1.0.0
ARG BUILD_ENV=production

# 设置工作目录
WORKDIR /app

# 复制 pom.xml 并安装项目依赖
COPY pom.xml .
RUN mvn dependency:go-offline

# 复制源代码并构建项目
COPY src/ /app/src/
RUN mvn package -DskipTests

# 第二阶段:运行 Java 项目
FROM openjdk:latest

# 使用 ENV 指令设置环境变量
ENV APP_PORT=8080
ENV BUILD_ENV=${BUILD_ENV}

# 使用 VOLUME 指令创建挂载点
VOLUME /app/logs

# 设置工作目录
WORKDIR /app

# 复制构建好的 JAR 文件到镜像中
COPY --from=builder /app/target/myapp-${APP_VERSION}.jar /app/

# 定义容器启动时执行的命令
CMD ["java", "-jar", "myapp-${APP_VERSION}.jar", "--port=${APP_PORT}", "--env=${BUILD_ENV}"]

在上面的示例中,我们首先使用 ARG 指令来定义构建参数 APP_VERSIONBUILD_ENV,并在 FROM maven:latest AS builder 阶段中使用 ARG 指令传递构建参数。

这样,在构建时可以通过 --build-arg 参数来传递具体的值,例如:

cssCopy code
docker build --build-arg APP_VERSION=2.0.0 --build-arg BUILD_ENV=staging -t my-java-app .

这样可以构建不同版本和不同环境的镜像。

同时,我们使用 VOLUME 指令创建了挂载点 /app/logs,使得容器中的日志文件可以持久化保存在宿主机上。

小结

Dockerfile 是构建 Docker 镜像的核心工具,它使得镜像构建过程变得简单、可重复和高效。通过本文的介绍,你已经了解了 Dockerfile 的基本语法和常用指令,以及一些最佳实践。随着你的实践和深入学习,相信你将能够创建出更加优秀的 Docker 镜像,并更好地应用 Docker 在软件开发和部署中。

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 容器
    +关注

    关注

    0

    文章

    495

    浏览量

    22061
  • 软件包
    +关注

    关注

    0

    文章

    104

    浏览量

    11592
  • 镜像
    +关注

    关注

    0

    文章

    164

    浏览量

    10715
  • Docker
    +关注

    关注

    0

    文章

    457

    浏览量

    11852
收藏 人收藏

    评论

    相关推荐

    介绍一下linux环境下docker的使用流程

    Dockerfile 还有其他很多的指令,请在 Docker 查看指令的用法。FROMFROM 指令初始化一个新的构建阶段,并为后续指令设置基本镜像。因此,一个有效的
    发表于 04-27 15:03

    构建ARM64版本nacos docker镜像

    在适配过程中有大量合作伙伴用到nacos且采用容器化部署,dockerhub未提供官方镜像,因此需要在鲲鹏服务器自定义构建构建前提:
    发表于 06-16 14:29

    介绍一款非常方便的java领域docker镜像构建工具

    工具.亮点是不需要Docker daemon,意味着即使本地没有安装docker也能通过jib构建docker镜像,并且可以
    发表于 07-19 17:41

    一文详解DockerFile基础知识

    ]#[root@e554346292fa local# 构建的时候设置环境变量# 镜像的工作目录]#大家还是不要把注释写道dockerfile里....6 查看构建
    发表于 09-15 15:54

    浅析Docker镜像本地存储机制及容器启动原理

    镜像各层内容及对应大小,每层对应着 Dockerfile 中的一条指令。Docker 镜像默认存储在 /var/lib/docker/《st
    发表于 10-19 14:17 2528次阅读

    Docker镜像的详细讲解

    本文是对 Docker 镜像的详细讲解,讲解了如何安装 Docker、配置 Docker 镜像加速以及操作
    的头像 发表于 08-02 10:00 2178次阅读

    镜像构建Dockerfile的介绍

    Dockerfile 是一个用来构建镜像的文本文件,文本内容包含了一条条构建镜像所需的指令和说明。
    的头像 发表于 09-06 09:36 1149次阅读

    如何创建 Docker 镜像的能力

    本文将带大家继续深入了解 Dockerfile 镜像创建过程中最重要的配置文件内容,更加透彻地了解整个容器镜像的创建过程
    的头像 发表于 09-16 09:39 1124次阅读

    Dockerfile的最佳实践

    随着应用的容器化、上云后,将伴随着 Docker 镜像构建构建 Docker 镜像成为了最基
    的头像 发表于 01-20 10:59 989次阅读
    <b class='flag-5'>Dockerfile</b>的最佳实践

    Docker入门指南之什么是Dockerfile

    发时所构建镜像或者通过Dockerfile文件构建一个新的镜像开始工作 * 对于运维人员:在部署时,可以实现应用的无缝移植
    的头像 发表于 02-06 15:25 639次阅读
    <b class='flag-5'>Docker</b>入门指南之什么是<b class='flag-5'>Dockerfile</b>

    docker 搜索镜像,docker查看镜像详细信息(docker下载镜像命令)

    Docker Hub是集中管理的Docker镜像注册中心。通过Docker 用户可以在注册中心搜索、下载和使用CLI命令行工具中的镜像。以下
    的头像 发表于 07-19 09:46 1856次阅读

    构建docker镜像应该遵循哪些原则

    构建 Docker 镜像时,应遵循以下原则: 单一职责:每个镜像应只包含一个应用或服务,避免将多个应用或服务放在同一个镜像中。这样可以确保
    的头像 发表于 11-23 09:41 1025次阅读

    如何使用dockerfile创建镜像

    Docker是一个开源的平台,用于快速构建、打包、部署应用程序的容器化工具。而Dockerfile是一个文本文件,包含了一组可自动化构建Docker
    的头像 发表于 11-23 09:52 738次阅读

    手动构建Docker镜像的方法

    不推荐使用docker commit命令,而应该使用更灵活、更强大的dockerfile构建docker镜像
    的头像 发表于 08-05 15:30 517次阅读
    手动<b class='flag-5'>构建</b><b class='flag-5'>Docker</b><b class='flag-5'>镜像</b>的方法

    提升DevOps效率,从基础到进阶的Dockerfile编写技巧

    创建自定义镜像Dockerfile 由一行行命令语句组成,并且支持以 # 开头的注释行。 Docker分为四部分: 基础镜像信息 维护者
    的头像 发表于 11-26 09:44 87次阅读
    提升DevOps效率,从基础到进阶的<b class='flag-5'>Dockerfile</b>编写技巧