0

0

Quarkus 应用在 Render.com 上的 Docker 部署指南

聖光之護

聖光之護

发布时间:2025-09-02 19:22:01

|

973人浏览过

|

来源于php中文网

原创

quarkus 应用在 render.com 上的 docker 部署指南

本文旨在解决将 Quarkus Java 应用通过 Docker 部署到 Render.com 时遇到的构建失败问题。核心内容是采用多阶段 Dockerfile 策略,确保在容器内部完成应用编译,并仅将运行时所需的产物打包到最终镜像中,同时强调 .dockerignore 文件配置的重要性,以实现高效、可靠的云平台部署。

1. 背景与挑战

随着 Heroku 等平台免费层的取消,开发者们正积极寻找替代方案来部署 Java 应用。Render.com 作为一种流行的云服务,虽然不直接支持 Java 原生构建,但其对 Docker 的良好支持使其成为一个有吸引力的选择。然而,对于初次尝试将 Quarkus 应用通过 Docker 部署到 Render 的开发者来说,可能会遇到构建失败的问题,尤其是在处理 Quarkus 默认提供的 Dockerfile 时。

典型的 Quarkus 应用在本地开发时,通常会在运行 mvnw package 后生成编译好的产物。而默认的 Quarkus Dockerfile 往往假定这些产物(位于 target/quarkus-app 目录)已经存在于构建上下文中。当直接将包含源代码的 Git 仓库连接到 Render 并尝试构建时,由于 target 目录尚未生成,Docker 构建过程将因找不到文件而失败,报错信息通常为 no such file or directory。

2. 问题分析:默认 Dockerfile 的局限性

Quarkus 提供的默认 Dockerfile.jvm 示例通常如下所示:

