Skip to main content

Jibを使ってJavaコンテナイメージをビルドする

Java engineering

2021年8月17日

0 分で読めます

コンテナイメージを少しでも扱ったことがあれば、イメージを構築する手順をレイヤーごとに記述した、よく知られたファイル、Dockerfileをご存じでしょう。Dockerfileを使わずにOCI準拠のイメージをビルドできるツールが増えていることをご存じですか?この記事では、Dockerfileを正しく記述する手間をかけずに最適化されたイメージをビルドできる、100% JavaベースのツールJibを紹介します。

イメージの構築方法とDockerfileの基本はすでにご存じだという前提で進めます。Dockerfileを初めて使う方は、コンテナイメージのビルドについて詳しく解説した、私の開発者主導のワークフローに関する記事をご覧ください。

課題

Java開発者であれば、アプリケーションのコードベースやライブラリの依存関係に加えて、対象とするJDKやJVMも把握していることでしょう。ベースにするWebアプリケーションサーバーのバージョンや、ガベージコレクターのチューニング、データベース接続などのランタイム設定も含まれるかもしれません。一方、これまで対応する必要がなかったのは、パッケージのインストール、ファイルシステムの権限、実行時に使うUID/GIDといったOSレベルの懸念事項や、その他の設定詳細ではないでしょうか。こうした設定は従来、プラットフォームを提供する運用チームやセキュリティチームが担当していました。

コンテナランタイムやその上で動作するオーケストレーションシステムの普及に伴い、こうした低レベルの懸念事項の多くが、アプリケーションやサービスのコードリポジトリに含まれるInfrastructure as Code(IaC)の設定ファイルという形で、開発チームの担当範囲に移りつつあります。これらのファイルには、KubernetesのYAML、TerraformのHCL、CloudFormationのJSON、そしてもちろん、アプリケーションの実行環境となるコンテナイメージの構造を定義するDockerfileなど、さまざまな形式があります。

アプリケーションをイメージにパッケージ化してコンテナで実行すること自体は、通常それほど難しくありません。しかし、イメージの構成が適切で、最適化され、安全であり、組織の標準に準拠していることを確認するのは簡単ではありません。開発者には、OSレベルのスキャンツールやイメージのラベル付け標準、最新のDockerfileのベストプラクティスなど、担当すべきことが次々と増えています。HadolintやDockle、そして当社のSnyk Containerなどの静的解析・スキャンツールは、こうした作業に役立ちます。では、こうした新たな要件や定型作業の大半、あるいはすべてを自動化できるとしたらどうでしょうか?

Jibの登場:100% Javaベースのコンテナイメージビルドツール

Jibは、Dockerfileもコンテナランタイムも不要で、OCI(Docker v2)準拠のコンテナイメージをビルドできる、オープンソースの100% Javaツールです。単体のCLIツールとしても利用できますが、一般的にはMavenまたはGradleのビルドステップ用プラグインとして使います。プラグインを使えば、Javaの成果物であるmvnやgradleのビルドコマンドを実行するだけで、.jar、.warなどの成果物に加えて、コンテナでアプリケーションをすぐに実行できるOCIイメージをビルドし、必要に応じてデプロイできます。

Spring BootアプリケーションにJibを追加するには、Mavenのpom.xmlファイルにこのXMLを記述し(ドキュメント全文はこちら)、mvn packageコマンドを再実行するだけです。ここではコンテナイメージの配置先をいくつか指定できます。この例では、後で実行に使うイメージレジストリにデプロイしますが、ローカルの**.**tarファイルに出力したり、Dockerデーモンが稼働していてアクセス可能な場合は、Dockerのローカルイメージキャッシュに保存したりすることもできます(Dockerでビルドした場合と同様です)。

