在云 运行 上部署基于 bash 的服务器:如何修复 502 Bad gateway 错误?

Deploying a bash-based server on Cloud Run: how to fix 502 Bad gateway error?

我正在尝试在云 运行 上部署 bash 服务器,以便轻松触发带有参数的 gcloud 命令,这些参数将随 POST 请求一起传递给服务。 我的灵感主要来自here.

目前 bash 服务器看起来像这样:

#!/usr/bin/env bash

PORT=${PORT-8080}
echo "Listening on port $PORT..."


while true
do
    rm -f out
    mkfifo out
    trap "rm -f out" EXIT
    echo "Waiting.."
    cat out | nc -Nv -l 0.0.0.0 "${PORT}" > >( # parse the netcat output, to build the         answer redirected to the pipe "out".

    # A POST request is expected, so the request is read until the '}' ending the json payload.
    # while 
    read -d } PAYLOAD;
    # do

        # The contents of the payload are extracted by stripping the headers of the request
        # Then every entry of the json is exported :
        # export KEY=VALUE
        for s in $(echo $PAYLOAD} | \
                sed '/./{H;$!d} ; x ; s/^[^{]*//g' | \
                sed '/./{H;$!d} ; x ; s/[^}]*$//g' | \
                jq -r "to_entries|map(\"\(.key)=\(.value|tostring)\")|.[]" ); 
        do     
            export $s; 
            echo $s;
        done
    
        echo "Running the gcloud command..."
        # gsutil mb -l $LOCATION gs://$BUCKET_NAME             
        printf "%s\n%s\n%s\n" "HTTP/1.1 202 Accepted" "Content-length: 0" "Connection: Keep-    alive"  > out
    
    # done

    )
    continue
done 

用于部署的 Dockerfile 如下所示:

FROM google/cloud-sdk:alpine

RUN apk add --upgrade jq netcat-openbsd coreutils \
    && apk add --no-cache --upgrade bash

COPY main.sh .

ENTRYPOINT ["./main.sh"]

(Cloud SDK image with netcat-openbsd -server-, jq -JSON processing part-, and bash additional)

通过这个非常简单的设置,我可以部署该服务并监听传入的请求。 当接收到 POST 请求时,负载看起来像

{"LOCATION": "MY_VALID_LOCATION", "BUCKET_NAME": "MY_VALID_BUCKET_NAME"}

(此处已注释掉)云 SDK 命令 运行 正确并在指定区域中创建具有指定名称的存储桶,与 Cloud 运行 服务位于同一项目中。

但是,我在过程结束时收到 502 错误。 (我期待 202 Accepted 响应)。

服务器似乎在本地正常工作。然而,Cloud 运行 似乎无法接收到 HTTP 响应。

如何确保 HTTP 响应正确传回?

感谢@guillaumeblaquiere 的建议,我设法获得了我最终尝试做的事情的解决方案:运行 bash Cloud 运行.

上的脚本

两个要点是能够:1) 能够访问传入 HTTP 请求的有效负载,2) 能够访问 google 云 SDK。

要做到这一点,诀窍是构建一个 Docker 图像,不仅基于 Google SDK 基础图像,还基于处理服务器方面的 shell2http 图像。

Docker文件因此看起来像这样:

FROM google/cloud-sdk:alpine

RUN apk add --upgrade jq
COPY --from=msoap/shell2http /app/shell2http /shell2http
COPY main.sh . 

ENTRYPOINT ["/shell2http","-cgi"]
CMD ["/","/main.sh"]

感谢后一张图片,HTTP 处理由 Go 服务器处理,传入的 HTTP 通过管道传输到 main.sh 脚本的标准输入中。 -cgi 选项还允许设置不同的环境变量,例如包含有效负载长度的 $HTTP_CONTENT_LENGTH 变量(因此 JSON 包含我们要提取的不同参数并传递给进一步的行动)。

因此,以下是我们 main.sh 脚本的第一行:

read -n$HTTP_CONTENT_LENGTH PAYLOAD;

使用传入的 JSON 有效负载设置 PAYLOAD。

使用jq可以做任何我们想做的事。

所有代码都收集在此存储库中: https://github.com/cylldby/bash2run

此外,此解决方案用于 this project 以便有一个非常简单的解决方案来从 eventarc 触发器触发 Google 工作流。

再次感谢@guillaume_blaquiere 的提示!