【发布时间】:2021-10-28 09:46:52
【问题描述】:
我有一个 NextJS “^11.1.2” 应用程序,它在 Dockerfile 中构建并通过 CI/CD 部署到生产环境。 但我的 process.env 变量没有呈现
我的客户端代码中有这个,应该在运行时呈现:
const PublicApiUrl = process.env.NEXT_PUBLIC_API_URL;
在我的 (Gitlab) CI/CD 管道中,我通过 AUTO_DEVOPS_BUILD_IMAGE_EXTRA_ARGS 添加了一些 --build-args,以及 ENV 和 ARG:
AUTO_DEVOPS_BUILD_IMAGE_EXTRA_ARGS --build-arg=NEXT_PUBLIC_API_URL=https://my.api.com --build-arg=NEXT_PUBLIC_API_URL=https://my.api.com --build-arg=NEXT_PUBLIC_BUILDER_KEY=XXXXXX
NEXT_PUBLIC_API_URL=https://my.api.com
API_URL=https://my.api.com
Dockerfile
ARG API_URL
ENV API_URL=$API_URL
ARG NEXT_PUBLIC_API_URL
ENV NEXT_PUBLIC_API_URL=$NEXT_PUBLIC_API_URL
ARG NEXT_PUBLIC_BUILDER_KEY
ENV NEXT_PUBLIC_BUILDER_KEY=$NEXT_PUBLIC_BUILDER_KEY
RUN npm run build # which resolves in "build": "next build"
下面的这个值肯定是捡到的(我做了一个RUN env,可以看到变量在那里)。
这是我在 Kubernetes 的 configMap,它将 .env.local 文件挂载到容器中:
apiVersion: v1
kind: ConfigMap
metadata:
name: frontend-env-local
annotations:
"helm.sh/resource-policy": keep
data:
.env: |-
NEXT_PUBLIC_API_URL=https://my.api.url
API_URL=https://my.api.url
这是我的部署,它将configMap 作为.env.local 安装到容器中:
apiVersion: apps/v1
kind: Deployment
metadata:
name: frontend
labels:
app: frontend
spec:
replicas: 1
selector:
matchLabels:
app: frontend
template:
metadata:
labels:
app: frontend
spec:
volumes:
- configMap:
defaultMode: 420
items:
- key: .env
path: .env.local
name: frontend-env-local
name: frontend-env-local
imagePullSecrets:
- name: gitlab-credentials
containers:
- name: frontend
image: "registry.gitlab.com/myapp:latest"
imagePullPolicy: Always
ports:
- name: http
containerPort: 5000
protocol: TCP
volumeMounts:
- mountPath: /app/.env.local
name: frontend-env-local
readOnly: true
subPath: .env.local
当我在本地构建 next build 时,它可以工作并且我的变量被渲染。
但是当我推送、构建和部署它并运行应用程序时,它是一个空字符串:
const PublicApiUrl = "";
为什么 NextJS 无法识别变量?
我登录到生产(Kubernetes pod)终端并运行env。变量也存在。
任何想法为什么会发生这种情况?
【问题讨论】:
-
你在用什么主机之类的?
-
@illiachill Kubernetes
标签: kubernetes next.js dockerfile gitlab-ci