语境
我正在尝试在 GitHub 操作中构建 CD 管道,该操作创建 docker 映像,将其推送到 Google Cloud Registry (GCR),然后使用最新映像重新启动 VM 实例。
问题
VM Instance 不知何故没有运行最新的 docker 映像,即使 VM Instance 页面本身显示了正确的映像标记,并且我看到 VM Instance 正在重新启动。
我怀疑这是因为当我 SSH 进入 VM 实例并运行时,docker logs <container-id>
我看到日志表明正在使用 Docker 构建参数的旧值 - 特别是DATABASE_URL
. (我还确认,在请求端点后,适当的日志会显示在这里,所以看起来我正在查看正确的日志)
当我拉下同一个图像并在本地运行它时,它DATABASE_URL
是正确的。
当我通过 SSH 连接到 VM 实例并运行时docker images
,我没有看到列出的较新映像。我一定是弄坏了一些东西,因为它之前工作过,但我在这里找不到问题。
问题
为什么 VM 实例没有收到新的 docker 镜像?(运行时docker images
,我没有看到新的 docker 镜像被列出)。
更新
通过以下方式检查 VM 实例的日志后:
sudo journalctl -u konlet-startup
我看到以下错误:
Error: Failed to start container: Error response from daemon: {"message":"pull access denied for gcr.io/..., repository does not exist or may require 'docker login': denied: Permission denied for \"...\" from request \"...". "}
这就解释了为什么我不再收到新的 docker 图像。
代码片段
name: Continuous Delivery
on:
push:
branches: [master]
env:
PROJECT_ID: ${{ secrets.GCE_PROJECT }}
GCE_INSTANCE: ${{ secrets.GCE_INSTANCE }}
GCE_INSTANCE_ZONE: ${{ secrets.GCE_INSTANCE_ZONE }}
jobs:
build:
name: Update GCP VM instance
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v2
# Setup gcloud CLI
- uses: GoogleCloudPlatform/github-actions/setup-gcloud@master
with:
version: "290.0.1"
service_account_key: ${{ secrets.GCE_SA_KEY }}
project_id: ${{ secrets.GCE_PROJECT }}
# Configure Docker to use the gcloud command-line tool as a credential
# helper for authentication
- run: |-
gcloud --quiet auth configure-docker
# Build the Docker image
- name: Build
run: |-
docker build --no-cache --build-arg DATABASE_URL=${{ secrets.DATABASE_URL }} --tag "gcr.io/$PROJECT_ID/platform:$GITHUB_SHA" .
# Push the Docker image to Google Container Registry
- name: Publish
run: |-
docker push "gcr.io/$PROJECT_ID/platform:$GITHUB_SHA"
- name: Deploy
run: |-
gcloud compute instances update-container "$GCE_INSTANCE" \
--zone "$GCE_INSTANCE_ZONE" \
--container-image "gcr.io/$PROJECT_ID/platform:$GITHUB_SHA"
为了确保这secrets.DATABASE_URL
实际上是正确的,我启动了一个服务器并在 Dockerfile 中发送了一个请求:
RUN curl "http://my-url.ngrok.io/${DATABASE_URL}"
我可以确认它确实是正确的。