Cloud 运行 构建期间未定义环境变量

Environment variables are undefined during Cloud Run Build

我使用 Google 云 运行 容器化 node.js 应用程序。我按照 this guide 向 google 云 运行 添加了环境变量,并希望在我的应用程序代码中使用它们。但。每当我 运行 构建(云 运行 构建)时,它都会显示 process.env.NODE_ENV 和其他环境变量是 undefined.

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

Docker 文件

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
}

来自云端的错误示例 运行 日志

(日志从下到上显示)

你在这里混淆了上下文。

您需要了解 3 个上下文。

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

在上下文 2 中,您需要最终使用替代变量阅读更多内容 here and here