AlpineベースのDockerイメージ
Crystalチームは、Docker Hubのcrystallang/crystal
で、CrystalコンパイラがインストールされたDockerイメージを提供しています。0.13.0以降のCrystalバージョンは、様々なバージョンのUbuntu LinuxをベースとしたDockerイメージとして利用可能です。Alpine Linuxベースのイメージも、0.32.1-alpineから利用可能になりました。AlpineイメージはUbuntuイメージよりも軽量で、0.32.1では185MBに対して115MBです。ほんのわずかなバイトの節約です。
しかし、より重要なのは、Alpine Linuxがほとんどの他のディストリビューション(Ubuntuを含む)でデフォルトで使用されているgnu-libc
ではなく、musl-libc
をベースとしていることです。musl-libc
にリンクすることは、現在完全に静的にリンクされたCrystalバイナリをビルドする唯一の方法です。Alpine Linuxはこの作業を容易にします。たとえば、公式のCrystalコンパイラのLinuxビルドは、Alpine Linux上でmusl-libc
に対して静的にリンクされています。
APK(Alpineのパッケージマネージャー)用のCrystalパッケージは既にかなり前から利用可能であり、エッジリリースは通常非常に迅速に更新されます。更新されたDockerイメージは、新しいCrystalリリースと同時にすぐに利用可能になります。そして、常に安定したバージョンのAlpine Linuxをベースとしながら、最新のCrystalリリースを提供します。
以下は、Dockerイメージを使用して静的にリンクされたHello Worldプログラムをビルドする方法の例です。
$ echo 'puts "Hello World!"' > hello-world.cr
$ docker run --rm -it -v $PWD:/workspace -w /workspace crystallang/crystal:0.32.1-alpine \
crystal build hello-world.cr --static
$ ./hello-world
Hello World!
$ ldd hello-world
statically linked