Jibで作ったx86イメージがM1 Macで不安定。あとM1 BigSurでSpring Bootの起動が遅い

M1 Mac用のDockerがパブリックプレビューになって、だれでもダウンロードして試せるようになった。
"Download it here!"からダウンロードできる。
Download and Try the Tech Preview of Docker Desktop for M1 - Docker Blog

M1 MacのDockerは、x86イメージをQEMUでエミュレートして実行できる。
で、いくつか試したんだけど、どうもJibで作ったx86イメージが不安定な感じ。

Jibとは?

JavaプロジェクトのDockerイメージ化を簡単にやってくれる。 GoogleContainerTools/jib: 🏗 Build container images for your Java applications.

Springプロジェクトの作成

ということで、Spring InitializrでSpring Webを含んだプロジェクトをつくる。
f:id:nowokay:20201225235715p:plain

そして、こんなRestControllerをつくる。

@RestController
@RequestMapping("/url")
public class NewRestController {
    @GetMapping
    String hello() {
        return String.format("Hello, %s %s <br> %s %s <br> %s",
                System.getProperty("java.vm.vendor"),
                System.getProperty("java.vm.version"),
                System.getProperty("os.name"),
                System.getProperty("os.version"),
                System.getProperty("os.arch"));
    }
}

まずは普通に実行する。
f:id:nowokay:20201225220941p:plain

表示はこんな感じ。
f:id:nowokay:20201225225222p:plain:w400

ところでx86JDKを使ってNetBeansからMavenプロジェクトを実行すると、こんな警告がでる。
f:id:nowokay:20201225221138p:plain:w300

けど、キャンセルすると実行できる。
f:id:nowokay:20201225221411p:plain

こんな感じ。
f:id:nowokay:20201225221219p:plain:w400

ところでRosettaで実行するとOSバージョンが10になってるな

Jibを使ってDockerイメージをビルド

pom.xmlに次のようなpluginを追加するだけ。簡単。

<plugin>
    <groupId>com.google.cloud.tools</groupId>
    <artifactId>jib-maven-plugin</artifactId>
    <version>2.7.0</version>
    <configuration>                       
        <to>
            <image>armboot</image>
        </to>
    </configuration>
</plugin>

そうするとmvn jib:dockerBuildでDockerイメージがビルドされる。

実行するとこんな感じで、arm64で動かしてるけどamd64イメージやでって言われる。
f:id:nowokay:20201225223128p:plain しかし、amd64とarm64、区別がつかんのでx86_64とaarch64にしてほしい・・・

表示はこんな感じ。
f:id:nowokay:20201225222420p:plain:w400

ところが、たまにちゃんと起動しないことがある。
f:id:nowokay:20201225223450p:plain
画像ではまったく起動していないけど、ちょっとだけ起動が進んでSpringのロゴは出るけどTomcat起動までいかないということもある。

ためしにベースイメージを指定してみる。

<plugin>
    <groupId>com.google.cloud.tools</groupId>
    <artifactId>jib-maven-plugin</artifactId>
    <version>2.7.0</version>
    <configuration>
        <from>
            <image>openjdk:11-jdk-slim</image>
        </from>                            
        <to>
            <image>armboot</image>
        </to>
    </configuration>
</plugin>

こんな感じ。imageを指定するとOracle JDKになるのね。
f:id:nowokay:20201225232845p:plain:w400

何回か起動しなおしてるとCore Dumpを吐いてしまった。
f:id:nowokay:20201225233202p:plain

と、こんな感じで、不安定。
Ubuntuをベースイメージにしたx86イメージを動かすときは安定していたけど、たまたまかもしれない。

JibでArm用イメージを作成

ということでArm用イメージを作成する。
arm64用のベースイメージを指定することで、Armイメージが作れる。

<plugin>
    <groupId>com.google.cloud.tools</groupId>
    <artifactId>jib-maven-plugin</artifactId>
    <version>2.7.0</version>
    <configuration>
        <from>
            <image>arm64v8/openjdk:11-slim</image>
        </from>                            
        <to>
            <image>armboot</image>
        </to>
    </configuration>
</plugin>

すんなり起動。
f:id:nowokay:20201225223852p:plain

表示はこんな感じ。
f:id:nowokay:20201225224212p:plain:w400

起動時間の比較

ところで起動時間の比較。i7-7800Xでの実行結果も加えてみた。単位は秒です。

arm native x86 Rosetta arm Docker x86 Docker i7 native i7 Docker
5.7 7.2 0.9 9.2 1.5 1.7

f:id:nowokay:20201226014719p:plain

  • Big Sur上の起動が遅い
  • Rosettaはそこまで遅くならない
  • Dockerで動かすと速い
  • QEMU経由のDockerはかなり遅い

って感じですね。Big Sur上でSpring Bootを起動すると、ロゴが出るまでに時間がかかってます。
Dockerで動かすとM1の本領発揮って感じで、i7-7800Xよりかなり速いです。
けど、x86イメージをQEMUで動かすと、10倍くらい遅くなってますね。