当前位置:Java -> 使用容器化技术对Ballerina GraalVM可执行文件进行封装

使用容器化技术对Ballerina GraalVM可执行文件进行封装


欢迎回到探索Ballerina与GraalVM协同作用的系列文章。在上一篇文章“将Ballerina代码转换为GraalVM可执行文件”中,我们深入研究了Ballerina与GraalVM之间的无缝集成,见证了Ballerina应用程序如何构建GraalVM原生可执行文件,实现了性能提升和内存消耗减少。在本文中,我们将继续探讨如何将Ballerina GraalVM可执行文件放入容器中。如果您还没有阅读上一篇文章,我建议您在继续本文之前先阅读一下。

我们将使用相同的Conference Service应用程序来构建一个包含GraalVM可执行文件的Docker镜像。该应用程序的代码可以在下面的链接中找到:

我们将探讨以下几种方式来创建Docker镜像。

  1. 使用自定义Docker文件。
  2. 使用Ballerina Code to Cloud功能。

使用自定义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镜像。
$ 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中的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"]

注意:默认情况下,Ballerina构建一个主要是静态的native-image,并将其打包在一个distroless容器中。有关GraalVM主要静态映像的更多信息,参见静态和主要静态映像

现在,更改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文件测试服务。

配置模式

代码到云特性支持覆盖默认模式,其中我们配置如下:

  • GraalVM构建镜像
  • native-image构建命令
  • 部署的基础镜像

这可以通过提供配置文件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"

运行以下命令构建带有上述配置的Docker镜像。
$ 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可执行文件进行封装