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

Rom*_*kyi 6 node.js docker google-cloud-run

我使用 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 Code Online (Sandbox Code Playgroud)

这行代码会抛出错误

RUN npx knex --knexfile=./src/infrastructure/knex/knex.config.ts migrate:latest --env production
Run Code Online (Sandbox Code Playgroud)

这是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
Run Code Online (Sandbox Code Playgroud)

这是env.config.ts

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 Code Online (Sandbox Code Playgroud)

Cloud Run 日志中的错误示例

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

Pen*_*m10 3

你在这里混合了上下文。

您需要注意 3 种情况。

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

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

在此输入图像描述