Alpine×Netlify CLIでのEdge Functions障害とDocker再ビルド


目次

2年ぶりくらいにNetlifyのDockerコンテナを再ビルドしたら動作しなくなっていた件について

Hugoのバージョンアップ、GolangのバージョンアップをしているついでにNodeのバージョンアップをしようとコンテナのベースイメージを最新版にしたら起動しなくなってしまった。

正確には、Netlify-cliのコマンドは立ち上がるが、認証を通した後しばらくすると

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
✖ Setting up the Edge Functions environment. This may take a couple of minutes.
 ›   Error: Netlify CLI has terminated unexpectedly
This is a problem with the Netlify CLI, not with your application.
If you recently updated the CLI, consider reverting to an older version by running:

npm install -g netlify-cli@VERSION

You can use any version from https://ntl.fyi/cli-versions.

Please report this problem at https://ntl.fyi/cli-error including the error details below.

Error: There was a problem setting up the Edge Functions environment. To try a manual installation, visit https://ntl.fyi/install-deno.
    at toError (file:///usr/local/lib/node_modules/netlify-cli/dist/utils/command-helpers.js:152:16)
    at logAndThrowError (file:///usr/local/lib/node_modules/netlify-cli/dist/utils/command-helpers.js:158:17)
    at prepareServer (file:///usr/local/lib/node_modules/netlify-cli/dist/lib/edge-functions/proxy.js:148:16)
    at process.processTicksAndRejections (node:internal/process/task_queues:95:5)

  System:
    OS: Linux 6.10 Alpine Linux
    CPU: (8) x64 VirtualApple @ 2.50GHz
  Binaries:
    Node: 20.19.2 - /usr/local/bin/node
    Yarn: 1.22.22 - /usr/local/bin/yarn
    npm: 10.8.2 - /usr/local/bin/npm
  npmGlobalPackages:
    netlify-cli: 21.4.2

といったエラーが出てしまうようになった。

Nodeのバージョンをあげたことが問題かと思い、ベースイメージを元に戻して(キャッシュを消して)再ビルドしたところ、今度はこっちも立ち上がらない。

一見、netlify-cliが起動しているが、netlify-cliのバージョンアップに伴ってAlpine環境では起動しなくなってしまっている可能性が最も高そうだ。

(そう思い至るまでに、コンテナの中に入ってnpmを手動実行したり色々しましたけれどそれは割愛)

ところで、Dockerコンテナの再ビルドとは、新しいイメージを改めて作成するプロセスのことを指す。

主な意義は以下の通り:

  • 依存関係の整合性確保

ベースイメージやパッケージのマイナーアップデートを取り込み、脆弱性修正や機能改善を確実に反映できる。(再ビルドをしないとレイヤーキャッシュと呼ばれる前回のキャッシュを前提に再度構築されるため、同じベースイメージでも最新の状態にならないことがある。)

  • キャッシュクリアによる不具合解消

レイヤーキャッシュに残った旧設定や壊れた依存をリセットし、思わぬビルドエラーや実行時障害を予防する。

  • 環境の一貫性維持

たとえば、CI/CD環境で起動時の動作差異を防ぎ、常に同じステップで構築されることを保証することができる。

このように、再ビルドを定期的に実施することで、セキュリティと安定性を両立しつつ、開発・運用の信頼性を一層高めることが可能となるわけです。

というわけで、具体的な方法、今回のローカル環境はDocker composeを利用しているため

1
2
3
4
5
docker compose down #既存の環境の停止

docker compose build --no-cache #キャッシュを利用せずに環境を再作成

docker compose up -d #バックグラウンドで再度起動

を実行しました。ついでに、いらないDocker ボリュームの削除などのために

1
docker system prune -a

もしています。(まぁ、これをしたからこそ、キャッシュが利用できなくなった、とも言います)

余談ですが、現在、自分が利用しているdocker composeversion v2.34.0-desktop.1で少しハマったのでメモ。

以前からDocker desktopを利用している場合は、docker-composeコマンドが利用できるかもしれない。自分の環境も以前はそうでした。

ただ、現在はdocker compose (ハイフンなし)が主流となっており、docker-composeDeprecatedになっています。

ハイフンの有無で、微妙なコマンドオプションの差異が存在しており、具体的にいうと

  • docker-compose up --build --no-cache (起動時に、キャッシュなしビルドをした上で起動)

このコマンドオプションは存在するのに、

  • docker compose up --build --no-cacheは存在しない。(ただし、docker compose up --buildは存在する)

したがって、キャッシュを使わずに再度ビルドする際には、

  • 明示的に、一度落とす(docker compose down)
  • ビルドする(docker compose --build --no-cache)
  • 立ち上げる(docker compoes up (-d))

というプロセスが必要。紛らわしいですね。

Deno(ディーノ)はV8 JavaScriptエンジンをベースに実装されたJavaScript/TypeScriptランタイムらしい。NodeJSの反省を生かして作られたランタイムらしい。

このDenoがAplineに未対応、ということが今回の原因の模様。

察するところ、以前はNodeベースで作成されていたけれど、どこかのタイミングでDenoベースになったのかしら?前からずっとAplineで起動していたけれど、確かにかなり久しぶりにDocker環境を消したんですよね・・・。

というわけで一番手っ取り早く、ベースイメージをAplineベースから、Ubuntuベースにすることにします。

1
2
- FROM node:20.10.0-alpine
+ FROM node:20-slim

Oh…これだけ。

あとは、半信半疑で再度Dockerイメージを作成して立ち上げ、認証をNetlifyに通してしばらくまって・・・も落ちない。

スクリプトとしては1行。調査としてはそこそこ時間をかけるという終わってみるとよくあることではありました。

(あ、Nodeのバージョンを上げるの忘れてた orz)