首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >使用Kubernetes向我的NextJS应用程序注入变量

使用Kubernetes向我的NextJS应用程序注入变量
EN

Stack Overflow用户
提问于 2021-12-10 21:24:13
回答 1查看 582关注 0票数 1

在使用Kubernet部署代码时,我试图生成一些env变量。我想要做的是生成一个ConfigMap来获取我的变量,但是它不起作用。我正在使用蓝色管道来完成我的构建和发布步骤。

Dockerfile:

代码语言:javascript
运行
复制
FROM node:14-alpine

WORKDIR /usr/src/app

COPY package.json .

COPY . .

RUN npm cache clean --force
RUN npm install
RUN npm run build

EXPOSE 80

CMD ["npm", "start"]

我的天蓝色-管道.:

代码语言:javascript
运行
复制
stages:
#Build Dev
- stage: BuildDev
  displayName: Build and Push Dev
  jobs:
  - job: Development
    displayName: Build and Push Dev
    timeoutInMinutes: 0
    pool:
      vmImage: ubuntu-18.04
    steps:
    - checkout: self
    - task: Docker@1
      displayName: Build Image
      inputs:
        azureSubscriptionEndpoint: my-subscription
        azureContainerRegistry: my-container-registry
        command: build
        imageName: tenant/front/dev:$(Build.BuildId)
        includeLatestTag: true
        buildContext: '**'
    - task: Docker@1
      displayName: Push Image
      inputs:
        azureSubscriptionEndpoint: my-subscription
        azureContainerRegistry: my-container-registry
        command: push
        imageName: tenant/front/dev:$(Build.BuildId)
        buildContext: '**'


#Deploy Dev
- stage: DeployDev
  displayName: Deploy Dev
  jobs:
    - deployment: Deploy
      displayName: Deploy Dev
      timeoutInMinutes: 0
      pool:
        vmImage: ubuntu-18.04
      environment: Development-Front
      strategy:
        runOnce:
          deploy:
            steps:
            - task: Kubernetes@1
              displayName: 'kubectl apply'
              inputs:
                kubernetesServiceEndpoint: 'AKS (standard subscription)'
                command: apply
                useConfigurationFile: true
                configurationType: inline
                inline: |
                  apiVersion: apps/v1beta1
                  kind: Deployment
                  metadata:
                      name: $(appNameDev)
                      labels:
                          app: $(appNameDev)
                  spec:
                      replicas: 1
                      selector:
                          matchLabels:
                              app: $(appNameDev)
                      template:
                          metadata:
                              labels:
                                  app: $(appNameDev)
                          spec:
                              containers:
                                  - name: $(appNameDev)
                                    image: tenant/front/dev:$(Build.BuildId)
                                    imagePullPolicy:
                                    env:
                                      - name: NEXT_PUBLIC_APP_API
                                        value: development
                                    ports:
                                      - name: http
                                        containerPort: 80
                                        protocol: TCP
                                    volumeMounts:
                                      - name: environment-variables
                                        mountPath: /usr/src/app/.env
                                        readOnly: true
                              volumes:
                                - name: environment-variables
                                  configMap:
                                    name: environment-variables
                                    items:
                                    - key: .env
                                      path: .env
              ---
              apiVersion: v1
              kind: Service
              metadata:
                  name: $(appNameDev)
                  labels:
                      app: $(appNameDev)
              spec:
                  type: LoadBalancer
                  ports:
                      - port: 80
                        targetPort: 80
                        protocol: TCP
                        name: http
                  selector:
                      app: $(appNameDev)
              ---
              apiVersion: v1
              kind: ConfigMap
              metadata:
                name: environment-variables
              data:
                .env: |
                  NEXT_PUBLIC_APP_API=development
                  API=http://another.endpoint.com/serverSide

当我试图访问这个NEXT_PUBLIC_APP_API变量时,我收到的是未定义的。在我的next.config.js中,我将变量导出为publicRuntimeConfig。

EN

回答 1

Stack Overflow用户

发布于 2022-11-30 21:56:19

如果使用GitHub操作,第一件事是在图像生成过程中添加一个步骤,以包含动态变量。

代码语言:javascript
运行
复制
  - name: Create variables
    id: vars
    run: |
      branch=${GITHUB_REF##*/}
      echo "API_URL=API_${branch^^}" >> $GITHUB_ENV
      echo "APP_ENV=APP_${branch^^}" >> $GITHUB_ENV
      echo "BASE_URL=BASE_${branch^^}" >> $GITHUB_ENV
      sed -i "s/GIT_VERSION/${{ github.sha }}/g" k8s/${branch}/api-deployment.yaml

第二步是构建带有额外参数的docker映像,如果您使用的是另一个CI,只需将变量直接添加到build中,如下所示:

代码语言:javascript
运行
复制
--build-arg PROD_ENV=NEXT_PUBLIC_API_URL=${{ secrets[env.API_URL] }}\nNEXT_PUBLIC_BASE_URL=${{ secrets[env.BASE_URL]}}\nNEXT_PUBLIC_APP_ENV=${{ secrets[env.APP_ENV] }}

请注意\n可以跳过行和停靠点,以便能够理解您正在向构建过程发送多个变量。

最后一件事是在Dockerfile中添加额外的args

代码语言:javascript
运行
复制
# Install dependencies only when needed
FROM node:16.13.0-alpine AS deps
# Check https://github.com/nodejs/docker-node/tree/b4117f9333da4138b03a546ec926ef50a31506c3#nodealpine to understand why libc6-compat might be needed.
RUN apk add --no-cache libc6-compat
WORKDIR /app
COPY package.json yarn.lock ./
RUN yarn install

# Rebuild the source code only when needed
FROM node:16.13.0-alpine AS builder
ARG PROD_ENV=""
WORKDIR /app
COPY . .
COPY --from=deps /app/node_modules ./node_modules
RUN printf "$PROD_ENV" >> .env.production
RUN yarn build

# Production image, copy all the files and run next
FROM node:16.13.0-alpine AS runner
WORKDIR /app

ENV NODE_ENV production

# You only need to copy next.config.js if you are NOT using the default configuration
COPY --from=builder /app/next.config.js ./
COPY --from=builder /app/.env* ./
COPY --from=builder /app/next-i18next.config.js ./
COPY --from=builder /app/public ./public
COPY --from=builder /app/.next ./.next
COPY --from=builder /app/node_modules ./node_modules
COPY --from=builder /app/package.json ./package.json

RUN addgroup -g 1001 -S nodejs
RUN adduser -S nextjs -u 1001
RUN chown -R nextjs:nodejs /app/.next
USER nextjs

# Next.js collects completely anonymous telemetry data about general usage.
# Learn more here: https://nextjs.org/telemetry
# Uncomment the following line in case you want to disable telemetry.
RUN npx next telemetry disable

CMD ["yarn", "start"]

我作为额外的args发送PROD_ENV,然后动态构建一个带有所需值的.env.production文件。

如果它对你有帮助的话,请标记为答案。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/70310530

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档