本指南介绍了如何将 Buildpack 与应用源代码搭配使用来创建容器映像。例如,使用 Buildpack 将 Cloud Run 服务的源代码构建到容器映像中。
您可以通过以下两种方法使用 Buildpack 构建容器映像:
- 使用
pack
CLI 在本地构建,以便在本地测试您的应用并在部署前快速对更改进行原型设计。 - 使用 Cloud Build 远程构建。使用 Cloud Build 进行构建适合具有资源密集型构建流程的大型应用,还有助于保护您的软件供应链。
本地构建
您可以使用 pack
CLI 在本地将应用构建到容器映像中。
准备工作
- 在工作站上安装 Docker 社区版 (CE)。
pack
会将 Docker 用作 OCI 映像构建器。 - 安装 Pack CLI。
- 安装 Git 源代码控制工具以从 GitHub 获取示例应用。
在本地构建应用
您可以使用 pack build
命令并指定默认构建器 --builder=gcr.io/buildpacks/builder
,以在本地构建容器映像。
pack build --builder=gcr.io/buildpacks/builder IMAGE_NAME
将 IMAGE_NAME
替换为服务的容器映像的名称。
您还可以通过扩展构建来自定义容器映像并运行映像。
在本地构建示例应用
以下示例演示了如何在本地构建示例。
- 将示例代码库克隆到本地计算机:
git clone https://github.com/GoogleCloudPlatform/buildpack-samples.git
- 切换到包含应用示例代码的目录:
Go
cd buildpack-samples/sample-go
Java
cd buildpack-samples/sample-java-gradle
Node.js
cd buildpack-samples/sample-node
PHP
cd buildpack-samples/sample-php
Python
cd buildpack-samples/sample-python
Ruby
cd buildpack-samples/sample-ruby
.NET
cd buildpack-samples/sample-dotnet
- 使用
pack
构建示例应用映像:Go
pack build --builder=gcr.io/buildpacks/builder sample-go
Java
pack build --builder=gcr.io/buildpacks/builder sample-java-gradle
Node.js
pack build --builder=gcr.io/buildpacks/builder sample-node
PHP
pack build --builder=gcr.io/buildpacks/builder sample-php
Python
pack build --builder=gcr.io/buildpacks/builder sample-python
Ruby
pack build --builder=gcr.io/buildpacks/builder sample-ruby
.NET
pack build --builder=gcr.io/buildpacks/builder sample-dotnet
- 使用
docker
运行映像:Go
docker run -p8080:8080 sample-go
Java
docker run -it -ePORT=8080 -p8080:8080 sample-java-gradle
Node.js
docker run -it -ePORT=8080 -p8080:8080 sample-node
PHP
docker run -it --rm -p 8080:8080 sample-php
Python
docker run -it -ePORT=8080 -p8080:8080 sample-python
Ruby
docker run -it -ePORT=8080 -p8080:8080 sample-ruby
.NET
docker run -it -ePORT=8080 -p8080:8080 sample-dotnet
- 通过浏览到 localhost:8080 来访问正在运行的应用。
远程构建
使用 Cloud Build 将您的应用构建到容器映像中,并使用 Artifact Registry 作为存储和部署每个映像的容器仓库。
准备工作
- Sign in to your Google Cloud account. If you're new to Google Cloud, create an account to evaluate how our products perform in real-world scenarios. New customers also get $300 in free credits to run, test, and deploy workloads.
-
In the Google Cloud console, on the project selector page, select or create a Google Cloud project.
-
Make sure that billing is enabled for your Google Cloud project.
-
Enable the Cloud Build and Artifact Registry APIs.
- Install the Google Cloud CLI.
-
To initialize the gcloud CLI, run the following command:
gcloud init
-
In the Google Cloud console, on the project selector page, select or create a Google Cloud project.
-
Make sure that billing is enabled for your Google Cloud project.
-
Enable the Cloud Build and Artifact Registry APIs.
- Install the Google Cloud CLI.
-
To initialize the gcloud CLI, run the following command:
gcloud init
- 确保您的 Google Cloud 项目有权访问容器映像仓库。
如需配置对 Artifact Registry 中的 Docker 仓库的访问权限,请执行以下操作:
- 在 Google Cloud 项目的同一位置创建新的 Docker 仓库。
您需要进行如下替换:gcloud artifacts repositories create REPO_NAME \ --repository-format=docker \ --location=REGION --description="DESCRIPTION"
- 将
REPO_NAME
替换为您为 Docker 仓库选择的名称。 - 将
REGION
替换为 Google Cloud 项目的位置或最接近该位置的位置。 - 将
DESCRIPTION
替换为您选择的说明。
例如,如需在
us-west2
中创建具有说明“Docker 仓库”的docker
仓库,请运行以下命令:gcloud artifacts repositories create buildpacks-docker-repo --repository-format=docker \ --location=us-west2 --description="Docker repository"
- 将
- 验证您的代码库已创建:
gcloud artifacts repositories list
您应该会在列表中看到您为 Docker 仓库选择的名称。
- 在 Google Cloud 项目的同一位置创建新的 Docker 仓库。
远程构建应用
您可以使用 gcloud builds submit
命令构建容器映像并将其上传到仓库。
您可以选择在命令本身中指定容器映像或是使用配置文件。
使用命令进行构建
如需在不使用配置文件的情况下进行构建,请指定 image
标志:
gcloud builds submit --pack image=LOCATION-docker.pkg.dev/PROJECT_ID/REPO_NAME/IMAGE_NAME
您需要进行如下替换:
- 将
LOCATION
替换为容器仓库的区域名称。示例:us-west2
- 将
PROJECT_ID
替换为您的 Google Cloud 项目的 ID。 - 将
REPO_NAME
替换为 Docker 仓库的名称。 - 将
IMAGE_NAME
替换为容器映像的名称。
示例:
gcloud builds submit --pack image=us-west2-docker.pkg.dev/my-project-id/my-buildpacks-docker-repo/app-image
使用配置文件进行构建
您可以使用配置文件来定义映像仓库配置详细信息,以便仅包含构建命令。配置文件使用 YAML 文件格式,并且必须包含使用 pack
CLI 的构建步骤。
- 创建一个名为
cloudbuild.yaml
的 YAML 文件,其中包含容器映像仓库的 URI。
options: logging: CLOUD_LOGGING_ONLY pool: {} projectId: PROJECT_ID steps: - name: gcr.io/k8s-skaffold/pack entrypoint: pack args: - build - LOCATION-docker.pkg.dev/PROJECT_ID/REPO_NAME/IMAGE_NAME - --builder - gcr.io/buildpacks/builder:latest - --network - cloudbuild images: - LOCATION-docker.pkg.dev/PROJECT_ID/REPO_NAME/IMAGE_NAME
您需要进行如下替换:
- 将
LOCATION
替换为容器仓库的区域名称,例如us-west2
。 - 将
PROJECT_ID
替换为您的 Google Cloud 项目的 ID。 - 将
REPO_NAME
替换为 Docker 仓库的名称。 - 将
IMAGE_NAME
替换为容器映像的名称。
构建应用。
如果您将配置文件命名为
cloudbuild.yaml
,则可以运行以下命令:gcloud builds submit .
示例:远程构建示例应用
以下示例演示了如何远程构建示例,然后验证容器映像是否已推送到 Artifact Registry 中的仓库。
- 将示例代码库克隆到本地计算机:
git clone https://github.com/GoogleCloudPlatform/buildpack-samples.git
- 切换到包含应用示例代码的目录:
Go
cd buildpack-samples/sample-go
Java
cd buildpack-samples/sample-java-gradle
Node.js
cd buildpack-samples/sample-node
PHP
cd buildpack-samples/sample-php
Python
cd buildpack-samples/sample-python
Ruby
cd buildpack-samples/sample-ruby
.NET
cd buildpack-samples/sample-dotnet
- 使用
gcloud
将应用源代码提交到 Cloud Build:Go
gcloud builds submit --pack image=LOCATION-docker.pkg.dev/PROJECT_ID/REPO_NAME/sample-go
Java
gcloud builds submit --pack image=LOCATION-docker.pkg.dev/PROJECT_ID/REPO_NAME/sample-java-gradle
Node.js
gcloud builds submit --pack image=LOCATION-docker.pkg.dev/PROJECT_ID/REPO_NAME/sample-node
PHP
gcloud builds submit --pack image=LOCATION-docker.pkg.dev/PROJECT_ID/REPO_NAME/sample-php
Python
gcloud builds submit --pack image=LOCATION-docker.pkg.dev/PROJECT_ID/REPO_NAME/sample-python
Ruby
gcloud builds submit --pack image=LOCATION-docker.pkg.dev/PROJECT_ID/REPO_NAME/sample-ruby
.NET
gcloud builds submit --pack image=LOCATION-docker.pkg.dev/PROJECT_ID/REPO_NAME/sample-dotnet
-
验证示例应用已成功发布到
REPO_NAME
:gcloud artifacts docker images list LOCATION-docker.pkg.dev/PROJECT_ID/REPO_NAME
您需要进行如下替换:
- 将
LOCATION
替换为容器仓库的区域名称。示例:us-west2
- 将
PROJECT_ID
替换为您的 Google Cloud 项目的 ID。 - 将
REPO_NAME
替换为 Docker 仓库的名称。
- 将
后续步骤
- 将映像部署到 Cloud Run。
- 设置环境变量。
- 配置构建映像。
- 使用缓存映像加速构建。