繁体   English   中英

Cloud Run Build 期间未定义环境变量

[英]Environment variables are undefined during Cloud Run Build

我使用 Google Cloud Run 来容器化 node.js 应用程序。 我按照本指南将环境变量添加到谷歌云运行,并希望在我的应用程序代码中使用它们。 但。 每当我运行构建(云运行构建)时,它都会显示process.env.NODE_ENV和其他环境变量是undefined的。

你能帮我找到问题的根本问题吗?

Dockerfile

FROM node:14.16.0

WORKDIR /usr/src/app

COPY package.json yarn.lock ./

# Copy local code to the container image.
COPY . ./

RUN yarn install
RUN yarn build
RUN npx knex --knexfile=./src/infrastructure/knex/knex.config.ts migrate:latest --env production

# Use the official lightweight Node.js 14 image.
# https://hub.docker.com/_/node
FROM node:14.16.0

# Create and change to the app directory.
WORKDIR /usr/src/app

# Copy application dependency manifests to the container image.
# Copying this first prevents re-running npm install on every code change.
COPY package.json yarn.lock ./

# Install production dependencies.
# If you add a package-lock.json, speed your build by switching to 'npm ci'.
# RUN npm ci --only=production
RUN yarn install --production --frozen-lockfile


COPY --from=0 /usr/src/app/dist ./dist

EXPOSE 8080

# Run the web service on container startup.
CMD [ "yarn", "prod" ]

这行代码抛出错误

RUN npx knex --knexfile=./src/infrastructure/knex/knex.config.ts migrate:latest --env production

这是knex.config.ts

import 'dotenv/config'
import { Knex } from 'knex'
import { envConfig, NodeEnvEnum } from '../../configs/env.config'

console.log('ASDASD', process.env.NODE_ENV, envConfig.environment, process.env.CLOUD_SQL_CONNECTION_NAME, envConfig.databaseCloudSqlConnection)

export const knexConfig: Record<NodeEnvEnum, Knex.Config> = {
  [NodeEnvEnum.Development]: {
    client: 'pg',
    connection: envConfig.databaseUrl,
    migrations: {
      extension: 'ts'
    }
  },
  [NodeEnvEnum.Production]: {
    client: 'pg',
    connection: {
      database: envConfig.databaseName,
      user: envConfig.databaseUser,
      password: envConfig.databasePassword,
      host: `/cloudsql/${envConfig.databaseCloudSqlConnection}`
    }
  }
}

export default knexConfig

这是env.config.ts

export enum NodeEnvEnum {
  Production = 'production',
  Development = 'development'
}

interface EnvConfig {
  serverPort: string
  environment: NodeEnvEnum

  // Database
  databaseCloudSqlConnection: string
  databaseUrl: string
  databaseUser: string
  databasePassword: string
  databaseName: string
}

export const envConfig: EnvConfig = {
  serverPort: process.env.SERVER_PORT as string,
  environment: process.env.NODE_ENV as NodeEnvEnum,

  // Database
  databaseUrl: process.env.DATABASE_URL as string,
  databaseCloudSqlConnection: process.env.CLOUD_SQL_CONNECTION_NAME as string,
  databaseName: process.env.DB_NAME as string,
  databaseUser: process.env.DB_USER as string,
  databasePassword: process.env.DB_PASSWORD as string
}

Cloud Run 日志中的错误示例

在此处输入图像描述 (日志从下到上显示)

你在这里混合上下文。

您需要注意 3 个上下文。

  1. 基于 Git 推送启动 Cloud Build 流程的观察者。
  2. Cloud Build 作业由观察者触发,并在沙盒环境中执行,这是一个构建过程。 步骤/命令在此步骤中失败,因为对于此上下文,您尚未定义 ENV 变量。 构建完成后,它将图像放置到 GCR 存储库。
  3. 然后“图像”被 Cloud Run 作为服务获取并使用,在这里您可以为服务本身、您的应用程序代码而不是您的构建过程定义 ENV 变量。

在上下文 2 中,您最终需要使用替换变量,请在此处此处阅读更多内容。

在此处输入图像描述

我遇到了同样的问题,原因是我的.env文件在部署时没有被复制到 Docker 容器中。 通过在存储库的根目录中添加.gcloudignore.dockerignore文件来修复它。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM