4
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

BunAdvent Calendar 2023

Day 21

Bunで生成したバイナリがdistrolessコンテナ上で動かない【解決】

Posted at

結論

gcr.io/distroless/static-debian12ではなくgcr.io/distroless/base-debian12を使え!

はじめに

Bun、速くて身軽で快適ですよね。

もはやyarnやpnpmなどのパッケージマネージャは不要だし、ランタイム同梱のバイナリまで生成してくれるのでDockerfile職人にも優しいです。

しかし今回、一部のdistrolessイメージではBunが生成するバイナリを動かせないという事象に遭遇したため、解決方法と共にこちらに残しておきます。

使用したDockerfile

FROM oven/bun:1 as install
WORKDIR /temp/build
COPY package.json bun.lockb /temp/build/
RUN bun install --frozen-lockfile

FROM install as build
COPY . .
RUN bun run compile

FROM gcr.io/distroless/static-debian12:nonroot
COPY --from=build /temp/build/app /
ENTRYPOINT [ "/app" ]

bun run compilebun build --compile src/index.ts --outfile ./appと読み替えてください。

これを以下のdockerコマンドで実行すると、

$ docker build --no-cache -t myapp .
$ docker run --init -t myapp
exec /app: no such file or directory

エラーが出てしまいました。

原因

/appは確かに存在するし、実行ファイルであることには間違いないのにno such file or directoryと言われてしまいます。

結論から言うと、エラーの原因は「distrolessのstaticイメージにはglibcが含まれていない」ことだったようです。

なので、先ほどのDockerfileの最終ベースイメージのgcr.io/distroless/static-debian12gcr.io/distroless/base-debian12に置き換えると動くようになります。

補足

/appは確かに存在するし、実行ファイルであることには間違いないのにno such file or directoryと言われてしまいます。

と述べましたが、何も説明せずに言い切ってしまうのは無責任だと思うので実施した調査方法を共有しておきます。

実は、各distrolessイメージにはdebugタグが用意されており(参照)、通常のイメージには含まれていないシェルなどが同梱されています。こちらのタグを利用すればdocker run -itでコンテナ内に潜り込んで調査できるというわけです。

4
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
4
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?