当前位置:Java -> 使用容器化技术对Ballerina GraalVM可执行文件进行封装
欢迎回到探索Ballerina与GraalVM协同作用的系列文章。在上一篇文章“将Ballerina代码转换为GraalVM可执行文件”中,我们深入研究了Ballerina与GraalVM之间的无缝集成,见证了Ballerina应用程序如何构建GraalVM原生可执行文件,实现了性能提升和内存消耗减少。在本文中,我们将继续探讨如何将Ballerina GraalVM可执行文件放入容器中。如果您还没有阅读上一篇文章,我建议您在继续本文之前先阅读一下。
我们将使用相同的Conference Service
应用程序来构建一个包含GraalVM可执行文件的Docker镜像。该应用程序的代码可以在下面的链接中找到:
我们将探讨以下几种方式来创建Docker镜像。
我们已经知道,GraalVM原生可执行文件是平台相关的。如果您是Linux用户,那么您可以在本地构建GraalVM可执行文件,并将其传递给带有最简单slim容器的Docker。如果您在macOS或Windows上构建包含GraalVM可执行文件的Docker镜像,则必须在Docker容器中构建可执行文件。
在本文中,我正在使用macOS,因此我需要在具有GraalVM原生镜像工具的Docker容器中构建可执行文件。GraalVM社区已经提供了带有native-image工具的容器镜像。这些镜像可以在GraalVM容器页面上找到。由于Ballerina Swan Lake Update 7使用Java11,我选择了这个镜像:ghcr.io/graalvm/native-image:ol8-java11–22.3.3
。
让我们从构建应用程序并获取JAR文件开始。
$ bal build Compiling source tharmigan/conference_service:1.0.0 Generating executable target/bin/conference_service.jar
使用以下Docker文件来在graalvm/native-image
容器中构建GraalVM可执行文件,并在debian:stable-slim
容器中运行可执行文件。
FROM ghcr.io/graalvm/native-image:ol8-java11-22.3.3 as build
WORKDIR /app/build
COPY target/bin/conference_service.jar .
RUN native-image -jar conference_service.jar --no-fallback
FROM debian:stable-slim
WORKDIR /home/ballerina
COPY --from=build /app/build/conference_service .
CMD echo "time = $(date +"%Y-%m-%dT%H:%M:%S.%3NZ") level = INFO module = tharmigan/conference_service message = Executing the Ballerina application" && "./conference_service"
$ docker build . -t ktharmi176/conference-service:1.0.0
使用以下Docker Compose文件在主机网络中运行conference_service
和模拟的country_service
。
version: '2'
services:
conference-service:
image: 'ktharmi176/conference-service:1.0.0'
ports:
- '8102:8102'
volumes:
- ./Config.toml:/home/ballerina/Config.toml
depends_on:
country-service:
condition: service_started
network_mode: "host"
country-service:
image: 'ktharmi176/country-service:latest'
hostname: country-service
container_name: country-service
ports:
- '9000:9000'
network_mode: "host"
检查镜像名称并运行以下命令:
$ docker compose up
现在,这两个服务已经启动。使用request.http
文件测试服务。
Ballerina中的Code to Cloud功能使开发人员能够快速将其Ballerina应用程序部署到云平台,无需进行繁琐的配置或手动设置。它旨在降低云原生开发的复杂性并简化部署过程。
我们可以简单地运行以下命令来在Docker容器中构建GraalVM可执行文件。
$ bal build --graalvm --cloud=docker Compiling source tharmigan/conference_service:1.0.0 Generating artifacts Building the native image. This may take a while [+] Building 331.1s (13/13) FINISHED docker:default => [internal] load build definition from Dockerfile 0.0s => => transferring dockerfile: 439B 0.0s => [internal] load .dockerignore 0.0s => => transferring context: 2B 0.0s => [internal] load metadata for gcr.io/distroless/base:latest 3.0s => [internal] load metadata for ghcr.io/graalvm/native-image:ol8-java11-22.3.3 3.7s => [build 1/4] FROM ghcr.io/graalvm/native-image:ol8-java11-22.3.3@sha256:c0b4d9c31013d4fd91c4dec25f8772602e851ee67b8510d21bfdab532da4c17c 0.0s => [stage-1 1/3] FROM gcr.io/distroless/base@sha256:73deaaf6a207c1a33850257ba74e0f196bc418636cada9943a03d7abea980d6d 0.0s => [internal] load build context 0.4s => => transferring context: 42.65MB 0.4s => CACHED [stage-1 2/3] WORKDIR /home/ballerina 0.0s => CACHED [build 2/4] WORKDIR /app/build 0.0s => [build 3/4] COPY conference_service.jar . 0.1s => [build 4/4] RUN native-image -jar conference_service.jar -H:Name=conference_service --no-fallback -H:+StaticExecutableWithDynamicLibC 326.3s => [stage-1 3/3] COPY --from=build /app/build/conference_service . 0.3s => exporting to image 0.3s => => exporting layers 0.3s => => writing image sha256:4a6e1223a8d5a0446b688b110522bdc796027bfc1bc4fe533c62be649900ee05 0.0s => => naming to docker.io/library/conference_service:latest 0.0s Execute the below command to run the generated Docker image: docker run -d conference_service:latest
自动生成的Docker文件可以在以下路径中找到:target/docker/conference_service
# Auto Generated Dockerfile
FROM ghcr.io/graalvm/native-image:ol8-java11-22.3.3 as build
WORKDIR /app/build
COPY conference_service.jar .
RUN native-image -jar conference_service.jar -H:Name=conference_service --no-fallback -H:+StaticExecutableWithDynamicLibC
FROM gcr.io/distroless/base
WORKDIR /home/ballerina
COPY --from=build /app/build/conference_service .
CMD ["./conference_service"]
现在,更改conference_service
的镜像名称后,让我们运行docker-compose
。
version: '2'
services:
conference-service:
image: 'conference_service:latest'
ports:
- '8102:8102'
volumes:
- ./Config.toml:/home/ballerina/Config.toml
depends_on:
country-service:
condition: service_started
network_mode: "host"
country-service:
image: 'ktharmi176/country-service:latest'
hostname: country-service
container_name: country-service
ports:
- '9000:9000'
network_mode: "host"
request.http
文件测试服务。
代码到云特性支持覆盖默认模式,其中我们配置如下:
这可以通过提供配置文件Cloud.toml
来实现。下面是一个示例,提供了与自定义Docker文件相同的配置。
[container.image]
name = "conference-service"
repository = "ktharmi176"
tag = "1.0.0"
base = "debian:stable-slim"
[graalvm.builder]
base = "ghcr.io/graalvm/native-image:ol8-java11-22.3.3"
buildCmd = "native-image -jar conference_service.jar --no-fallback"
$ bal build --graalvm --cloud=docker Compiling source tharmigan/conference_service:1.0.0 Generating artifacts Building the native image. This may take a while [+] Building 310.0s (14/14) FINISHED docker:default => [internal] load build definition from Dockerfile 0.0s => => transferring dockerfile: 372B 0.0s => [internal] load .dockerignore 0.0s => => transferring context: 2B 0.0s => [internal] load metadata for docker.io/library/debian:stable-slim 3.9s => [internal] load metadata for ghcr.io/graalvm/native-image:ol8-java11-22.3.3 2.5s => [auth] library/debian:pull token for registry-1.docker.io 0.0s => [build 1/4] FROM ghcr.io/graalvm/native-image:ol8-java11-22.3.3@sha256:c0b4d9c31013d4fd91c4dec25f8772602e851ee67b8510d21bfdab532da4 0.0s => [stage-1 1/3] FROM docker.io/library/debian:stable-slim@sha256:6fe30b9cb71d604a872557be086c74f95451fecd939d72afe3cffca3d9e60607 0.0s => [internal] load build context 0.3s => => transferring context: 42.65MB 0.3s => CACHED [stage-1 2/3] WORKDIR /home/ballerina 0.0s => CACHED [build 2/4] WORKDIR /app/build 0.0s => [build 3/4] COPY conference_service.jar . 0.1s => [build 4/4] RUN native-image -jar conference_service.jar --no-fallback 305.1s => [stage-1 3/3] COPY --from=build /app/build/conference_service . 0.2s => exporting to image 0.3s => => exporting layers 0.3s => => writing image sha256:1f5b5b30653a48a6d27258f785d93a1654dde25d2e70899e14f2b61996e01996 0.0s => => naming to docker.io/ktharmi176/conference-service:1.0.0 0.0s Execute the below command to run the generated Docker image: docker run -d ktharmi176/conference-service:1.0.0
带有上述配置的自动生成的Docker文件将如下所示。
# Auto Generated Dockerfile
FROM ghcr.io/graalvm/native-image:ol8-java11-22.3.3 as build
WORKDIR /app/build
COPY conference_service.jar .
RUN native-image -jar conference_service.jar --no-fallback
FROM debian:stable-slim
WORKDIR /home/ballerina
COPY --from=build /app/build/conference_service .
CMD ["./conference_service"]
这与我们手动编写的文件相同。运行Docker-compose,并使用request.http
文件检查功能。
总之,我们已经为一个Ballerina应用程序构建了一个GraalVM可执行文件,并将其容器化在Docker中。GraalVM和Ballerina的代码到云特性简化了在云中开发和部署Ballerina GraalVM本机镜像的体验。它还能够在不深入了解的情况下轻松使用GraalVM与云原生技术。
推荐阅读: 剑指offer 22.链表中倒数第k个节点
本文链接: 使用容器化技术对Ballerina GraalVM可执行文件进行封装