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?

はじめてのアドベントカレンダーAdvent Calendar 2024

Day 4

K8s/DockerでNextJSを動かしたら環境変数でハマった話

Last updated at Posted at 2024-12-03

みなさんこんにちは!
デジタル創作サークルUniProjectのあかつきゆいとです。

今回はNextJSで作られたぼくのサイトをArgoCD経由でK8sで動かしたら環境変数でつまづいた話を書いていこうと思います。

ちなみに、今回はK8sで動かしていますが、普通のDockerでも同じことが起こると思うので、Dockerで困っている人も見てくれればなと思います。

何にハマったか

ぼくのサイトはSpotifyAPIが使われています。

そして、GitHubActions側でDocker Build & Pushを行なっています。
ですが、いつものようにビルドしていたところ、**環境変数が、NULL!!**となったので、トラブルシューティングの一部始終をつらつらと書きたいと思います。

DockerImageをつくる

K8sで動作させるにはDockerImageが必要ですね。
なので、DockerImageをまず作ります。

FROM node:20-alpine

WORKDIR /nextjs

COPY . .

RUN rm -rf node_modules
RUN rm -rf .next
RUN npm install
RUN npm run build

CMD ["npm", "start"]

DockerImage側でNextJSのビルドを行っています。

ArgoCD

K8sのマニフェストファイル側も設定していきます。

apiVersion: apps/v1
kind: Deployment
metadata:
  name: yuito-work
  labels:
    app: yuito-work
spec:
  replicas: 2
  selector:
    matchLabels:
      app: yuito-work
  template:
    metadata:
      labels:
        app: yuito-work
    spec:
      containers:
        - name: yuito-work
          image: registry.uniproject-tech.net/yuito-it/yuito-work:3.1.4
          envFrom:
            - secretRef:
                name: spotify
                optional: true
          volumeMounts:
            - name: spotify
              mountPath: /app/tmp
          ports:
            - containerPort: 3000
      imagePullSecrets:
        - name: harbor-registry-secret
      volumes:
        - name: spotify
          persistentVolumeClaim:
            claimName: spotify

ここで、envFromで指定されているのはSpotifyの認証情報が入ったシークレットです。
なので、これでSpotifyAPIにアクセスできるはずでした。

いざ、デプロイ!!

いざデプロイしてサイトにアクセス...
Spotifyが表示されない!!

なぜだ...とログを見に行くと、認証できていない模様...
何かがおかしい...
ローカルでは動くのに...

まず、Podに入って、環境変数を確認しました。

echo $SPOTIFY_CLIENT_ID
echo $SPOTIFY_CLIENT_SECRET
echo $SPOTIFY_REDIRECT_URI

全てnull...
どういうことだ...

NextJSの落とし穴

実はNext.jsでは、Buildの時点で環境変数がセットされているらしいいです。
私はGitHubActionsでBuildしていたので、GitHubActionsに環境変数をセットしなければならなかったのですね...

しかし、そんなことはしたくない。
というか、この理論だと、DockerImageをPullした人は環境変数が丸見えなのです。

ということで、ゴリ押しました。

どうしたか

CMDでbuildもするようにしました。

# Use the official Node.js 14 image as the base image
FROM node:20-alpine

# Set the working directory inside the container
WORKDIR /app

# Copy package.json and package-lock.json to the working directory
COPY package*.json ./

# Install project dependencies
RUN npm install

# Copy the rest of the project files to the working directory
COPY . .

# Expose the port that the Next.js app will run on
EXPOSE 3000

# Start the Next.js app
CMD ["sh","init.sh"]
init.sh
npm run build
npm run start

これで、正常に動作しました。
難しいですね。

Buildしたときにenvがセットされるのは、結構よく使うことかと思うので、覚えておきたいですね。

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?