Docker 无框架 Java REST API

Docker a framework-less Java REST API

我有一个 Java RESTful API 项目,没有使用任何框架或项目管理,如 Maven 或 Gradle。它只是一个 .java 文件正在编译和 运行.

我的任务是将其 Dockerize,但找不到任何文章或教程说明如何在我的案例中进行操作。所有文章都使用 Spring 和 Maven。

有人能给我指出正确的方向吗?

P.S。我没有使用 IDE;我正在使用 VSCode 及其 Java 扩展。

理论上,您实际上只需要一个带有 JVM(或其相关部分)的容器和一个 Java 文件。

构建Java应用程序(替换Maven)

您需要做的不同之处在于编译/打包,因为您没有 Maven。但是,如果您只有一个 .java 文件并且没有依赖项,那么这非常简单。您可以简单地使用 javac 编译您的应用程序,然后使用 java 运行 它。 这是一个类似于您的项目的 HelloWorld 应用程序的快速演练:一个 .java 文件,没有依赖项。

Application.java

public class Application {
    public static void main(String[] args) {
        System.out.println("Hello World!");
    }
}

编译

使用javac得到Application.class

javac Application.java

您现在可以选择为您的应用程序创建一个 .jar 文件。

jar -cvf Application.jar Application.class

运行它

一旦你有 Application.class 你可以简单地 运行 使用 java.

java Application

.jar 文件

java -jar Application.jar

JVM

所以您现在可以构建您的 Java 应用程序,唯一真正的问题是您从哪个图像开始您的 Docker 图像。你需要一个 JVM 到 运行 它和 javac 来构建它,没有别的。 您可以使用 pre-built 图像,例如 eclipse-termurin,那么您的 Docker 图像将看起来像这样。我在这里使用我的小 HelloWorld 应用程序。

Note: This is using Java 11, you will need to do some adjustments for later Java versions.

Docker文件

# Multi-stage docker build
# this is the image we are using to build the docker image
FROM eclipse-temurin:11 as builder
# make a folder for the build
RUN mkdir /opt/build
COPY Application.java /opt/build/Application.java
RUN javac /opt/build/Application.java

# this is the actual production docker image
FROM eclipse-temurin:11
ENV APP_HOME=/opt/app
# make a folder for the application
RUN mkdir ${APP_HOME}
# copy the built application over from the builder image
COPY --from=builder /opt/build/Application.class  /opt/app/Application.class
# Not required for my application but your web server
# The next line exposes port 8080 (if uncommented)
# EXPOSE 8080
# this is run on docker run
CMD cd $APP_HOME && java Application

使用此 Docker 文件,您将能够构建映像(当您位于 Docker 文件的目录中时)

docker build -t test/java .

最后但并非最不重要的 运行 它。

docker run --rm test/java

对于您的 Web 服务器,您还需要使用选项 -p 提供端口映射,例如 -p 8080:8080

这将打印

Hello World!

相关部分是FROM。那里有很多选择。

  1. 从 OS 图片开始

您可以从一个简单的 OS 映像开始,例如 Ubuntu 或 Alpine Linux 安装 JVM,例如使用apt 存储库、二进制文件或其他任何内容,然后构建您的项目并 运行 如上所示。

  1. 从 pre-built 图片开始

有 JVM 的小 pre-built 图像已经可以使用了,例如Eclipse-Termurin or OpenJDK,其中一些实际上已经过时,您需要为您想要的 java 版本选择正确的标签。正如 DockerHub for Eclipse Termurin 中所解释的,您还可以使用 jlink 构建自己的 JVM,这可能会给您一个更小的容器。

  1. Distroless 图像

所有上述选项实际上都是更大或更小的 Linux 发行版,带有 JVM 运行ning,但也有 Distroless containers 非常小,没有 [=111] =] 或为您的应用程序安装的其他不必要的东西。

还有一些构建好的 Docker 容器的最佳实践,它们侧重于安全性、图像大小、缓存等领域,所以这些当然值得探索,因为 Docker 文件我已经向您展示了绝不是生产就绪,但它可以工作并且可以帮助您入门。