如何在构建和部署 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 个不同的环境:TEST
和 PROD
.
所以我需要一个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参数。
更多文档:
如何与 Docker Compose 一起使用 - https://docs.docker.com/compose/compose-file/#args
其他文档 - https://docs.docker.com/engine/reference/builder/#understand-how-arg-and-from-interact
没有 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
我有一个后端服务需要部署到 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 个不同的环境:TEST
和 PROD
.
所以我需要一个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参数。
更多文档:
如何与 Docker Compose 一起使用 - https://docs.docker.com/compose/compose-file/#args
其他文档 - https://docs.docker.com/engine/reference/builder/#understand-how-arg-and-from-interact
没有 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