さくらの夕べ Tech Night #2 Online のアーカイブで、2つ目のセッション「いまさら聞けないDockerの”hello-world”イメージ」を視聴してHello World の Docker イメージを自作してみようと思い試してみました。
Hello World アプリを作成する
まず、Hello world を表示する何かを作らないといけない。
最小構成にするためベースとなるイメージを scratch にしたい。
つまり /bin/sh が動かないのでシェルスクリプトではなくバイナリーを作らないといけない。
Hello World を C 言語で書く。久しぶりに C を書いた。
1 |
|
ビルドする。
1 |
問題なくビルドできたので、実行してみる。
1 | ./hello |
Hello World の Docker イメージを作成する
最小構成でイメージを作成したいので、scratch を使用することにした。
1 | FROM scatch |
作成した Dockerfiele を元に Docker イメージをビルドする。
1 | sudo docker build --no-cache -t hello ./ |
コンテナを起動してみる。
1 | sudo docker run --rm hello |
あれ、動かない!?
原因調査
実行ファイル自体は COPY されているので、”no such file or directory” となるのは、実行ファイル hello を動かすために必要なファイルが他にあるのだろう。
昔の記憶を頼りに動的リンクするライブラリーが必要なのだろうと調べてみる。
1 | ldd hello |
やはり、Docker コンテナ内で実行するとライブラリーが存在しないので、エラーが発生するようだ。
対処方法
不足しているライブラリーを Docker イメージに COPY する方法もあるが、今回は最小構成の Docker イメージを作成したいので実行ファイルにライブラリーを含めてしまうことにする。
1 | gcc -static -o hello hello.c |
今度は必要なライブリーがすべて含まれた実行ファイルが作れた。
再挑戦
再度、Docker イメージを作成する。
1 | sudo docker build --no-cache -t hello ./ |
そして、実行する。
1 | sudo docker run --rm hello |
動いた!