はじめに
Next.js v14 App routerへの移行をしてECSにデプロイした時に、タイトルのエラーが発生しました。
ローカルでDockerビルドして起動した場合は発生しなかったが、ECS上では発生して解決に時間がかかったのでまとめます
問題
エラー内容
⨯ Failed to start server
Error: getaddrinfo ENOTFOUND xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx-xxxxxxxxx
at GetAddrInfoReqWrap.onlookup [as oncomplete] (node:dns:107:26) {
errno: -3008,
code: 'ENOTFOUND',
syscall: 'getaddrinfo',
hostname: 'xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx-xxxxxxxxx'
}
Dockerファイル
# https://blog.tericcabrel.com/create-docker-image-nextjs-application/
# https://pnpm.io/cli/fetch
FROM node:20.10-alpine AS deps
RUN apk add --no-cache libc6-compat
WORKDIR /app
RUN npm install -g pnpm@8
COPY pnpm-lock.yaml ./
ADD . ./
RUN pnpm install --frozen-lockfile
FROM node:20.10-alpine AS builder
RUN npm install -g pnpm@8
WORKDIR /app
COPY --from=deps /app/node_modules ./node_modules
COPY . .
RUN pnpm build
FROM node:20.10-alpine AS runner
WORKDIR /app
ENV NODE_ENV production
RUN apk add curl \
&& addgroup --system --gid 1001 hogegroup \
&& adduser --system --uid 1001 hogeuser
COPY --from=builder /app/public ./public
COPY --from=builder /app/package.json ./package.json
# Automatically leverage output traces to reduce image size
# https://nextjs.org/docs/advanced-features/output-file-tracing
COPY --from=builder --chown=hogeuser:hogegroup /app/.next/standalone ./
COPY --from=builder --chown=hogeuser:hogegroup /app/.next/static ./.next/static
USER hogeuser
EXPOSE 3000
ENV PORT 3000
CMD ["node", "server.js"]
使用ツールバージョン
- node: 20.10
- pnpm: 8.12.1
- Next.js: 14.0.4
- React: 18.2.0
解決方法
Node.jsのENOTFOUND例外は、DNSエラーのためにドメインへの接続を確立できないときに発生します。一般的には、ホスト値が正しくないか、localhostを127.0.0.1に不適切にマッピングしているか、ドメイン名にタイプミスがある場合に発生します。
今回はhostnameにECSのタスクIDが入ってしまうバグのようです。
以下のように修正したところ起動するようになりました。
# server.js is created by next build from the standalone output
# https://nextjs.org/docs/pages/api-reference/next-config-js/output
- CMD ["node", "server.js"]
+ CMD HOSTNAME="0.0.0.0" node server.js
おわりに
まだ、Next.js App Routerちらほらバグがありそうで辛さありますね。