为什么像“cloudnativelabs/whats-my-ip”这样的镜像不能在 Cloud Run 上运行?

问题描述 投票:0回答:1

我尝试在 GCP(Cloud Run)上运行

cloudnativelabs/whats-my-ip
,但失败了:

/home/server:第 1 行:语法错误:意外的“(”
容器称为 exit(2)。

该图像包含一个 Go 程序,但这看起来像是尝试将其作为脚本运行。因为运行二进制文件时没有语法。

这里发生了什么事?为什么会失败?它真的认为入口点是一个脚本吗?一个 shell 脚本?为什么?

我问了一个类似的问题,但它显然太大了。所以我决定从第一部分开始。我打算最终删除原来的问题。

这是

exec format error
的重复吗?不,至少信息是不同的。据我所知,Docker Hub 和 Cloud Run 上的架构是匹配的。

重现步骤:

resource "google_cloud_run_v2_service" "cloud-run-test" {
    name = "cloud-run-test"
    location = "europe-central2"
    template {
        containers {
            image = "cloudnativelabs/whats-my-ip"
        }
    }
}
$ terraform init
$ terraform apply
$ gcloud logging read 'logName:projects/PROJECT_ID/logs/run.googleapis.com%2F' --format 'text(logName, textPayload, timestamp)' --project PROJECT_ID
---
log_name:     projects/PROJECT_ID/logs/run.googleapis.com%2Fvarlog%2Fsystem
text_payload: Container called exit(2).
timestamp:    2023-12-09T03:40:23.628609204Z
---
log_name:     projects/PROJECT_ID/logs/run.googleapis.com%2Fstderr
text_payload: /home/server: line 1: syntax error: unexpected "("
timestamp:    2023-12-09T03:40:22.632415Z

我将图像实验移至这个要点

docker google-cloud-platform google-cloud-run dockerhub
1个回答
0
投票

这并不完全是原因(取决于您的定义),但这已经是我希望得到的最接近的原因。 John Hanley 引用了docs

容器映像中的可执行文件必须针对 Linux 64 位进行编译。 Cloud Run 特别支持 Linux x86_64 ABI 格式。

$ docker container create cloudnativelabs/whats-my-ip
$ docker cp 97bd786fbc2dd1df6925121ae8c0febebaf1a6f8785c10a7a7237e5799791289:/home/server /tmp/server
$ docker rm 97bd786fbc2dd1df6925121ae8c0febebaf1a6f8785c10a7a7237e5799791289

$ file /tmp/server
/tmp/server: ELF 32-bit LSB executable, Intel 80386, version 1 (SYSV), statically linked, Go BuildID=edc3254ee8543cb3d51767295b041bc44368d286, with debug_info, not stripped

原因显然是因为

/home/server
是32位二进制。

© www.soinside.com 2019 - 2024. All rights reserved.