Docker 映像已部署到 Google Compute Engine 不断重启

Docker image deployed to Google Compute Engine keeps restarting

我使用 Google Cloud Build 使用 Docker Compose 构建了一个图像。在我的 cloudbuild.yml 文件中,我有以下步骤:

  1. 使用 docker compose
  2. 构建 docker 图像
  3. 标记构建的镜像
  4. 创建实例模板
  5. 创建实例组

现在这就是问题所在,每次构建新实例时,从映像创建的容器都会不断重启,但从未真正启动。尽管如此,我可以构建图像并将其作为实例上的容器启动,独立于来自云构建的图像。

我设法从日志中找到了一些线索:

E1219 19:13:52 7f28dce6d700 api_server.cc:184 Metadata request unsuccessful: Server responded with 'Forbidden' (403): Transport endpoint is not connected

oauth2.cc:289 Getting auth token from metadata server docker

我还通过 运行 实例中的以下内容获得了一些线索:

docker -a -i start <container_id>

输出:Unrecognized input header: 99

cloudbuild.yml 文件看起来像(我用 ... 替换了一些变量):

#cloudbuild.yaml
steps:
  - name: 'docker/compose:1.22.0'
    args: ['-f', 'docker/docker-compose.tb.prod.yml', 'up', '-d']
  - name: 'gcr.io/cloud-builders/docker'
    args: ['tag', 'tb:latest', '...']
  - name: 'gcr.io/cloud-builders/gcloud'
    args: [
      'beta', 'compute', '--project=...', 'instance-templates', 'create-with-container',
      'tb-app-staging-${COMMIT_SHA}',
      '--machine-type=n1-standard-2', '--network=...', '--network-tier=PREMIUM', '--metadata=google-logging-enabled=true',
      '--maintenance-policy=MIGRATE', '--service-account=...',
      '--scopes=https://www.googleapis.com/auth/cloud-platform,https://www.googleapis.com/auth/devstorage.read_only,https://www.googleapis.com/auth/logging.write,https://www.googleapis.com/auth/monitoring.write,https://www.googleapis.com/auth/servicecontrol,https://www.googleapis.com/auth/service.management.readonly,https://www.googleapis.com/auth/trace.append',
      '--tags=http-server,https-server', '--image=cos-stable-69-10895-62-0', '--image-project=cos-cloud', '--boot-disk-size=20GB', '--boot-disk-type=pd-standard',
      '--container-restart-policy=always', '--labels=container-vm=cos-stable-69-10895-62-0',
      '--boot-disk-device-name=...',
      '--container-image=...',
    ]   
  - name: 'gcr.io/cloud-builders/gcloud'
    args: [
      'beta', 'compute', '--project=...', 'instance-groups',
      'managed', 'rolling-action', 'start-update',
      'tb-app-staging',
      '--version',
      'template=...',
      '--zone=europe-west1-b',
      '--max-surge=20',
      '--max-unavailable=9999'
    ]   
images: ['...']
timeout: 1200s

我发现了这个问题,我会自己回答这个问题,以防其他人遇到同样的问题。

问题是在我的 docker-compose.yml 中我将 stdin_opentty 的配置设置为 true 但我的 cloudbuild.yml 文件不接受它并且失败了默默地(烦人!)。

要解决此问题,您需要在 create-with-container 命令中使用标志 --container-stdin--container-tty

可以在 google 文档中找到更多详细信息 https://cloud.google.com/compute/docs/containers/configuring-options-to-run-containers

我有一个类似的问题,原因是在 Dockerfile 中设置了 USER。我正在使用将用户更改为 'node' ,这是官方 nodejs 图像中可用的用户。但不适用于 Google 云容器。

FROM node:current-buster-slim
USER node