如何在构建和部署 Docker 图像到云端 运行 时设置不同的 ENV 变量?

How to set different ENV variable when building and deploying Docker Image to Cloud Run?

我有一个后端服务需要部署到 Google Cloud Run

Google's tutorial on Cloud Run,我们得到:

首先您需要构建您的图像并将其发送到 Cloud Build

gcloud builds submit --tag gcr.io/PROJECT-ID/helloworld

然后你才将它部署到云端运行:

gcloud run deploy --image gcr.io/PROJECT-ID/helloworld --platform managed

我得到上面的序列。但我会将此服务部署到 2 个不同的环境:TESTPROD.

所以我需要一个SERVER_ENV变量,在我的生产环境中应该是"PROD",当然在我的测试环境中应该是"TEST"。这样我的服务器(来自容器的 运行 的快速服务器)知道要连接到哪个数据库。

但问题是我只有一个 Dockerfile:

FROM node:12-slim

ENV SERVER_ENV=PROD

WORKDIR /

COPY ./package.json ./package.json
COPY ./distApp ./distApp
COPY ./distService ./distService
COPY ./public ./public

RUN npm install

ENTRYPOINT npm start

那么如何在遵循上述构建和部署顺序的同时设置不同的 ENV 变量? gcloud builds submit 评论中是否有一个选项让我可以覆盖某些内容?或者使用不同的 Dockerfile?有人有其他想法吗?

一个想法:

也许使用 Cloud Build configuration file?

cloudbuild.yaml

我认为使用 Docker 文件中的 ARG 指令可以实现您想要实现的目标。

我会设置为test,然后根据您现在正在构建的环境使用arg参数。

更多文档:

没有 cloudbuild.yaml 文件就无法实现此目的。命令 gcloud builds submit --tag ... 不接受额外的 docker 参数。

这里是一个配置示例

FROM node:12-slim

ARG SERVER_CONF=PROD
ENV SERVER_ENV=$SERVER_CONF

WORKDIR /

COPY ./package.json ./package.json
COPY ./distApp ./distApp
COPY ./distService ./distService
COPY ./public ./public

RUN npm install

ENTRYPOINT npm start

我创建了一个构建参数 SERVER_CONF。您的 ENV 将在构建时采用此值。默认值为 PROD

现在你的 cloudbuild.yaml 文件

step:
  - name: 'gcr.io/cloud-builders/docker'
    args: ['build', '--tag=gcr.io/PROJECT-ID/helloworld', '--build-arg="SERVER_CONF=$_SERVER_CONF"', '.']
  - name: 'gcr.io/cloud-builders/docker'
    args: ['push', 'gcr.io/PROJECT-ID/helloworld']
substitutions:
  _SERVER_CONFPROD: PROD

使用替换变量来改变环境。并不是说在这里你也可以设置一个默认值,它会覆盖你的 Dockerfile 值。小心点!

如果需要,您也可以将标签设置为替换变量

最后,如何调用你的Cloud Build

# With default server conf (no substitution variables, the the file default)
gcloud builds submit

# With defined server conf
gcloud builds submit --substitutions=_SERVER_CONF=TEST