docker - 部署到 Google Compute Engine 的 Docker 映像不断重启
问题描述
我使用 Docker Compose 通过 Google Cloud Build 构建了一个映像。在我的cloudbuild.yml
文件中,我有以下步骤:
- 使用 docker compose 构建 docker 镜像
- 标记构建的图像
- 创建实例模板
- 创建实例组
现在,每次构建新实例时都会出现问题,从映像创建的容器不断重新启动并且从未真正启动。尽管如此,我可以构建图像并将其作为实例上的容器启动,独立于来自云构建的图像。
我设法从日志中找到了一些线索:
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_open
,我将其tty
设置为 true,但我的cloudbuild.yml
文件不接受它并且默默地失败(烦人!)。
要解决此问题,您需要使用标志--container-stdin
和命令--container-tty
。create-with-container
更多细节可以在谷歌文档https://cloud.google.com/compute/docs/containers/configuring-options-to-run-containers中找到
推荐阅读
- android - Xamarin.Forms Live Player - 由于 API 版本不支持的设备
- typescript - 打字稿类型的 redux-persist MigrationManifest?
- jquery - 如何在 html 模板中使用 contextPath
- webpack - 非相对导入 - Ionic - Webpack - Sourcemaps 在 Chrome 中的一个文件上偏离了几行
- android - 我无法将活动的数据(字符串)发送到活动中包含的片段
- arrays - 将字符串与字符串数组进行比较并计算 Swift 中的匹配项
- ios - iOS Autolayout:可以将约束优先级设置为 999 以使警告静音吗?
- java - grpc 异步双向服务器(Java/Python)
- python - np.where() 导致 RSI 提前结束
- html - 除非导航栏已经堆叠,否则粘性导航栏中的内部链接不会链接到正确的位置