<build>
<plugins>
...
<plugin>
<groupId>com.google.cloud.tools</groupId>
<artifactId>jib-maven-plugin</artifactId>
<version>3.1.1</version>
<configuration>
<to>
<image>reg.mycorp.com/smalls/spring-goof</image>
</to>
</configuration>
<executions>
<execution>
<phase>package</phase>
<goals>
<goal>build</goal>
</goals>
</execution>
</executions>
</plugin>
...
</plugins>
</build>
$mvn package
...
[INFO] --- jib-maven-plugin:3.1.1:build (default) @ spring-goof ---
[WARNING] 'mainClass' configured in 'maven-jar-plugin' is not a valid Java class: ${start-class}
[INFO] 
[INFO] Containerizing application to localhost:5000/spring-goof...
[WARNING] Base image 'adoptopenjdk:8-jre' does not use a specific image digest - build may not be reproducible
[WARNING] The credential helper (docker-credential-desktop) has nothing for server URL: localhost:5000
[WARNING] 
Got output:

credentials not found in native keychain

[WARNING] Cannot verify server at https://localhost:5000/v2/. Attempting again with no TLS verification.
[WARNING] Failed to connect to https://localhost:5000/v2/ over HTTPS. Attempting again with HTTP.
[INFO] The base image requires auth. Trying again for adoptopenjdk:8-jre...
[WARNING] The credential helper (docker-credential-desktop) has nothing for server URL: registry-1.docker.io
[WARNING] 
Got output:

credentials not found in native keychain

[WARNING] The credential helper (docker-credential-desktop) has nothing for server URL: registry.hub.docker.com
[WARNING] 
Got output:

credentials not found in native keychain

