Alpine×Netlify CLIでのEdge Functions障害とDocker再ビルド
2年ぶりくらいにNetlifyのDockerコンテナを再ビルドしたら動作しなくなっていた件について
Hugoのバージョンアップ、GolangのバージョンアップをしているついでにNodeのバージョンアップをしようとコンテナのベースイメージを最新版にしたら起動しなくなってしまった。
正確には、Netlify-cliのコマンドは立ち上がるが、認証を通した後しばらくすると
|
|
といったエラーが出てしまうようになった。
Nodeのバージョンをあげたことが問題かと思い、ベースイメージを元に戻して(キャッシュを消して)再ビルドしたところ、今度はこっちも立ち上がらない。
一見、netlify-cliが起動しているが、netlify-cliのバージョンアップに伴ってAlpine環境では起動しなくなってしまっている可能性が最も高そうだ。
(そう思い至るまでに、コンテナの中に入ってnpmを手動実行したり色々しましたけれどそれは割愛)
Dockerコンテナの再ビルドとは
ところで、Dockerコンテナの再ビルドとは、新しいイメージを改めて作成するプロセスのことを指す。
主な意義は以下の通り:
- 依存関係の整合性確保
ベースイメージやパッケージのマイナーアップデートを取り込み、脆弱性修正や機能改善を確実に反映できる。(再ビルドをしないとレイヤーキャッシュと呼ばれる前回のキャッシュを前提に再度構築されるため、同じベースイメージでも最新の状態にならないことがある。)
- キャッシュクリアによる不具合解消
レイヤーキャッシュに残った旧設定や壊れた依存をリセットし、思わぬビルドエラーや実行時障害を予防する。
- 環境の一貫性維持
たとえば、CI/CD環境で起動時の動作差異を防ぎ、常に同じステップで構築されることを保証することができる。
このように、再ビルドを定期的に実施することで、セキュリティと安定性を両立しつつ、開発・運用の信頼性を一層高めることが可能となるわけです。
というわけで、具体的な方法、今回のローカル環境はDocker composeを利用しているため
|
|
を実行しました。ついでに、いらないDocker ボリュームの削除などのために
|
|
もしています。(まぁ、これをしたからこそ、キャッシュが利用できなくなった、とも言います)
docker composeコマンドの罠
余談ですが、現在、自分が利用しているdocker compose
はversion v2.34.0-desktop.1
で少しハマったのでメモ。
以前からDocker desktopを利用している場合は、docker-compose
コマンドが利用できるかもしれない。自分の環境も以前はそうでした。
ただ、現在はdocker compose (ハイフンなし)
が主流となっており、docker-compose
はDeprecatedになっています。
ハイフンの有無で、微妙なコマンドオプションの差異が存在しており、具体的にいうと
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)
)
というプロセスが必要。紛らわしいですね。
原因はNetlify-cliが利用しているDenoがAlpineに未対応のため
Deno(ディーノ)はV8 JavaScriptエンジンをベースに実装されたJavaScript/TypeScriptランタイムらしい。NodeJSの反省を生かして作られたランタイムらしい。
このDenoがAplineに未対応、ということが今回の原因の模様。
察するところ、以前はNodeベースで作成されていたけれど、どこかのタイミングでDenoベースになったのかしら?前からずっとAplineで起動していたけれど、確かにかなり久しぶりにDocker環境を消したんですよね・・・。
というわけで一番手っ取り早く、ベースイメージをAplineベースから、Ubuntuベースにすることにします。
|
|
Oh…これだけ。
あとは、半信半疑で再度Dockerイメージを作成して立ち上げ、認証をNetlifyに通してしばらくまって・・・も落ちない。
スクリプトとしては1行。調査としてはそこそこ時間をかけるという終わってみるとよくあることではありました。
(あ、Nodeのバージョンを上げるの忘れてた orz)