FROM registry.access.redhat.com/ubi8/openjdk-17:1.14
ENV LANGUAGE='en_US:en'
COPY --chown=185 target/quarkus-app/lib/ /deployments/lib/
COPY --chown=185 target/quarkus-app/*.jar /deployments/
COPY --chown=185 target/quarkus-app/app/ /deployments/app/
COPY --chown=185 target/quarkus-app/quarkus/ /deployments/quarkus/
EXPOSE 8080
USER 185
ENV JAVA_OPTS="-Dquarkus.http.host=0.0.0.0 -Djava.util.logging.manager=org.jboss.logmanager.LogManager"
ENV JAVA_APP_JAR="/deployments/quarkus-run.jar"

这个 Dockerfile 的核心问题在于,它直接尝试从本地文件系统的 target/quarkus-app 目录复制文件。在 Docker 构建环境中,如果这个目录在构建开始前不存在(即没有在本地运行 mvnw package),或者在 Dockerfile 中没有明确的编译步骤,那么 COPY 指令就会失败。即使尝试在 COPY 之前添加 RUN ./mvnw package,如果构建上下文没有包含完整的项目源代码,同样会导致问题。

3. 解决方案:采用多阶段 Dockerfile 构建

解决此问题的最佳实践是采用多阶段 Dockerfile 构建。多阶段构建允许在一个 Dockerfile 中定义多个阶段,每个阶段可以基于不同的基础镜像,并且可以将前一个阶段的产物传递给下一个阶段。这使得我们可以在一个阶段中完成应用的编译,然后在另一个更轻量级的阶段中只包含运行时所需的产物,从而生成更小、更安全的最终镜像。

以下是一个适用于 Quarkus 应用的多阶段 Dockerfile 示例:

# --- 构建阶段 ---
# 使用包含 JDK 和 Maven 的基础镜像进行编译
FROM registry.access.redhat.com/ubi8/openjdk-17:1.14 as builder

# 设置工作目录
WORKDIR /project

# 复制 Maven 依赖文件,利用 Docker 缓存加速构建
COPY pom.xml .
COPY .mvn .mvn
COPY mvnw .
RUN ./mvnw dependency:go-offline -B

# 复制项目源代码
COPY src src

# 编译 Quarkus 应用
RUN ./mvnw package -Dquarkus.package.type=mutable-jar -DskipTests

# --- 运行时阶段 ---
# 使用更轻量级的 JDK 运行时镜像
FROM registry.access.redhat.com/ubi8/openjdk-17:1.14 as runner

# 设置语言环境
ENV LANGUAGE='en_US:en'

# 从构建阶段复制编译好的应用产物
COPY --from=builder /project/target/quarkus-app/lib/ /deployments/lib/
COPY --from=builder /project/target/quarkus-app/*.jar /deployments/
COPY --from=builder /project/target/quarkus-app/app/ /deployments/app/
COPY --from=builder /project/target/quarkus-app/quarkus/ /deployments/quarkus/

# 暴露应用端口
EXPOSE 8080

# 以非 root 用户运行
USER 185

# 设置 Java 运行时参数
ENV JAVA_OPTS="-Dquarkus.http.host=0.0.0.0 -Djava.util.logging.manager=org.jboss.logmanager.LogManager"
ENV JAVA_APP_JAR="/deployments/quarkus-run.jar"

# 定义容器启动命令
ENTRYPOINT [ "java", "-jar", "/deployments/quarkus-run.jar" ]

多阶段 Dockerfile 详解:

  1. 构建阶段 (builder):

    Designify
    Designify

    拖入图片便可自动去除背景✨

    下载
    • FROM registry.access.redhat.com/ubi8/openjdk-17:1.14 as builder: 选择一个包含 JDK 和构建工具(如 Maven)的基础镜像。as builder 为此阶段命名。
    • WORKDIR /project: 设置容器内的工作目录。
    • COPY pom.xml . 和 COPY .mvn .mvn 等:首先复制 Maven 相关的配置文件和 Wrapper 脚本。
    • RUN ./mvnw dependency:go-offline -B: 这一步会下载所有项目依赖。由于依赖通常不常变动,Docker 会缓存这一层,显著加速后续构建。
    • COPY src src: 复制项目源代码。
    • RUN ./mvnw package -Dquarkus.package.type=mutable-jar -DskipTests: 在容器内部执行 Maven 打包命令,生成可运行的 Quarkus JAR 包。-DskipTests 可以跳过测试以节省构建时间。
  2. 运行时阶段 (runner):

    • FROM registry.access.redhat.com/ubi8/openjdk-17:1.14 as runner: 选择一个用于运行应用的基础镜像。这里仍然使用了相同的 JDK 镜像,但如果需要更小的镜像,可以选择 JRE only 的镜像。
    • COPY --from=builder /project/target/quarkus-app/...: 这是多阶段构建的关键。它从名为 builder 的阶段中复制编译好的 quarkus-app 目录下的所有运行时文件到当前阶段的 /deployments 目录。这意味着最终的镜像只包含运行应用所需的最小文件集,不包含构建工具和源代码。
    • 其余指令与原始 Dockerfile 类似,用于配置运行时环境和启动命令。

4. .dockerignore 文件配置

在使用多阶段 Dockerfile 时,.dockerignore 文件的配置至关重要。它决定了哪些文件和目录不会被复制到 Docker 构建上下文中。如果 .dockerignore 文件中包含 * 或 src/ 等规则,可能会阻止源代码被复制到构建阶段,从而导致编译失败。

重要提示: 确保 .dockerignore 文件中不包含会阻止源代码(如 src 目录)被复制到构建上下文的规则。如果存在 * 这样的通配符,请务必移除或修改,以允许必要的源代码被复制。

一个合理的 .dockerignore 文件示例:

target/
.mvn/wrapper/maven-wrapper.jar
.git/
.gitignore
.idea/
*.iml
*.log
tmp/

这个配置会忽略 target 目录(因为我们会在容器内生成它)、Git 相关文件、IDE 文件等,但会确保 src 目录和 pom.xml 等关键文件被包含在构建上下文中。

5. Render.com 部署步骤

完成上述 Dockerfile 和 .dockerignore 的配置后,在 Render.com 上部署 Quarkus 应用的步骤如下:

  1. 连接 GitHub 仓库: 在 Render 控制台中创建一个新的 Web Service,并将其连接到包含你的 Quarkus 项目的 GitHub 仓库。
  2. 配置构建环境:
    • Build Command (构建命令): 通常不需要显式设置,因为 Dockerfile 会处理所有构建逻辑。
    • Dockerfile Path (Dockerfile 路径): 指定你的 Dockerfile 在仓库中的相对路径,例如 ./src/main/docker/Dockerfile.jvm (如果你的 Dockerfile 位于此路径)。
    • Root Directory (根目录): 如果你的项目不是仓库的根目录,请指定包含 pom.xml 和 src 目录的子目录路径。
  3. 配置运行时环境:
    • Port (端口): 确保与 Dockerfile 中 EXPOSE 的端口一致,通常是 8080。
    • Health Check Path (健康检查路径): 根据你的 Quarkus 应用配置设置,例如 /q/health。
  4. 部署: 保存配置并触发部署。Render 将会拉取你的代码,根据 Dockerfile 构建镜像,并运行你的 Quarkus 应用。

6. 总结与注意事项

  • 多阶段构建的优势: 通过多阶段 Dockerfile,我们实现了在容器内部完成应用编译,确保了构建环境的隔离性和一致性。最终生成的镜像更小,因为它只包含运行时所需的产物,不含构建工具和源代码,从而提高了部署效率和安全性。
  • 构建上下文的重要性: 理解 Docker 构建上下文对于避免 no such file or directory 错误至关重要。确保所有在 Dockerfile 中 COPY 或 ADD 的文件在构建开始时都存在于构建上下文中。
  • .dockerignore 的精确配置: 正确配置 .dockerignore 文件可以优化构建性能,避免不必要的文件被复制到构建上下文中,同时确保必要的源代码和依赖文件被包含。
  • 资源考量: Quarkus 应用在启动时可能需要一定的内存。在 Render 上部署时,请根据应用实际需求选择合适的实例类型和内存配置。

通过遵循这些步骤和最佳实践,开发者可以成功地将 Quarkus Java 应用部署到 Render.com,享受云原生部署的便利性。

相关专题

更多
java
java

Java是一个通用术语,用于表示Java软件及其组件,包括“Java运行时环境 (JRE)”、“Java虚拟机 (JVM)”以及“插件”。php中文网还为大家带了Java相关下载资源、相关课程以及相关文章等内容,供大家免费下载使用。

825

2023.06.15

java正则表达式语法
java正则表达式语法

java正则表达式语法是一种模式匹配工具,它非常有用,可以在处理文本和字符串时快速地查找、替换、验证和提取特定的模式和数据。本专题提供java正则表达式语法的相关文章、下载和专题,供大家免费下载体验。

724

2023.07.05

java自学难吗
java自学难吗

Java自学并不难。Java语言相对于其他一些编程语言而言,有着较为简洁和易读的语法,本专题为大家提供java自学难吗相关的文章,大家可以免费体验。

731

2023.07.31

java配置jdk环境变量
java配置jdk环境变量

Java是一种广泛使用的高级编程语言,用于开发各种类型的应用程序。为了能够在计算机上正确运行和编译Java代码,需要正确配置Java Development Kit(JDK)环境变量。php中文网给大家带来了相关的教程以及文章,欢迎大家前来阅读学习。

396

2023.08.01

java保留两位小数
java保留两位小数

Java是一种广泛应用于编程领域的高级编程语言。在Java中,保留两位小数是指在进行数值计算或输出时,限制小数部分只有两位有效数字,并将多余的位数进行四舍五入或截取。php中文网给大家带来了相关的教程以及文章,欢迎大家前来阅读学习。

398

2023.08.02

java基本数据类型
java基本数据类型

java基本数据类型有:1、byte;2、short;3、int;4、long;5、float;6、double;7、char;8、boolean。本专题为大家提供java基本数据类型的相关的文章、下载、课程内容,供大家免费下载体验。

445

2023.08.02

java有什么用
java有什么用

java可以开发应用程序、移动应用、Web应用、企业级应用、嵌入式系统等方面。本专题为大家提供java有什么用的相关的文章、下载、课程内容,供大家免费下载体验。

429

2023.08.02

java在线网站
java在线网站

Java在线网站是指提供Java编程学习、实践和交流平台的网络服务。近年来,随着Java语言在软件开发领域的广泛应用,越来越多的人对Java编程感兴趣,并希望能够通过在线网站来学习和提高自己的Java编程技能。php中文网给大家带来了相关的视频、教程以及文章,欢迎大家前来学习阅读和下载。

16881

2023.08.03

php源码安装教程大全
php源码安装教程大全

本专题整合了php源码安装教程,阅读专题下面的文章了解更多详细内容。

74

2025.12.31

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
Kotlin 教程
Kotlin 教程

共23课时 | 2.2万人学习

C# 教程
C# 教程

共94课时 | 5.8万人学习

Java 教程
Java 教程

共578课时 | 40.5万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号