[INFO] Using credentials from Docker config (/Users/eric/.docker/config.json) for adoptopenjdk:8-jre
[INFO] Using base image with digest: sha256:117fae95422c19f1c1ddfb0f869913c1d934547e8eb903738a9fd2c3ad11a207
[INFO] 
[INFO] Container entrypoint set to [java, -cp, /app/resources:/app/classes:/app/libs/*, org.snyk.groceries.SpringGoofApplication]
[INFO] 
[INFO] Built and pushed image as localhost:5000/spring-goof
[INFO] Executing tasks:
[INFO] [==============================] 100.0% complete
[INFO] 
[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESS
[INFO] ------------------------------------------------------------------------
[INFO] Total time:  11.169 s
[INFO] Finished at: 2021-06-28T14:43:49-05:00
[INFO] ------------------------------------------------------------------------

注:上記の出力には興味深い「警告」行がいくつかあります。これについては後ほど説明します。

コンテナランタイムがインストールされたマシンで、次のコマンドを実行してコンテナを起動します:docker run --rm -it -p 8080:8080 myimage:tag

$ docker run --rm -it -p8080:8080 reg.mycorp.com/smalls/spring-goof
Unable to find image reg.mycorp.com/smalls/spring-goof:latest' locally
latest: Pulling from spring-goof
c549ccf8d472: Pull complete 
bd7766c75e8f: Pull complete 
7e80a3d8823a: Pull complete 
a7321fbff05c: Pull complete 
05d4865ff251: Pull complete 
e8d1ce8a5389: Pull complete 
bc56aad8a781: Pull complete 
Digest: sha256:74710d3c27ad84cb594b84a519c111a2b04a611ca52ac81f644e3ab5e15d0063
Status: Downloaded newer image for reg.mycorp.com/smalls/spring-goof:latest

  .   ____          _            __ _ _
 /\\ / ___'_ __ _ _(_)_ __  __ _ \ \ \ \
( ( )\___ | '_ | '_| | '_ \/ _` | \ \ \ \
 \\/  ___)| |_)| | | | | || (_| |  ) ) ) )
  '  |____| .__|_| |_|_| |_\__, | / / / /
 =========|_|==============|___/=/_/_/_/
 :: Spring Boot ::        (v1.5.5.RELEASE)

2021-06-28 19:54:51.550  INFO 1 --- [           main] o.snyk.groceries.SpringGoofApplication   : Starting SpringGoofApplication on beaa3641ca38 with PID 1 (/app/classes started by root in /)

Gradleをお使いの場合は、build.gradleファイルで同じことを行う方法について、公式ドキュメントをご覧ください。

これだけです。イメージをビルドするのにDockerfileや追加のツールは必要ありません。Javaの成果物のビルドに使っているツールだけで済みます。開発者の負担が軽くなるだけでなく、Dockerソケットを公開したり、他のビルドツールを管理したりする必要がないため、CIビルドエージェントのサポートも大幅に簡単になります。

イメージの詳細を見る

イメージのビルドは簡単になりましたが、私が初めて見たときと同じように、こんな疑問が浮かぶかもしれません……

Jibはどのようにイメージをビルドするのか?

他のイメージビルドツールと同様に、JibはJavaランタイム、アプリケーション、そのすべての依存関係を含むファイルシステムレイヤーと、コンテナエンジンがJVMの起動方法を把握するためのメタデータを作成します。

この例のレイヤー情報を、docker image historyコマンドで確認してみましょう:

$ docker image history localhost:5000/spring-goof:latest 
IMAGE          CREATED        CREATED BY                                      SIZE      COMMENT
4c125b59f147   51 years ago   jib-maven-plugin:3.1.1                          79B       jvm arg files
<missing>      51 years ago   jib-maven-plugin:3.1.1                          6.36kB    classes
<missing>      51 years ago   jib-maven-plugin:3.1.1                          0B        resources
<missing>      51 years ago   jib-maven-plugin:3.1.1                          30MB      dependencies
<missing>      10 days ago    /bin/sh -c #(nop)  ENV JAVA_HOME=/opt/java/o…   0B        
<missing>      10 days ago    /bin/sh -c set -eux;     ARCH="$(dpkg --prin…   108MB     
<missing>      10 days ago    /bin/sh -c #(nop)  ENV JAVA_VERSION=jdk8u292…   0B        
<missing>      10 days ago    /bin/sh -c apt-get update     && apt-get ins…   43.2MB    
<missing>      10 days ago    /bin/sh -c #(nop)  ENV LANG=en_US.UTF-8 LANG…   0B        
<missing>      10 days ago    /bin/sh -c #(nop)  CMD ["bash"]                 0B        
<missing>      10 days ago    /bin/sh -c #(nop) ADD file:920cf788d1ba88f76…   72.7MB    

最初の4つのレイヤーのCREATEDの日付がすべて「51年前」と表示されていることに注目してください。これは、同じコードベースからのビルドでまったく同じレイヤーハッシュを生成することを目指す、Jibの再現可能なビルド戦略によるものです。詳しくは、FAQをご覧ください。

レイヤーのコメントを見ると、AdoptOpenJDKのデフォルトのベースイメージ(詳細は後述)から複数のレイヤーがあり、その後に次のレイヤーが続いていることがわかります:

  • Maven/Gradleファイルで定義されたライブラリの依存関係

  • リソースファイル

  • コンパイル済みアプリケーションコードのクラスファイル

  • Java JVMの引数ファイル

オープンソースツールdiveを使って、さらに詳しく各レイヤーに含まれるファイルを見てみましょう:

依存関係

このレイヤーには、すべての.jarファイルが/app/libsフォルダーに追加されています。

│ Layers ├──────────────────────────────────────────────────────────────────── ┃ ● Current Layer Contents ┣━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
Cmp   Size  Command                                                            Permission     UID:GID       Size  Filetree
     73 MB  FROM 679f8666b5733b3                                               drwxr-xr-x         0:0      30 MB  └── app
     43 MB  apt-get update     && apt-get install -y --no-install-recommends t drwxr-xr-x         0:0      30 MB      └── libs
    108 MB  set -eux;     ARCH="$(dpkg --print-architecture)";     case "${ARC -rw-r--r--         0:0     445 kB          ├── antlr-2.7.7.jar
     30 MB  jib-maven-plugin:3.1.1                                             -rw-r--r--         0:0     1.9 MB          ├── aspectjweaver-1.8.10.jar
       0 B  jib-maven-plugin:3.1.1                                             -rw-r--r--         0:0      65 kB          ├── classmate-1.3.3.jar
    6.4 kB  jib-maven-plugin:3.1.1                                             -rw-r--r--         0:0     314 kB          ├── dom4j-1.6.1.jar
      79 B  jib-maven-plugin:3.1.1                                             -rw-r--r--         0:0      13 kB          ├── evo-inflector-1.2.2.jar
                                                                               -rw-r--r--         0:0     1.8 MB          ├── h2-1.4.196.jar
│ Layer Details ├───────────────────────────────────────────────────────────── -rw-r--r--         0:0      75 kB          ├── hibernate-commons-annotations-5
                                                                               -rw-r--r--         0:0     5.6 MB          ├── hibernate-core-5.0.12.Final.jar
Tags:   (unavailable)                                                          -rw-r--r--         0:0     612 kB          ├── hibernate-entitymanager-5.0.12.
Id:     da844eca910f44e825c72121f4ec9700b3c9eec8d4c2407f926cdad0799b33e8       -rw-r--r--         0:0     113 kB          ├── hibernate-jpa-2.1-api-1.0.0.Fin
Digest: sha256:0862e7d5215a0ec2cf7d5a8864a5a0439d9c70c39b14cdc6c38f41487ca8f23 -rw-r--r--         0:0     726 kB          ├── hibernate-validator-5.3.5.Final
Command:                                                                       -rw-r--r--         0:0      56 kB          ├── jackson-annotations-2.8.0.jar
jib-maven-plugin:3.1.1                                                         -rw-r--r--         0:0     283 kB          ├── jackson-core-2.8.9.jar

リソース

ここには/app/resourcesと、リソースフォルダー内の関連ファイルがすべて含まれています。

┃ ● Layers ┣━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ │ Current Layer Contents ├────────────────────────────────────────────────────
Cmp   Size  Command                                                            Permission     UID:GID       Size  Filetree
     73 MB  FROM 679f8666b5733b3                                               drwxr-xr-x         0:0        0 B  └── app
     43 MB  apt-get update     && apt-get install -y --no-install-recommends t drwxr-xr-x         0:0        0 B      └── resources
    108 MB  set -eux;     ARCH="$(dpkg --print-architecture)";     case "${ARC -rw-r--r--         0:0        0 B          ├── application.properties
     30 MB  jib-maven-plugin:3.1.1                                             drwxr-xr-x         0:0        0 B          └── org                     
       0 B  jib-maven-plugin:3.1.1                                             drwxr-xr-x         0:0        0 B              └── snyk           
    6.4 kB  jib-maven-plugin:3.1.1                                             drwxr-xr-x         0:0        0 B                  └── groceries
      79 B  jib-maven-plugin:3.1.1                                             drwxr-xr-x         0:0        0 B                      ├── domain     
                                                                               drwxr-xr-x         0:0        0 B                      └── repository
│ Layer Details ├─────────────────────────────────────────────────────────────                                                                               

Tags:   (unavailable)                                                                                                                                        
Id:     7891783fbddf2ac3f624ecdea6fd7d51efa476bf87b82a3a1da2517167a7812a                                                                                     
Digest: sha256:bc7cee3aeb381d0b453212f345eaf34f55613c2dbb988af22f626877f4ecc89                                                                               
Command:                                                                                                                                                   
jib-maven-plugin:3.1.1                                              

クラス

ビルドのコンパイルフェーズで生成された.classファイルは、このレイヤーの/app/classesにあります。

┃ ● Layers ┣━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ │ Current Layer Contents ├────────────────────────────────────────────────────
Cmp   Size  Command                                                            Permission     UID:GID       Size  Filetree
     73 MB  FROM 679f8666b5733b3                                               drwxr-xr-x         0:0     6.4 kB  └── app
     43 MB  apt-get update     && apt-get install -y --no-install-recommends t drwxr-xr-x         0:0     6.4 kB      └── classes  
    108 MB  set -eux;     ARCH="$(dpkg --print-architecture)";     case "${ARC drwxr-xr-x         0:0     6.4 kB          └── org                   
     30 MB  jib-maven-plugin:3.1.1                                             drwxr-xr-x         0:0     6.4 kB              └── snyk                
       0 B  jib-maven-plugin:3.1.1                                             drwxr-xr-x         0:0     6.4 kB                  └── groceries  
    6.4 kB  jib-maven-plugin:3.1.1                                             -rw-r--r--         0:0     3.3 kB                      ├── SpringGoofApplicati
      79 B  jib-maven-plugin:3.1.1                                             drwxr-xr-x         0:0     1.7 kB                      ├── domain     
                                                                               -rw-r--r--         0:0     1.7 kB                      │   └── Item.class
│ Layer Details ├───────────────────────────────────────────────────────────── drwxr-xr-x         0:0     1.3 kB                      └── repository         
                                                                               -rw-r--r--         0:0     1.3 kB                          └── ItemRepository.
Tags:   (unavailable)                                                                                                                                        
Id:     5d4509a5f5856f5d6de92ed621d301861fccf414f9088d0c81e47572f48e4194                                                                                     
Digest: sha256:778c99f6b1c637ab73e3fff99e933d6d6a8d247f9849d2695066c4f2e823ee7                                                                               
Command:                                                                                                                                                   
jib-maven-plugin:3.1.1  

JVM引数ファイル

┃ ● Layers ┣━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ │ Current Layer Contents ├────────────────────────────────────────────────────
Cmp   Size  Command                                                            Permission     UID:GID       Size  Filetree
     73 MB  FROM 679f8666b5733b3                                               drwxr-xr-x         0:0       79 B  └── app
     43 MB  apt-get update     && apt-get install -y --no-install-recommends t -rw-r--r--         0:0       39 B      ├── jib-classpath-file
    108 MB  set -eux;     ARCH="$(dpkg --print-architecture)";     case "${ARC -rw-r--r--         0:0       40 B      └── jib-main-class-file       
     30 MB  jib-maven-plugin:3.1.1                                                                                                                    
       0 B  jib-maven-plugin:3.1.1                                                                                                               
    6.4 kB  jib-maven-plugin:3.1.1                                                                                                                           
      79 B  jib-maven-plugin:3.1.1                                                                                                                   

│ Layer Details ├─────────────────────────────────────────────────────────────                                                                               

Tags:   (unavailable)                                                                                                                                        
Id:     22877091a2de894cac9070c121b116e5d3247b3a4f81774032c0698bf6a2de2f                                                                                     
Digest: sha256:d8a8afa0a3d1efdb00b38b28e3dd075342c0dc65e52977e56dd3f21c277ae94                                                                               
Command:                                                                                                                                                   
jib-maven-plugin:3.1.1             

最後に、コンテナ内でJVMを起動する際に使う引数を含むファイルがいくつか、最上位の/appフォルダーにあります。この例では、これら2つのファイルの内容を確認すると、ランタイムのクラスパスとメインクラスの情報がわかります。

# cat jib-classpath-file
/app/resources:/app/classes:/app/libs/*

# cat jib-main-class-file
org.snyk.groceries.SpringGoofApplication

注:Maven/Gradleビルドの構成によっては、Jibで生成したイメージにさらにレイヤーが含まれる場合があります。その他のレイヤーについては、Jib FAQをご覧ください。

Jibが使用するベースイメージは?独自のイメージを使う必要がある場合は?

デフォルトでは、JibはJARファイルのビルドにDockerHub公式のadoptopenjdk:jre-8ベースイメージを、WARのビルドにはDockerHub公式のjettyベースイメージを使います。プラグイン設定で変更できます。必要に応じて独自のENTRYPOINT, USERなどを設定する方法を含め、詳細は公式ドキュメントをご覧ください。同じドキュメントでは、独自のベースイメージを設定し、特定のハッシュを使ってビルドの再現性を確保することが望ましい理由も説明しています。多くの組織では、セキュリティチームや運用チームが監査・強化した、開発チームが使用を義務付けられている「承認済み」のベースイメージが社内に用意されています。Mavenのpom.xmlを変更してそのようなイメージを使う例を紹介します。

<build>
<plugins>
...
<plugin>
...
<configuration>
<from>
<image>reg.mycorp.com/smalls-base/openjdk:8u292-2021.7.4</image>
</from>
...
</configuration>
...
</plugin>
...
</plugins>
</build>

標準化されたイメージラベルなど、その他の設定にも対応しています。たとえば、組織で次のラベルをすべてのイメージに含めることが求められているとします:

  • ソースコードのGit URL

  • GitのコミットID/ハッシュ

  • Mavenプロジェクトのビルドバージョン

pom.xmlからこれらのデータにアクセスできる場合、ラベルを追加するJibプラグインの設定はとても簡単です:

<build>
<plugins>
...
<plugin>
...
<configuration>
...
<container>
<labels>
<git.remote.origin.url>${git.remote.origin.url}</git.remote.origin.url>
<git.commit.id>${git.commit.id}</git.commit.id>
<mvn.build.version>${project.version}</mvn.build.version>
</labels>
</container>
...
</configuration>
...
</plugin>
...
</plugins>
</build>

作成したイメージを確認すると、DockerfileのLABELS行で追加した場合と同じようにラベルが適用されています(ここでは便利なコマンドラインツールjqを使って、応答から該当する配列だけを取り出しています)。

$ docker image inspect reg.mycorp.com/smalls/spring-goof:latest | jq .[].Config.Labels
{
  "git.commit.id": "960d768e9739ffb8e9a503c9ad3f6dad86ac68b1",
  "git.remote.origin.url": "git@github.com:mycorp-dev/spring-goof.git",
  "mvn.build.version": "0.0.1-SNAPSHOT"
}

こうした標準設定の複雑さをすべて、<pluginManagement>やその他の一般的なMaven設定を使って親POMで定義することを想像してみてください。開発者は定型的なXMLを気にしたり、目を通したりする必要がなくなり、アーキテクトは各チームに負担をかけずに、組織全体の標準を適用し、更新できるようになります。

セキュリティを確保するには?

Dockerfileのような汎用的なイメージビルドツールを使う際の課題の1つは、パッケージのインストールやADDによる不特定のWebサーバーからのファイルのダウンロードなど、ビルドの過程でほぼ何でもできてしまうことです。そのため、レビューして精査が必要な手順が数多く発生します。Jibでは、こうした選択の多くが自動的に適用されます。また、上書きするには、依存関係やその他のビルド設定の変更と同じように、コードレビューで明確にわかるMaven/Gradle設定の変更が必要です。

セキュリティスキャンに関して、Snyk Containerの優れた機能の1つは、脆弱性の少ないベースイメージを推奨できることです。現在では、イメージのベースを特定するためのDockerfileがなくても、この機能を利用できます。つまり、JibやDockerfileを使わない他のツールでビルドされたイメージも、同じ推奨を活用できます。

ご自身のJavaコンテナをスキャンして試してみたい場合は、無料アカウントを作成し、Snykのスキャンツールのインストール手順をご確認ください。

この例では、ベースイメージをopenjdk:8u121-jreに設定してmvn packageを実行し、イメージをノートパソコンにプルしました。次にsnyk container testを実行してスキャンします。

$ snyk container test localhost:5000/spring-goof:latest

Testing localhost:5000/spring-goof:latest...

... (a bunch of scan results removed here) ...

Organization:      mycorp-snyk-org
Package manager:   deb
Project name:      docker-image|reg.mycorp.com/smalls/spring-goof:latest
Docker image:      reg.mycorp.com/smalls/spring-goof:latest
Platform:          linux/amd64
Base image:        openjdk:8u181-jre-stretch
Licenses:          enabled

Tested 261 dependencies for known issues, found 410 issues.

Base Image                 Vulnerabilities  Severity
openjdk:8u181-jre-stretch  410              149 high, 91 medium, 170 low

Recommendations for base image upgrade:

Minor upgrades
Base Image             Vulnerabilities  Severity
openjdk:8-jre-stretch  205              71 high, 36 medium, 98 low

Major upgrades
Base Image                  Vulnerabilities  Severity
openjdk:11.0.5-jre-stretch  178              66 high, 28 medium, 84 low

Alternative image types
Base Image                         Vulnerabilities  Severity
openjdk:17-ea-22-oraclelinux8      0                0 high, 0 medium, 0 low
openjdk:16-jdk-oraclelinux7        0                0 high, 0 medium, 0 low
openjdk:17-ea-27-jdk-oraclelinux7  0                0 high, 0 medium, 0 low
openjdk:16-ea-29-jdk-oraclelinux8  0                0 high, 0 medium, 0 low

ご覧のとおり、スキャンではベースイメージとしてopenjdk:8u181-jre-stretch(openjdk:8u181-jreのエイリアスタグ)を自動検出し、410件の脆弱性が報告されました。また、ベースイメージを変更するための推奨も提示されます。軽微なバージョンアップから、問題が約半分の最新のopenjdk:8-jreタグ、さらには脆弱性がまったくない新しいJVMまで、幅広い選択肢があります。

つまり、使用中のイメージに存在する脆弱性を特定できるだけでなく、Dockerfileを1行も書かずに、新しいベースイメージを使って解決する方法も提案してもらえます。

まとめ

このようにJibを使えば、Dockerfileの構文を学んだり、使い慣れないツールをインストールしたりする必要がなくなり、Javaアプリケーションのコンテナ化が開発者にとって大幅に簡単になります。また、広く使われているMavenやGradleのプロジェクト階層機能を通じて、アーキテクトが標準化を管理するのにも役立ちます。JibはOCI準拠のイメージをビルドするため、Snyk Containerなどの業界標準ツールを活用して、アプリケーションを検査、デプロイ、実行できます。

Java以外のプロジェクトもサポートしている場合は、Buildah、Bazel、Earthlyや、BuildKit関連の各種プロジェクトなど、この分野の他のツールも検討してみてください。また、同僚のPas Apicellaが最近Cloud Native Build Packsについての記事を公開しました。ぜひお読みください。

無料アカウントに登録して、コンテナ、オープンソースの依存関係、IaCコードのテストを今すぐ始めましょう!

ソースコードの段階からインフラを保護

Snykはワークフロー内のIaCセキュリティとコンプライアンスを自動化し、構成ドリフトや不足しているリソースを検出します。

続きを読む

feature customer snowflake
Article

開発初期からセキュリティを確保:Snowflake Cortex Code向けSnyk Studioインテグレーションを発表

Snyk StudioがSnowflake Cortex Codeと連携し、開発中にAI生成コード、依存関係、コンテナの脆弱性をスキャンします。

blog feature pypi spoof
Article

オープンソースのメンテナーに、Snyk AI Security Platformをすべて無料で提供

オープンソースのメンテナーは、実際の脆弱性レポートに追われ、優先順位付けや修正、修正版のリリースを迅速に進めるための支援を必要としています。SnykのSecure Developer Programでは、条件を満たすプロジェクトにSnyk AI Security Platformを無料で提供します。

feature insights announcement
Blog

Node-gypサプライチェーン侵害:binding.gypに潜む自己増殖型npmワーム

新たなnpmワームがbinding.gypを悪用し、インストール時にnode-gypを起動。ライフサイクルスクリプトを使わずに悪意あるパッケージからコードを実行します。認証情報を窃取し、GitHub上に潜伏し、メンテナー間で自己増殖します。