簡體   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